diff --git a/BUILD.gn b/BUILD.gn index 82b4978..039ca177 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -853,7 +853,8 @@ if (enable_rust_mojo) { deps += [ "//mojo/public/rust", - "//mojo/public/rust:mojo_rust_tests", + "//mojo/public/rust:mojo_rust_integration_unittests", + "//mojo/public/rust:mojo_rust_unittests", ] }
diff --git a/DEPS b/DEPS index ffc9a30..7cd5e17 100644 --- a/DEPS +++ b/DEPS
@@ -309,19 +309,19 @@ # 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': '98ff7b9d34a89cae5d7083d7967f43c0e23071bc', + 'skia_revision': 'd5846fb1f236b9a115f0acd432daa3de18a64419', # 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': '2117f4dc7ad2af43c5c377b57fccef6c9c340dc6', + 'v8_revision': '685cd3e1e037753a4ebc4b8e8dcb9f8cb4f715ee', # 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': '459f0fad20342bc70bf47bb614b92058df3cd4a9', + 'angle_revision': 'fd0ced8b49a2d996b03e02504208be8dbc57b9df', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. - 'swiftshader_revision': '8ef6045b0a23ebc3cc8b08f89a728d1975538f86', + 'swiftshader_revision': '770571d91b69a1793b7f2036e197969df46ea5eb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -336,7 +336,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:12.20230412.0.1', + 'fuchsia_version': 'version:12.20230412.1.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -380,7 +380,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'f3dcf7aaad935a00f9d112d8df62ffd5f3b01cf7', + 'catapult_revision': 'c5af5d5bf547def27a6b44f119de028ccee76971', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -396,7 +396,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '26306da9622791b255b12c9c0deeac0a0d4a07b8', + 'devtools_frontend_revision': 'a6184b773b6cc2b1328777f296bbe0e5a61ddc67', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -436,7 +436,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '585f395e66bcda4e82dd11e1c676418b692f4341', + 'dawn_revision': '0b3fc055d3df8a2eb4a17cce2efda19f82316314', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -460,7 +460,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': 'bda3a779bdd567e5b889ceebffa86cdd8faec725', + 'nearby_revision': '28f7498580d586ccd0855deaf45057f0498cf5a3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -472,7 +472,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'cros_components_revision': '61602366591d223b749e3661c4658f0d3a870aee', + 'cros_components_revision': 'ea96a126b2f418f7e8d64b6dd9d4644f65dc96b6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -795,7 +795,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '1b0e9df50d37e6e060d14899e4e4beba802ad2cc', + 'a41372780a554c5343c56aa82224280d4688e77d', 'condition': 'checkout_android and checkout_src_internal', }, @@ -804,7 +804,7 @@ }, 'src/ios/third_party/earl_grey2/src': { - 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '24f6f1977323fe5950da55b4c156518b3c9b3184', + 'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '7c4f01d07d2cb8b4c7cb1c010a65a848452c54d9', 'condition': 'checkout_ios', }, @@ -824,7 +824,7 @@ }, 'src/ios/third_party/material_components_ios/src': { - 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '665d4977d0311922f8f499088bc4188215ff7d81', + 'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + '45dcfdfb001bcc653976179a2b727506564e6188', 'condition': 'checkout_ios', }, @@ -894,7 +894,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'GU_pBm5e8_TbLYiJAcXob_Hj4lIOt8vjLEBWJvVHNj8C', + 'version': 'uDGU2Ho9AnZfBoc805SH7xFdhWLLOPRhbxyF24AkdUAC', }, ], 'dep_type': 'cipd', @@ -905,7 +905,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'fggFpzkJLukM7PmxIA4JBfx3a6BI9vWfoK7AlQQACrYC', + 'version': 'mDjfc8yVzZMzhUvuI1FMQt8zWpwmr_iZSA0P2KjotRwC', }, ], 'dep_type': 'cipd', @@ -916,7 +916,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'TvlDrfXUleI_VRb7ddllv4Si9YeRxTTz3xicKdhjx5UC', + 'version': 'IhLVcXE4gfcVOfXHbRbharUD-8UZwImuHYQOoLcASS4C', }, ], 'dep_type': 'cipd', @@ -984,7 +984,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'bdEWEV0vOSzFiLi1A9KQWjsKCWhHgikrYAf6r0sUEG0C', + 'version': 'BQdOdR3FkMY93_ukKnPjihaAXycdYucQgngtlCJWxGkC', }, ], 'condition': 'checkout_android', @@ -1187,7 +1187,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd2108bc3d9068eb1d887b07304c91446e7cd9f53', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '9e7b29e1352dcdb45bf135a29ac5b16eb018a6a7', 'condition': 'checkout_chromeos', }, @@ -1219,13 +1219,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'a896d5a92c67c826de7cb0a0afc96111614e40fd', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '8d19d8641bd11d0bf796fc2e3b7f3d9f6898d5d2', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '41e7c41197a44e3d0b8c0629268dcbf465a1d06d', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '541fe2aea7ad36c962116946870c8eedd2ce6a9e', 'condition': 'checkout_src_internal', }, @@ -1544,7 +1544,7 @@ }, 'src/third_party/libvpx/source/libvpx': - Var('chromium_git') + '/webm/libvpx.git' + '@' + 'e47676c11cec52d242831414243ecd7a0e387dfb', + Var('chromium_git') + '/webm/libvpx.git' + '@' + 'cd2ec5c3dfe53e8ea389dbc32bd99a3201f7e7ec', 'src/third_party/libwebm/source': Var('chromium_git') + '/webm/libwebm.git' + '@' + 'e4fbea0c9751ae8aa86629b197a28d8276a2b0da', @@ -1700,7 +1700,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '0c4ca43ec32ebaf8cc50798557d958cc069dab35', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '75c6500b8dabe5344ac0255cb3d33182b4fd161f', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1740,7 +1740,7 @@ 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'ItqtrDm-XZNQVaHFUexhSZ_ziQ5Ukb_9gGMJKggWKnEC', + 'version': 'Qs7IdwPHgKR42jCzqTBPNEMjs0uPNpDXs29NfiBcsHIC', }, ], 'condition': 'checkout_android', @@ -1885,7 +1885,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '0ac5d460dab4d56f3c07c43eee895557c9d3b9e4', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'd5ebc335625ad2ce0a6e7b85485d5efb11fc551d', + Var('webrtc_git') + '/src.git' + '@' + '2a3942fec1b0fac8e70df55accb8115759f1dc84', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1975,7 +1975,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': Var('chrome_git') + '/chrome/src-internal.git@94f394af061ba2630836a293fde2045c77add8f6', + 'url': Var('chrome_git') + '/chrome/src-internal.git@49abfa4fb1fd2a4cb1246b779fc03dc85cd8a51a', 'condition': 'checkout_src_internal', }, @@ -2005,7 +2005,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'LAErT_-v7aSrs5j60HqXf552ir-K5xJs0KOHdKepY1QC', + 'version': 'OQ8TTfE9eVFq9aK45B6-vVJURPnY9bNoDKVV95dTfigC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2016,7 +2016,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'x6UtMFNuUgiNBvTtPs_TnEnM59FAmorjbsCWZEe_17oC', + 'version': 'tZ6xpb46Nvrf9SRtFBItPe2hnGhvPic5fASnC7Gdw7gC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2038,7 +2038,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': '6iiAy8NZb_bI3Bf1Y1Lg_P55ccmD4rEdhkTb-Qi1UqwC', + 'version': 'LSJdROoYvjCAa7yc7_bSSxLe-bUYcimevFNTq_maNEQC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -5132,6 +5132,17 @@ '--hook', ], }, + # Configure Siso + { + 'name': 'configure_siso', + 'pattern': '.', + 'condition': 'checkout_siso', + 'action': ['python3', + 'src/build/config/siso/configure_siso.py', + '--rbe_instance', + Var('rbe_instance'), + ], + }, ] # Add any corresponding DEPS files from this list to chromium.exclusions in
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java index d3f3b3d5..d1db0de 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumFactoryProvider.java
@@ -467,8 +467,6 @@ Set<String> actions = controller.queryActions(webViewPackageName); Log.w(TAG, "WebViewSafeMode is enabled: received %d SafeModeActions", actions.size()); - RecordHistogram.recordCount100Histogram( - "Android.WebView.SafeMode.ActionsCount", actions.size()); controller.executeActions(actions); long safeModeQueryExecuteEnd = SystemClock.elapsedRealtime(); RecordHistogram.recordTimesHistogram(
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java index 82228b94..d235f64 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
@@ -21,6 +21,7 @@ import org.chromium.android_webview.AwSettings; import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.TestThreadUtils; import java.util.Locale; @@ -89,6 +90,8 @@ private void invokeZoomPickerOnUiThread() { ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.invokeZoomPicker()); + // Zoom picker is updated asynchronously. + TestThreadUtils.flushNonDelayedLooperTasks(); } private void zoomInOnUiThreadAndWait() throws Throwable {
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index b0fbfa08..8e3df2b8 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1405,6 +1405,8 @@ "system/ime_menu/ime_list_view.h", "system/ime_menu/ime_menu_tray.cc", "system/ime_menu/ime_menu_tray.h", + "system/input_device_settings/input_device_key_alias_manager.cc", + "system/input_device_settings/input_device_key_alias_manager.h", "system/input_device_settings/input_device_notifier.cc", "system/input_device_settings/input_device_notifier.h", "system/input_device_settings/input_device_settings_controller_impl.cc", @@ -2590,6 +2592,7 @@ "//ash/style", "//ash/webui/diagnostics_ui/mojom:mojom", "//ash/webui/eche_app_ui:eche_connection_status", + "//ash/webui/eche_app_ui:system_info_provider", "//ash/webui/eche_app_ui/mojom:mojom", "//ash/webui/personalization_app/mojom", "//ash/webui/personalization_app/proto", @@ -3199,6 +3202,7 @@ "system/human_presence/snooping_protection_notification_blocker_unittest.cc", "system/ime/ime_feature_pod_controller_unittest.cc", "system/ime_menu/ime_menu_tray_unittest.cc", + "system/input_device_settings/input_device_key_alias_manager_unittest.cc", "system/input_device_settings/input_device_notifier_unittest.cc", "system/input_device_settings/input_device_settings_controller_unittest.cc", "system/input_device_settings/input_device_settings_dispatcher_unittest.cc",
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc index 7280f09..6bbd71b 100644 --- a/ash/ambient/ambient_controller.cc +++ b/ash/ambient/ambient_controller.cc
@@ -807,10 +807,6 @@ return; } DVLOG(1) << "Ambient mode enabled"; - // TODO(b/274165045): Remove this temporary way of circulating the video - // theme throughout the system once the hub supports the video theme. This - // is just for experimentation purposes until then. - SetUiSettingsForExperimentation(); AddAmbientModeUserSettingsPolicyPrefObservers(); @@ -1149,15 +1145,6 @@ return AmbientUiSettings::ReadFromPrefService(*GetPrimaryUserPrefService()); } -void AmbientController::SetUiSettingsForExperimentation() { - if (features::IsTimeOfDayScreenSaverEnabled()) { - CHECK(GetPrimaryUserPrefService()); - AmbientUiSettings(AmbientTheme::kVideo, - features::kTimeOfDayScreenSaverVideo.Get()) - .WriteToPrefService(*GetPrimaryUserPrefService()); - } -} - void AmbientController::MaybeDismissUIOnMouseMove() { // If the move was not an actual mouse move event or the screen saver widget // is not shown yet (images are not downloaded), don't dismiss.
diff --git a/ash/ambient/ambient_controller.h b/ash/ambient/ambient_controller.h index 394db33b..d438f12 100644 --- a/ash/ambient/ambient_controller.h +++ b/ash/ambient/ambient_controller.h
@@ -204,7 +204,6 @@ void MaybeStartScreenSaver(); void MaybeDismissUIOnMouseMove(); AmbientUiSettings GetCurrentUiSettings() const; - void SetUiSettingsForExperimentation(); // Invoked when the auto-show timer in |InactivityMonitor| gets fired after // device being inactive for a specific amount of time.
diff --git a/ash/app_list/views/app_list_view_pixeltest.cc b/ash/app_list/views/app_list_view_pixeltest.cc index 6aa46a4..a6b924593 100644 --- a/ash/app_list/views/app_list_view_pixeltest.cc +++ b/ash/app_list/views/app_list_view_pixeltest.cc
@@ -20,6 +20,7 @@ #include "ash/test/ash_test_base.h" #include "ash/test/pixel/ash_pixel_differ.h" #include "ash/test/pixel/ash_pixel_test_init_params.h" +#include "ash/test/view_drawn_waiter.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" @@ -272,8 +273,9 @@ event_generator->ClickLeftButton(); } - // Wait re-layout for adding IPH view. - base::RunLoop().RunUntilIdle(); + ASSERT_TRUE(search_box_view->iph_view()); + ViewDrawnWaiter view_drawn_waiter; + view_drawn_waiter.Wait(search_box_view->iph_view()); UseFixedPlaceholderTextAndHideCursor(search_box_view); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index e7f56ac..4b014b96 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -6402,14 +6402,20 @@ <message name="IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TITLE" desc="The title of dialog that appears when there is a connection error trying to stream app"> Can't stream apps </message> - <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT" desc="The main description in the dialog that appears when there is a connection error trying to stream app"> + <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_UNSUPPORTED_NETWORK_TEXT" desc="The main description in the dialog that appears when devices are on unsupported network"> This network doesn't support streaming apps from your phone. Try using your phone's hotspot. <ph name="LEARN_MORE">$1<ex>Learn more</ex></ph> </message> + <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DIFFERENT_NETWORK_TEXT" desc="The main description in the dialog that appears when devices are on different networks"> + Make sure your phone and Chromebook are on the same network and then try again. <ph name="LEARN_MORE">$1<ex>Learn more</ex></ph> + </message> + <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_PHONE_ON_CELLULAR_TEXT" desc="The main description in the dialog that appears when phone is on cellular"> + Your phone is using a mobile network. Make Sure your phone and Chromebook are on the same Wi-Fi network and then try again. <ph name="LEARN_MORE">$1<ex>Learn more</ex></ph> + </message> <message name="IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TURN_ON_HOTSPOT" desc="The button in the dialog that appears when there is a connection error trying to stream app to turn on hotspot"> Turn on hotspot </message> - <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT" desc="Confirm button on the connection error dialog to acknowledge."> - Ok + <message name="IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT" desc="The text on the button to dismiss dialog"> + Dismiss </message> <!-- Deferred update dialog -->
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DIFFERENT_NETWORK_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DIFFERENT_NETWORK_TEXT.png.sha1 new file mode 100644 index 0000000..b8fa483 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DIFFERENT_NETWORK_TEXT.png.sha1
@@ -0,0 +1 @@ +133d285331d6c36c7ca8ae5546bb3c38a4e8a53d \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT.png.sha1 new file mode 100644 index 0000000..27fbde20 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT.png.sha1
@@ -0,0 +1 @@ +750187313937e14b97706d785a64f33205306bf6 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1 deleted file mode 100644 index 518a9357..0000000 --- a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -fc6d2fc17ebc565b4dc3025fa68ad7335a79a9a0 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1 deleted file mode 100644 index 518a9357..0000000 --- a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_OK_TEXT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -fc6d2fc17ebc565b4dc3025fa68ad7335a79a9a0 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_PHONE_ON_CELLULAR_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_PHONE_ON_CELLULAR_TEXT.png.sha1 new file mode 100644 index 0000000..a5d57f5 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_PHONE_ON_CELLULAR_TEXT.png.sha1
@@ -0,0 +1 @@ +c84378105fca12f57c7efce90e3b7cb3f130e13b \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_UNSUPPORTED_NETWORK_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_UNSUPPORTED_NETWORK_TEXT.png.sha1 new file mode 100644 index 0000000..930175f --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_UNSUPPORTED_NETWORK_TEXT.png.sha1
@@ -0,0 +1 @@ +0657225691d6720605b25657e4ef96b4594715e8 \ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_util.cc b/ash/capture_mode/capture_mode_util.cc index b3408549..7d39b897b2 100644 --- a/ash/capture_mode/capture_mode_util.cc +++ b/ash/capture_mode/capture_mode_util.cc
@@ -321,14 +321,9 @@ chromeos::features::IsJellyEnabled() ? cros_tokens::kCrosSysPrimary : static_cast<ui::ColorId>(kColorAshControlBackgroundColorActive); - if (features::IsNotificationsRefreshEnabled()) { - banner_view->SetBackground(views::CreateThemedRoundedRectBackground( - background_color_id, kBannerViewTopRadius, kBannerViewBottomRadius, - /*for_border_thickness=*/0)); - } else { - banner_view->SetBackground( - views::CreateThemedSolidBackground(background_color_id)); - } + banner_view->SetBackground(views::CreateThemedRoundedRectBackground( + background_color_id, kBannerViewTopRadius, kBannerViewBottomRadius, + /*for_border_thickness=*/0)); views::ImageView* icon = banner_view->AddChildView(std::make_unique<views::ImageView>());
diff --git a/ash/components/arc/bluetooth/bluetooth_type_converters.cc b/ash/components/arc/bluetooth/bluetooth_type_converters.cc index d435e1f2..b6c94e3a 100644 --- a/ash/components/arc/bluetooth/bluetooth_type_converters.cc +++ b/ash/components/arc/bluetooth/bluetooth_type_converters.cc
@@ -13,6 +13,7 @@ #include "ash/components/arc/bluetooth/bluetooth_type_converters.h" #include "base/json/json_reader.h" #include "base/json/json_writer.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "device/bluetooth/bluetooth_device.h" #include "device/bluetooth/bluetooth_gatt_service.h" @@ -218,4 +219,754 @@ return record_bluez; } +// Floss BtSdpRecord conversions adapted from +// aosp/packages/modules/Bluetooth/system/bta/sdp/bta_sdp_act.cc + +// static +floss::BtSdpHeaderOverlay +TypeConverter<floss::BtSdpHeaderOverlay, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpHeaderOverlay record_overlay{}; + // Set some default values that will be updated if bluez_record actually + // contains relevant data. + // The caller may change this type but for now assume this is generic record. + record_overlay.sdp_type = floss::BtSdpType::kRaw; + record_overlay.service_name_length = 0; + record_overlay.service_name = ""; + record_overlay.rfcomm_channel_number = 0; + record_overlay.l2cap_psm = -1; + record_overlay.profile_version = 0; + + if (bluez_record.IsAttributePresented(ATTR_ID_SERVICE_NAME)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SERVICE_NAME); + const std::string* service_name = attribute.value().GetIfString(); + if (service_name) { + record_overlay.service_name = *service_name; + record_overlay.service_name_length = attribute.size(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_SERVICE_CLASS_ID_LIST)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SERVICE_CLASS_ID_LIST); + for (const auto& serv_id : attribute.sequence()) { + const std::string* uuid = serv_id.value().GetIfString(); + if (uuid) { + record_overlay.uuid = device::BluetoothUUID(*uuid); + break; + } + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_PROTOCOL_DESC_LIST)) { + const bluez::BluetoothServiceAttributeValueBlueZ maybe_protocol_list = + bluez_record.GetAttributeValue(ATTR_ID_PROTOCOL_DESC_LIST); + if (maybe_protocol_list.type() == + bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE) { + auto protocol_list = maybe_protocol_list.sequence(); + for (auto protocol_record : protocol_list) { + if (protocol_record.type() != + bluez::BluetoothServiceAttributeValueBlueZ::SEQUENCE) { + continue; + } + auto protocol_record_sequence = protocol_record.sequence(); + // We expect at least two values: the UUID itself and the channel number + if (protocol_record_sequence.size() < 2) { + continue; + } + const std::string* uuid = + protocol_record_sequence[0].value().GetIfString(); + int uuid_actual; + if (!base::StringToInt(*uuid, &uuid_actual)) { + break; + } + if (uuid_actual != UUID_PROTOCOL_RFCOMM) { + continue; + } + absl::optional<int> channel_number = + protocol_record_sequence[1].value().GetIfInt(); + if (!channel_number) { + continue; + } + record_overlay.rfcomm_channel_number = *channel_number; + } + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_GOEP_L2CAP_PSM)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_GOEP_L2CAP_PSM); + absl::optional<int> l2cap_psm = attribute.value().GetIfInt(); + if (l2cap_psm) { + record_overlay.l2cap_psm = l2cap_psm.value(); + } + } + + return record_overlay; +} + +namespace { + +// Following Core Specification V 5.3 | Vol 3, Part B +// Section 5.1.11 BluetoothProfileDescriptorList attribute +absl::optional<int> GetProfileVersionFromBlueZRecord( + const bluez::BluetoothServiceRecordBlueZ& bluez_record, + const uint16_t profile_uuid) { + if (!bluez_record.IsAttributePresented(ATTR_ID_BT_PROFILE_DESC_LIST)) { + return absl::nullopt; + } + if (!bluez_record.GetAttributeValue(ATTR_ID_BT_PROFILE_DESC_LIST) + .is_sequence()) { + return absl::nullopt; + } + const auto profile_list = + bluez_record.GetAttributeValue(ATTR_ID_BT_PROFILE_DESC_LIST).sequence(); + for (const auto& profile : profile_list) { + if (!profile.is_sequence()) { + continue; + } + const auto profile_descriptor = profile.sequence(); + if (profile_descriptor.size() < 2) { + continue; + } + if (profile_descriptor[0].type() != + bluez::BluetoothServiceAttributeValueBlueZ::UUID) { + continue; + } + if (profile_descriptor[0].value().GetInt() != profile_uuid) { + continue; + } + if (profile_descriptor[1].type() != + bluez::BluetoothServiceAttributeValueBlueZ::UINT) { + continue; + } + return profile_descriptor[1].value().GetIfInt(); + } + return absl::nullopt; +} + +bluez::BluetoothServiceAttributeValueBlueZ MakeDescListForBlueZRecord( + const uint16_t profile_or_protocol_uuid, + const int version) { + std::string maybe_short_uuid = base::NumberToString(profile_or_protocol_uuid); + // L2CAP and RFCOMM ports/channels will not exceed 0x7FFF, but must be 4 hex + // digits long for BluetoothUUID class to accept them. + maybe_short_uuid.insert(maybe_short_uuid.begin(), + 4 - maybe_short_uuid.length(), '0'); + const std::string full_uuid = + device::BluetoothUUID(maybe_short_uuid).canonical_value(); + auto desc_list = + std::make_unique<bluez::BluetoothServiceAttributeValueBlueZ::Sequence>(); + auto sequence = + std::make_unique<bluez::BluetoothServiceAttributeValueBlueZ::Sequence>(); + sequence->emplace_back(bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UUID, full_uuid.size(), + absl::optional<base::Value>(full_uuid))); + sequence->emplace_back(bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, sizeof(version), + absl::optional<base::Value>(version))); + desc_list->emplace_back( + bluez::BluetoothServiceAttributeValueBlueZ(std::move(sequence))); + return bluez::BluetoothServiceAttributeValueBlueZ(std::move(desc_list)); +} + +} // namespace + +// static +floss::BtSdpMasRecord +TypeConverter<floss::BtSdpMasRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpMasRecord mas_record{}; + mas_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + mas_record.hdr.sdp_type = floss::BtSdpType::kMapMas; + mas_record.mas_instance_id = 0; + mas_record.supported_features = 0x0000001F; + mas_record.supported_message_types = 0; + + if (bluez_record.IsAttributePresented(ATTR_ID_MAS_INSTANCE_ID)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_MAS_INSTANCE_ID); + absl::optional<int> mas_instance_id = attribute.value().GetIfInt(); + if (mas_instance_id) { + mas_record.mas_instance_id = mas_instance_id.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_SUPPORTED_MSG_TYPE)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SUPPORTED_MSG_TYPE); + absl::optional<int> supported_message_types = attribute.value().GetIfInt(); + if (supported_message_types) { + mas_record.supported_message_types = supported_message_types.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_MAP_SUPPORTED_FEATURES)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_MAP_SUPPORTED_FEATURES); + absl::optional<int> supported_features = attribute.value().GetIfInt(); + if (supported_features) { + mas_record.supported_features = supported_features.value(); + } + } + + const absl::optional<int> profile_version = GetProfileVersionFromBlueZRecord( + bluez_record, UUID_SERVCLASS_MAP_PROFILE); + if (profile_version.has_value()) { + mas_record.hdr.profile_version = *profile_version; + } + + return mas_record; +} + +// static +floss::BtSdpMnsRecord +TypeConverter<floss::BtSdpMnsRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpMnsRecord mns_record{}; + mns_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + mns_record.hdr.sdp_type = floss::BtSdpType::kMapMns; + mns_record.supported_features = 0x0000001F; + + if (bluez_record.IsAttributePresented(ATTR_ID_MAP_SUPPORTED_FEATURES)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_MAP_SUPPORTED_FEATURES); + absl::optional<int> supported_features = attribute.value().GetIfInt(); + if (supported_features) { + mns_record.supported_features = supported_features.value(); + } + } + + const absl::optional<int> profile_version = GetProfileVersionFromBlueZRecord( + bluez_record, UUID_SERVCLASS_MAP_PROFILE); + if (profile_version.has_value()) { + mns_record.hdr.profile_version = *profile_version; + } + + return mns_record; +} + +// static +floss::BtSdpPseRecord +TypeConverter<floss::BtSdpPseRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpPseRecord pse_record{}; + pse_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + ; + pse_record.hdr.sdp_type = floss::BtSdpType::kPbapPse; + pse_record.supported_features = 0x00000003; + pse_record.supported_repositories = 0; + + if (bluez_record.IsAttributePresented(ATTR_ID_SUPPORTED_REPOSITORIES)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SUPPORTED_REPOSITORIES); + absl::optional<int> supported_repositories = attribute.value().GetIfInt(); + if (supported_repositories) { + pse_record.supported_repositories = supported_repositories.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_SUPPORTED_FEATURES)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SUPPORTED_FEATURES); + absl::optional<int> supported_features = attribute.value().GetIfInt(); + if (supported_features) { + pse_record.supported_features = supported_features.value(); + } + } + + const absl::optional<int> profile_version = GetProfileVersionFromBlueZRecord( + bluez_record, UUID_SERVCLASS_PHONE_ACCESS); + if (profile_version.has_value()) { + pse_record.hdr.profile_version = *profile_version; + } + + return pse_record; +} + +// static +floss::BtSdpPceRecord +TypeConverter<floss::BtSdpPceRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpPceRecord pce_record{}; + pce_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + pce_record.hdr.sdp_type = floss::BtSdpType::kPbapPce; + + const absl::optional<int> profile_version = GetProfileVersionFromBlueZRecord( + bluez_record, UUID_SERVCLASS_PHONE_ACCESS); + if (profile_version.has_value()) { + pce_record.hdr.profile_version = *profile_version; + } + + return pce_record; +} + +// static +floss::BtSdpOpsRecord +TypeConverter<floss::BtSdpOpsRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpOpsRecord ops_record{}; + ops_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + ops_record.hdr.sdp_type = floss::BtSdpType::kOppServer; + + const absl::optional<int> profile_version = GetProfileVersionFromBlueZRecord( + bluez_record, UUID_SERVCLASS_OBEX_OBJECT_PUSH); + if (profile_version.has_value()) { + ops_record.hdr.profile_version = *profile_version; + } + + // TODO(b/277105543): Determine the correct structure for + // supported_formats_list and implement conversion. + + return ops_record; +} + +// static +floss::BtSdpSapRecord +TypeConverter<floss::BtSdpSapRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpSapRecord sap_record{}; + sap_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + sap_record.hdr.sdp_type = floss::BtSdpType::kSapServer; + + const absl::optional<int> profile_version = + GetProfileVersionFromBlueZRecord(bluez_record, UUID_SERVCLASS_SAP); + if (profile_version.has_value()) { + sap_record.hdr.profile_version = *profile_version; + } + + return sap_record; +} + +// static +floss::BtSdpDipRecord +TypeConverter<floss::BtSdpDipRecord, bluez::BluetoothServiceRecordBlueZ>:: + Convert(const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + floss::BtSdpDipRecord dip_record{}; + dip_record.hdr = + TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + dip_record.hdr.sdp_type = floss::BtSdpType::kDip; + dip_record.spec_id = 0; + dip_record.vendor = 0; + dip_record.vendor_id_source = 0; + dip_record.product = 0; + dip_record.version = 0; + dip_record.primary_record = false; + + if (bluez_record.IsAttributePresented(ATTR_ID_SPECIFICATION_ID)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_SPECIFICATION_ID); + absl::optional<int> spec_id = attribute.value().GetIfInt(); + if (spec_id) { + dip_record.spec_id = spec_id.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_VENDOR_ID)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_VENDOR_ID); + absl::optional<int> vendor = attribute.value().GetIfInt(); + if (vendor) { + dip_record.vendor = vendor.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_VENDOR_ID_SOURCE)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_VENDOR_ID_SOURCE); + absl::optional<int> vendor_id_source = attribute.value().GetIfInt(); + if (vendor_id_source) { + dip_record.vendor_id_source = vendor_id_source.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_PRODUCT_ID)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_PRODUCT_ID); + absl::optional<int> product = attribute.value().GetIfInt(); + if (product) { + dip_record.product = product.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_PRODUCT_VERSION)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_PRODUCT_VERSION); + absl::optional<int> version = attribute.value().GetIfInt(); + if (version) { + dip_record.version = version.value(); + } + } + + if (bluez_record.IsAttributePresented(ATTR_ID_PRIMARY_RECORD)) { + const bluez::BluetoothServiceAttributeValueBlueZ attribute = + bluez_record.GetAttributeValue(ATTR_ID_PRIMARY_RECORD); + absl::optional<bool> primary_record = attribute.value().GetIfBool(); + if (primary_record) { + dip_record.primary_record = primary_record.value(); + } + } + + return dip_record; +} + +// static +floss::BtSdpRecord +TypeConverter<floss::BtSdpRecord, bluez::BluetoothServiceRecordBlueZ>::Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record) { + if (!bluez_record.IsAttributePresented(ATTR_ID_SERVICE_ID)) { + return TypeConverter< + floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + } + absl::optional<int> service_id = + bluez_record.GetAttributeValue(ATTR_ID_SERVICE_ID).value().GetIfInt(); + if (!service_id.has_value()) { + return floss::BtSdpRecord(); + } + switch (*service_id) { + case UUID_MAP_MAS: + return TypeConverter< + floss::BtSdpMasRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_MAP_MNS: + return TypeConverter< + floss::BtSdpMnsRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_PBAP_PSE: + return TypeConverter< + floss::BtSdpPseRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_PBAP_PCE: + return TypeConverter< + floss::BtSdpPceRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_SPP: + return TypeConverter< + floss::BtSdpOpsRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_SAP: + return TypeConverter< + floss::BtSdpSapRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + case UUID_DIP: + return TypeConverter< + floss::BtSdpDipRecord, + bluez::BluetoothServiceRecordBlueZ>::Convert(bluez_record); + default: + return floss::BtSdpRecord(); + } +} + +// static +bluez::BluetoothServiceRecordBlueZ +TypeConverter<bluez::BluetoothServiceRecordBlueZ, floss::BtSdpHeaderOverlay>:: + Convert(const floss::BtSdpHeaderOverlay& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record; + + bluez_record.AddRecordEntry( + ATTR_ID_SERVICE_NAME, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::STRING, + record.service_name_length, + absl::optional<base::Value>(record.service_name))); + + auto seq = + std::make_unique<bluez::BluetoothServiceAttributeValueBlueZ::Sequence>(); + seq->emplace_back(bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UUID, + record.uuid.canonical_value().length(), + absl::optional<base::Value>(record.uuid.canonical_value()))); + bluez_record.AddRecordEntry( + ATTR_ID_SERVICE_CLASS_ID_LIST, + bluez::BluetoothServiceAttributeValueBlueZ(std::move(seq))); + + if (record.rfcomm_channel_number > 0) { + bluez_record.AddRecordEntry( + ATTR_ID_PROTOCOL_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord( + UUID_PROTOCOL_RFCOMM, record.rfcomm_channel_number)))); + } + + if (record.l2cap_psm > -1) { + bluez_record.AddRecordEntry( + ATTR_ID_GOEP_L2CAP_PSM, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.l2cap_psm), + absl::optional<base::Value>(record.l2cap_psm))); + + bluez_record.AddRecordEntry( + ATTR_ID_PROTOCOL_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord( + UUID_PROTOCOL_L2CAP, record.rfcomm_channel_number)))); + } + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMasRecord>::Convert(const floss::BtSdpMasRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_MAP_PROFILE, + record.hdr.profile_version)))); + + bluez_record.AddRecordEntry( + ATTR_ID_MAS_INSTANCE_ID, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.mas_instance_id), + absl::optional<base::Value>( + static_cast<int>(record.mas_instance_id)))); + + bluez_record.AddRecordEntry( + ATTR_ID_SUPPORTED_MSG_TYPE, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.supported_message_types), + absl::optional<base::Value>( + static_cast<int>(record.supported_message_types)))); + + bluez_record.AddRecordEntry( + ATTR_ID_SUPPORTED_FEATURES, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.supported_features), + absl::optional<base::Value>( + static_cast<int>(record.supported_features)))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMnsRecord>::Convert(const floss::BtSdpMnsRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_MAP_PROFILE, + record.hdr.profile_version)))); + + bluez_record.AddRecordEntry( + ATTR_ID_SUPPORTED_FEATURES, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.supported_features), + absl::optional<base::Value>( + static_cast<int>(record.supported_features)))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPseRecord>::Convert(const floss::BtSdpPseRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_PHONE_ACCESS, + record.hdr.profile_version)))); + + bluez_record.AddRecordEntry( + ATTR_ID_SUPPORTED_REPOSITORIES, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.supported_repositories), + absl::optional<base::Value>( + static_cast<int>(record.supported_repositories)))); + + bluez_record.AddRecordEntry( + ATTR_ID_SUPPORTED_FEATURES, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.supported_features), + absl::optional<base::Value>( + static_cast<int>(record.supported_features)))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPceRecord>::Convert(const floss::BtSdpPceRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_PHONE_ACCESS, + record.hdr.profile_version)))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpOpsRecord>::Convert(const floss::BtSdpOpsRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_OBEX_OBJECT_PUSH, + record.hdr.profile_version)))); + + // TODO: supported_formats + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpSapRecord>::Convert(const floss::BtSdpSapRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + + bluez_record.AddRecordEntry( + ATTR_ID_BT_PROFILE_DESC_LIST, + bluez::BluetoothServiceAttributeValueBlueZ( + std::move(MakeDescListForBlueZRecord(UUID_SERVCLASS_SAP, + record.hdr.profile_version)))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ TypeConverter< + bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpDipRecord>::Convert(const floss::BtSdpDipRecord& record) { + bluez::BluetoothServiceRecordBlueZ bluez_record = + TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>::Convert(record.hdr); + // The following static_cast<int>() calls are being invoked on uint16_t fields + // which can safely convert to int. + bluez_record.AddRecordEntry( + ATTR_ID_SPECIFICATION_ID, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.spec_id), + absl::optional<base::Value>(static_cast<int>(record.spec_id)))); + + bluez_record.AddRecordEntry( + ATTR_ID_VENDOR_ID, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.vendor), + absl::optional<base::Value>(static_cast<int>(record.vendor)))); + + bluez_record.AddRecordEntry( + ATTR_ID_VENDOR_ID_SOURCE, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.vendor_id_source), + absl::optional<base::Value>( + static_cast<int>(record.vendor_id_source)))); + + bluez_record.AddRecordEntry( + ATTR_ID_PRODUCT_ID, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.product), + absl::optional<base::Value>(static_cast<int>(record.product)))); + + bluez_record.AddRecordEntry( + ATTR_ID_PRODUCT_VERSION, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::UINT, + sizeof(record.version), + absl::optional<base::Value>(static_cast<int>(record.version)))); + + bluez_record.AddRecordEntry( + ATTR_ID_PRIMARY_RECORD, + bluez::BluetoothServiceAttributeValueBlueZ( + bluez::BluetoothServiceAttributeValueBlueZ::BOOL, + sizeof(record.primary_record), + absl::optional<base::Value>(record.primary_record))); + + return bluez_record; +} + +// static +bluez::BluetoothServiceRecordBlueZ +TypeConverter<bluez::BluetoothServiceRecordBlueZ, floss::BtSdpRecord>::Convert( + const floss::BtSdpRecord& record) { + if (absl::holds_alternative<floss::BtSdpHeaderOverlay>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay>:: + Convert(absl::get<floss::BtSdpHeaderOverlay>(record)); + } else if (absl::holds_alternative<floss::BtSdpMasRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMasRecord>:: + Convert(absl::get<floss::BtSdpMasRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpMnsRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMnsRecord>:: + Convert(absl::get<floss::BtSdpMnsRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpPseRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPseRecord>:: + Convert(absl::get<floss::BtSdpPseRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpPceRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPceRecord>:: + Convert(absl::get<floss::BtSdpPceRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpOpsRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpOpsRecord>:: + Convert(absl::get<floss::BtSdpOpsRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpSapRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpSapRecord>:: + Convert(absl::get<floss::BtSdpSapRecord>(record)); + } else if (absl::holds_alternative<floss::BtSdpDipRecord>(record)) { + return TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpDipRecord>:: + Convert(absl::get<floss::BtSdpDipRecord>(record)); + } else { + return bluez::BluetoothServiceRecordBlueZ(); + } +} + } // namespace mojo
diff --git a/ash/components/arc/bluetooth/bluetooth_type_converters.h b/ash/components/arc/bluetooth/bluetooth_type_converters.h index 373265b6..78d91d15 100644 --- a/ash/components/arc/bluetooth/bluetooth_type_converters.h +++ b/ash/components/arc/bluetooth/bluetooth_type_converters.h
@@ -15,6 +15,7 @@ #include "device/bluetooth/bluetooth_gatt_service.h" #include "device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h" #include "device/bluetooth/bluez/bluetooth_service_record_bluez.h" +#include "device/bluetooth/floss/floss_sdp_types.h" #include "mojo/public/cpp/bindings/type_converter.h" namespace arc { @@ -31,6 +32,58 @@ namespace mojo { +static const uint16_t ATTR_ID_SERVICE_NAME = 0x0100; +static const uint16_t ATTR_ID_SERVICE_CLASS_ID_LIST = 0x0001; +static const uint16_t ATTR_ID_SERVICE_ID = 0x0003; +static const uint16_t ATTR_ID_PROTOCOL_DESC_LIST = 0x0004; +static const uint16_t ATTR_ID_BT_PROFILE_DESC_LIST = 0x0009; +static const uint16_t ATTR_ID_SERVICE_DESCRIPTION = 0x0101; + +/* Device Identification (DI) + */ +static const uint16_t ATTR_ID_SPECIFICATION_ID = 0x0200; +static const uint16_t ATTR_ID_VENDOR_ID = 0x0201; +static const uint16_t ATTR_ID_PRODUCT_ID = 0x0202; +static const uint16_t ATTR_ID_PRODUCT_VERSION = 0x0203; +static const uint16_t ATTR_ID_PRIMARY_RECORD = 0x0204; +static const uint16_t ATTR_ID_VENDOR_ID_SOURCE = 0x0205; + +static const uint16_t ATTR_ID_SUPPORTED_FORMATS_LIST = 0x0303; +static const uint16_t ATTR_ID_SUPPORTED_FEATURES = 0x0311; /* HFP, BIP */ +static const uint16_t ATTR_ID_SUPPORTED_REPOSITORIES = + 0x0314; /* Phone book access Profile */ +static const uint16_t ATTR_ID_MAS_INSTANCE_ID = 0x0315; /* MAP profile */ +static const uint16_t ATTR_ID_SUPPORTED_MSG_TYPE = 0x0316; /* MAP profile */ +static const uint16_t ATTR_ID_MAP_SUPPORTED_FEATURES = 0x0317; /* MAP profile */ +static const uint16_t ATTR_ID_PBAP_SUPPORTED_FEATURES = + 0x0317; /* PBAP profile */ + +static const uint16_t ATTR_ID_GOEP_L2CAP_PSM = 0x0200; + +static const uint16_t UUID_PBAP_PCE = 0x112E; +static const uint16_t UUID_PBAP_PSE = 0x112F; +static const uint16_t UUID_MAP_MAS = 0x1132; +static const uint16_t UUID_SAP = 0x112D; +static const uint16_t UUID_SPP = 0x1101; +static const uint16_t UUID_DIP = 0x1200; +static const uint16_t UUID_MAP_MNS = 0x1133; + +/* Define common 16-bit protocol UUIDs + */ +static const uint16_t UUID_PROTOCOL_RFCOMM = 0x0003; +static const uint16_t UUID_PROTOCOL_OBEX = 0x0008; +static const uint16_t UUID_PROTOCOL_BNEP = 0x000F; +static const uint16_t UUID_PROTOCOL_HIDP = 0x0011; +static const uint16_t UUID_PROTOCOL_AVCTP = 0x0017; +static const uint16_t UUID_PROTOCOL_AVDTP = 0x0019; +static const uint16_t UUID_PROTOCOL_L2CAP = 0x0100; +static const uint16_t UUID_PROTOCOL_ATT = 0x0007; + +static const uint16_t UUID_SERVCLASS_MAP_PROFILE = 0x1134; /* MAP profile */ +static const uint16_t UUID_SERVCLASS_PHONE_ACCESS = 0x1130; +static const uint16_t UUID_SERVCLASS_OBEX_OBJECT_PUSH = 0x1105; +static const uint16_t UUID_SERVCLASS_SAP = 0x112D; /* SIM Access profile */ + template <> struct TypeConverter<arc::mojom::BluetoothAddressPtr, std::string> { static arc::mojom::BluetoothAddressPtr Convert(const std::string& address); @@ -89,6 +142,130 @@ const arc::mojom::BluetoothSdpRecordPtr& rcd); }; +template <> +struct TypeConverter<floss::BtSdpHeaderOverlay, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpHeaderOverlay Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpMasRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpMasRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpMnsRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpMnsRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpPseRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpPseRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpPceRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpPceRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpOpsRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpOpsRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpSapRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpSapRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpDipRecord, + bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpDipRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<floss::BtSdpRecord, bluez::BluetoothServiceRecordBlueZ> { + static floss::BtSdpRecord Convert( + const bluez::BluetoothServiceRecordBlueZ& bluez_record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpHeaderOverlay> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpHeaderOverlay& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMasRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpMasRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpMnsRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpMnsRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPseRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpPseRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpPceRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpPceRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpOpsRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpOpsRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpSapRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpSapRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, + floss::BtSdpDipRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpDipRecord& record); +}; + +template <> +struct TypeConverter<bluez::BluetoothServiceRecordBlueZ, floss::BtSdpRecord> { + static bluez::BluetoothServiceRecordBlueZ Convert( + const floss::BtSdpRecord& record); +}; + } // namespace mojo #endif // ASH_COMPONENTS_ARC_BLUETOOTH_BLUETOOTH_TYPE_CONVERTERS_H_
diff --git a/ash/components/arc/video_accelerator/gpu_arc_video_decoder.cc b/ash/components/arc/video_accelerator/gpu_arc_video_decoder.cc index 7dd4b1e0..53fda03 100644 --- a/ash/components/arc/video_accelerator/gpu_arc_video_decoder.cc +++ b/ash/components/arc/video_accelerator/gpu_arc_video_decoder.cc
@@ -27,7 +27,6 @@ #include "media/base/video_types.h" #include "media/gpu/buffer_validation.h" #include "media/gpu/chromeos/video_decoder_pipeline.h" -#include "media/gpu/chromeos/video_frame_converter.h" #include "media/gpu/macros.h" namespace arc { @@ -109,7 +108,7 @@ gpu::GpuDriverBugWorkarounds(), client_task_runner_, std::make_unique<media::VdaVideoFramePool>(video_frame_pool_->WeakThis(), client_task_runner_), - std::make_unique<media::VideoFrameConverter>(), + /*frame_converter=*/nullptr, media::VideoDecoderPipeline::DefaultPreferredRenderableFourccs(), std::make_unique<media::NullMediaLog>(), /*oop_video_decoder=*/{});
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 968c67f..bafa81f 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -2111,17 +2111,6 @@ "FeatureManagementTimeOfDayScreenSaver", base::FEATURE_DISABLED_BY_DEFAULT); -const base::FeatureParam<AmbientVideo>::Option - kTimeOfDayScreenSaverVideoOptions[] = { - {AmbientVideo::kNewMexico, "new_mexico"}, - {AmbientVideo::kClouds, "clouds"}}; - -// When |kTimeOfDayScreenSaver| is enabled, specifies which video theme to load. -// If |kTimeOfDayScreenSaver| is disabled, this is unused. -const base::FeatureParam<AmbientVideo> kTimeOfDayScreenSaverVideo{ - &kTimeOfDayScreenSaver, "FeatureManagementTimeOfDayScreenSaverVideo", - AmbientVideo::kNewMexico, &kTimeOfDayScreenSaverVideoOptions}; - // Enables time of day wallpaper. BASE_FEATURE(kTimeOfDayWallpaper, "FeatureManagementTimeOfDayWallpaper",
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index e3c799b..6178851b2 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -5,7 +5,6 @@ #ifndef ASH_CONSTANTS_ASH_FEATURES_H_ #define ASH_CONSTANTS_ASH_FEATURES_H_ -#include "ash/constants/ambient_video.h" #include "base/component_export.h" #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" @@ -605,8 +604,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTerminalSftp); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTerminalTmuxIntegration); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTimeOfDayScreenSaver); -COMPONENT_EXPORT(ASH_CONSTANTS) -extern const base::FeatureParam<AmbientVideo> kTimeOfDayScreenSaverVideo; COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTimeOfDayWallpaper); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTrafficCountersEnabled); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kTrilinearFiltering);
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc index 17762e6..7d06f84 100644 --- a/ash/constants/ash_switches.cc +++ b/ash/constants/ash_switches.cc
@@ -660,6 +660,10 @@ // /usr/local/vms/etc/arcvm_dev.conf will be ignored during ARCVM start. const char kIgnoreArcVmDevConf[] = "ignore-arcvm-dev-conf"; +// If true, chrome would silently ignore unknown auth factor types +// instead of crashing. +const char kIgnoreUnknownAuthFactors[] = "ignore-unknown-auth-factors"; + // If true, profile selection in UserManager will always return active user's // profile. // TODO(nkostlyev): http://crbug.com/364604 - Get rid of this switch after we
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h index 5289bc7..62a9821f 100644 --- a/ash/constants/ash_switches.h +++ b/ash/constants/ash_switches.h
@@ -217,6 +217,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kHasNumberPad[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kHomedir[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kIgnoreArcVmDevConf[]; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kIgnoreUnknownAuthFactors[]; COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kIgnoreUserProfileMappingForTests[]; COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/constants/notifier_catalogs.h b/ash/constants/notifier_catalogs.h index e06e5b0c1..9292e4e 100644 --- a/ash/constants/notifier_catalogs.h +++ b/ash/constants/notifier_catalogs.h
@@ -183,7 +183,8 @@ kEOLIncentive = 168, kHotspot = 169, kGeolocationSwitch = 170, - kMaxValue = kGeolocationSwitch + kMultiCaptureOnLogin = 171, + kMaxValue = kMultiCaptureOnLogin }; // A living catalog that registers system nudges.
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc index 4afaf25..14c2a32 100644 --- a/ash/display/display_manager_unittest.cc +++ b/ash/display/display_manager_unittest.cc
@@ -3753,47 +3753,6 @@ EXPECT_EQ(1.6f, display_info.display_modes()[0].device_scale_factor()); } -// TODO(crbug/1262970): Delete when we can read radius from command line. -TEST_F(DisplayManagerTest, SettingDefaultRoundedCornersOnInternalDisplay) { - scoped_feature_list().InitAndEnableFeature( - display::features::kRoundedDisplay); - - Shell* shell = Shell::Get(); - display::DisplayChangeObserver observer(shell->display_manager()); - - const std::unique_ptr<display::DisplaySnapshot> internal_snapshot = - display::FakeDisplaySnapshot::Builder() - .SetId(123) - .SetName("AmazingFakeRoundedDisplay") - .SetNativeMode(MakeDisplayMode()) - .SetType( - display::DisplayConnectionType::DISPLAY_CONNECTION_TYPE_INTERNAL) - .Build(); - - internal_snapshot->set_current_mode(internal_snapshot->native_mode()); - - display::DisplayConfigurator::DisplayStateList outputs; - outputs.push_back(internal_snapshot.get()); - - // Update the display manager through DisplayChangeObserver. - observer.OnDisplayModeChanged(outputs); - - display::Display primary_display = - display::Screen::GetScreen()->GetPrimaryDisplay(); - - WindowTreeHostManager* window_manager = - Shell::Get()->window_tree_host_manager(); - - auto* primary_display_provider = - window_manager->GetRoundedDisplayProvider(primary_display.id()); - - ash::RoundedDisplayProviderTestApi primary_display_provider_test( - primary_display_provider); - - EXPECT_EQ(gfx::RoundedCornersF(16.0), - primary_display_provider_test.GetCurrentPanelRadii()); -} - TEST_F(DisplayManagerTest, UpdateInternalDisplayNativeBounds) { constexpr int64_t external_id = 123; const int64_t internal_id =
diff --git a/ash/public/cpp/holding_space/holding_space_controller.cc b/ash/public/cpp/holding_space/holding_space_controller.cc index cb935a4..254a1ae1 100644 --- a/ash/public/cpp/holding_space/holding_space_controller.cc +++ b/ash/public/cpp/holding_space/holding_space_controller.cc
@@ -16,6 +16,33 @@ } // namespace +// HoldingSpaceController::ScopedForceShowInShelf ------------------------------ + +HoldingSpaceController::ScopedForceShowInShelf::ScopedForceShowInShelf() { + auto* controller = HoldingSpaceController::Get(); + CHECK(controller); + ++controller->force_show_in_shelf_count_; + if (controller->force_show_in_shelf_count_ == 1) { + for (auto& observer : controller->observers_) { + observer.OnHoldingSpaceForceShowInShelfChanged(); + } + } +} + +HoldingSpaceController::ScopedForceShowInShelf::~ScopedForceShowInShelf() { + if (auto* controller = HoldingSpaceController::Get()) { + --controller->force_show_in_shelf_count_; + CHECK_GE(controller->force_show_in_shelf_count_, 0); + if (controller->force_show_in_shelf_count_ == 0) { + for (auto& observer : controller->observers_) { + observer.OnHoldingSpaceForceShowInShelfChanged(); + } + } + } +} + +// HoldingSpaceController ------------------------------------------------------ + HoldingSpaceController::HoldingSpaceController() { CHECK(!g_instance); g_instance = this;
diff --git a/ash/public/cpp/holding_space/holding_space_controller.h b/ash/public/cpp/holding_space/holding_space_controller.h index 2e38756..b0476e05 100644 --- a/ash/public/cpp/holding_space/holding_space_controller.h +++ b/ash/public/cpp/holding_space/holding_space_controller.h
@@ -26,10 +26,21 @@ // using HoldingSpaceController::Get(). class ASH_PUBLIC_EXPORT HoldingSpaceController : public SessionObserver { public: + // Used to force holding space to show in the shelf while in scope, regardless + // of whether the holding space model is empty. Note that even while in scope, + // holding space will not show in the shelf unless the holding space model is + // attached and the user session is unblocked. + class ScopedForceShowInShelf { + public: + ScopedForceShowInShelf(); + ScopedForceShowInShelf(const ScopedForceShowInShelf&) = delete; + ScopedForceShowInShelf& operator=(const ScopedForceShowInShelf&) = delete; + ~ScopedForceShowInShelf(); + }; + HoldingSpaceController(); - HoldingSpaceController(const HoldingSpaceController& other) = delete; - HoldingSpaceController& operator=(const HoldingSpaceController& other) = - delete; + HoldingSpaceController(const HoldingSpaceController&) = delete; + HoldingSpaceController& operator=(const HoldingSpaceController&) = delete; ~HoldingSpaceController() override; // Returns the global HoldingSpaceController instance. It's set in the @@ -46,9 +57,11 @@ HoldingSpaceModel* model); HoldingSpaceClient* client() { return client_; } - HoldingSpaceModel* model() { return model_; } + // Indicates whether to force holding space to show in the shelf. + bool force_show_in_shelf() const { return force_show_in_shelf_count_ > 0; } + private: // SessionObserver: void OnActiveUserSessionChanged(const AccountId& account_id) override; @@ -65,6 +78,9 @@ // The currently active user account id. AccountId active_user_account_id_; + // Number of clients currently forcing holding space to show in the shelf. + int force_show_in_shelf_count_ = 0; + using ClientAndModel = std::pair<HoldingSpaceClient*, HoldingSpaceModel*>; std::map<const AccountId, ClientAndModel> clients_and_models_by_account_id_;
diff --git a/ash/public/cpp/holding_space/holding_space_controller_observer.h b/ash/public/cpp/holding_space/holding_space_controller_observer.h index a3e2a3e..6b101a479 100644 --- a/ash/public/cpp/holding_space/holding_space_controller_observer.h +++ b/ash/public/cpp/holding_space/holding_space_controller_observer.h
@@ -20,6 +20,11 @@ // Called when a model gets detached from the HoldingSpaceController. virtual void OnHoldingSpaceModelDetached(HoldingSpaceModel* model) = 0; + + // Called when holding space: + // * (a) should be forced to show in the shelf, or + // * (b) should no longer be forced to show in the shelf. + virtual void OnHoldingSpaceForceShowInShelfChanged() {} }; } // namespace ash
diff --git a/ash/shelf/drag_window_from_shelf_controller_unittest.cc b/ash/shelf/drag_window_from_shelf_controller_unittest.cc index 5232dd3..723b5c54 100644 --- a/ash/shelf/drag_window_from_shelf_controller_unittest.cc +++ b/ash/shelf/drag_window_from_shelf_controller_unittest.cc
@@ -35,6 +35,7 @@ #include "ash/wm/window_properties.h" #include "ash/wm/window_state.h" #include "ash/wm/window_util.h" +#include "ash/wm/work_area_insets.h" #include "base/ranges/algorithm.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -1636,15 +1637,19 @@ right_window.get(), SplitViewController::SnapPosition::kSecondary); // Ensure we are in a both snapped state with a floated window. + wm::ActivateWindow(floated_window.get()); ASSERT_TRUE(WindowState::Get(left_window.get())->IsSnapped()); ASSERT_TRUE(WindowState::Get(right_window.get())->IsSnapped()); ASSERT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); - wm::ActivateWindow(floated_window.get()); // Verify that the floated window by default is magnetized to the bottom right // corner. - ASSERT_TRUE(right_window->GetBoundsInScreen().Contains( - floated_window->GetBoundsInScreen())); + const gfx::Rect work_area = + WorkAreaInsets::ForWindow(floated_window.get())->user_work_area_bounds(); + ASSERT_EQ( + gfx::Point(work_area.right() - chromeos::wm::kFloatedWindowPaddingDp, + work_area.bottom() - chromeos::wm::kFloatedWindowPaddingDp), + floated_window->GetBoundsInScreen().bottom_right()); // Drag under the floated window. It should be the dragged window. const gfx::Rect shelf_bounds = GetShelfBounds(); @@ -1656,10 +1661,12 @@ auto* drag_controller = GetDragWindowFromShelfController(); ASSERT_TRUE(drag_controller); EXPECT_EQ(floated_window.get(), drag_controller->dragged_window()); + EXPECT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); // Move back towards the shelf to ensure we do not enter overview. GetEventGenerator()->MoveTouchBy(0, 200); GetEventGenerator()->ReleaseTouch(); + EXPECT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); // Drag under the right snapped window. It should be the dragged window. const gfx::Point drag_point_under_right( @@ -1670,6 +1677,11 @@ drag_controller = GetDragWindowFromShelfController(); ASSERT_TRUE(drag_controller); EXPECT_EQ(right_window.get(), drag_controller->dragged_window()); + + // Verify that all the window states remain the same. + EXPECT_TRUE(WindowState::Get(left_window.get())->IsSnapped()); + EXPECT_TRUE(WindowState::Get(right_window.get())->IsSnapped()); + EXPECT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); } } // namespace ash
diff --git a/ash/shelf/shelf.h b/ash/shelf/shelf.h index f251e92b..f6b044ad 100644 --- a/ash/shelf/shelf.h +++ b/ash/shelf/shelf.h
@@ -100,6 +100,31 @@ Shelf* shelf_; }; + // Used to disable auto-hide shelf behavior while in scope. Note that + // disabling auto-hide behavior is of lower precedence than auto-hide behavior + // based on locks and session state, so it is not guaranteed to show the shelf + // in all cases. + class ScopedDisableAutoHide { + public: + explicit ScopedDisableAutoHide(Shelf* shelf) : shelf_(shelf) { + ++shelf_->disable_auto_hide_; + if (shelf_->disable_auto_hide_ == 1) { + shelf_->UpdateVisibilityState(); + } + } + + ~ScopedDisableAutoHide() { + --shelf_->disable_auto_hide_; + CHECK_GE(shelf_->disable_auto_hide_, 0); + if (shelf_->disable_auto_hide_ == 0) { + shelf_->UpdateVisibilityState(); + } + } + + private: + Shelf* const shelf_; + }; + Shelf(); Shelf(const Shelf&) = delete; @@ -266,6 +291,7 @@ return is_tablet_mode_animation_running_; } int auto_hide_lock() const { return auto_hide_lock_; } + int disable_auto_hide() const { return disable_auto_hide_; } ShelfTooltipManager* tooltip() { return tooltip_.get(); } @@ -362,6 +388,9 @@ // shelf. int auto_hide_lock_ = 0; + // Used by `ScopedDisableAutoHide` to disable auto-hide shelf behavior. + int disable_auto_hide_ = 0; + std::unique_ptr<ShelfTooltipManager> tooltip_; };
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc index a17d081..8af8117 100644 --- a/ash/shelf/shelf_layout_manager.cc +++ b/ash/shelf/shelf_layout_manager.cc
@@ -2165,6 +2165,10 @@ if (shelf_->auto_hide_lock()) return state_.auto_hide_state; + if (shelf_->disable_auto_hide()) { + return SHELF_AUTO_HIDE_SHOWN; + } + const bool in_tablet_mode = Shell::Get()->IsInTabletMode(); // Don't let the shelf auto hide when in tablet mode and Chromevox is on. if (in_tablet_mode &&
diff --git a/ash/shelf/shelf_unittest.cc b/ash/shelf/shelf_unittest.cc index 074d7b1..6fd061a4 100644 --- a/ash/shelf/shelf_unittest.cc +++ b/ash/shelf/shelf_unittest.cc
@@ -13,6 +13,7 @@ #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_app_button.h" #include "ash/shelf/shelf_controller.h" +#include "ash/shelf/shelf_layout_manager.h" #include "ash/shelf/shelf_party_feature_pod_controller.h" #include "ash/shelf/shelf_view.h" #include "ash/shelf/shelf_view_test_api.h" @@ -140,6 +141,48 @@ EXPECT_EQ(ShelfAutoHideBehavior::kNever, shelf->auto_hide_behavior()); } +// Various assertions around disabling auto-hide. +TEST_F(ShelfTest, DisableAutoHide) { + // Create and activate a `window`. + auto window = std::make_unique<aura::Window>(nullptr); + window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); + window->SetType(aura::client::WINDOW_TYPE_NORMAL); + window->Init(ui::LAYER_TEXTURED); + ParentWindowInPrimaryRootWindow(window.get()); + window->Show(); + wm::ActivateWindow(window.get()); + + // Set `shelf` to always auto-hide. + Shelf* shelf = GetPrimaryShelf(); + shelf->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways); + + // Verify `shelf` is auto-hidden. + ShelfLayoutManager* shelf_layout_manager = shelf->shelf_layout_manager(); + EXPECT_TRUE(shelf_layout_manager->is_shelf_auto_hidden()); + + { + // Verify that auto-hide can be disabled using `ScopedDisableAutoHide`. + Shelf::ScopedDisableAutoHide disable_auto_hide(shelf); + EXPECT_FALSE(shelf_layout_manager->is_shelf_auto_hidden()); + } + + // Verify `shelf` is auto-hidden. + EXPECT_TRUE(shelf_layout_manager->is_shelf_auto_hidden()); + + // Lock shelf in auto-hidden state. + Shelf::ScopedAutoHideLock auto_hide_lock(shelf); + EXPECT_TRUE(shelf_layout_manager->is_shelf_auto_hidden()); + + { + // Verify that auto-hide cannot be disabled using `ScopedDisableAutoHide`. + Shelf::ScopedDisableAutoHide disable_auto_hide(shelf); + EXPECT_TRUE(shelf_layout_manager->is_shelf_auto_hidden()); + } + + // Verify `shelf` is auto-hidden. + EXPECT_TRUE(shelf_layout_manager->is_shelf_auto_hidden()); +} + // Tests if shelf is hidden on secondary display after the primary display is // changed. TEST_F(ShelfTest, ShelfHiddenOnScreenOnSecondaryDisplay) {
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 8a4b7387..2b077cea 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Maak Geskiedenis-bladsy oop</translation> <translation id="1654477262762802994">Begin 'n stemnavraag</translation> <translation id="1668469839109562275">Ingeboude VPN</translation> +<translation id="1675844249244994876">Dateer die regtervenster op</translation> <translation id="1677472565718498478"><ph name="TIME" /> oor</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> is nie gekoppel nie.</translation> <translation id="1677582821739292812">Iemand kyk tans na jou skerm</translation> @@ -849,6 +850,7 @@ <translation id="493076006037866439">Zoem uit op skerm</translation> <translation id="4936329710968938986">Almal, af</translation> <translation id="4938176435186993759">Versteek alle voorstelle</translation> +<translation id="4943007472417128747">Warmkol is afgeskakel sodat wi-fi gebruik kan word. Skakel wi-fi af as jy die warmkol wil gebruik.</translation> <translation id="4945196315133970626">Skakel kennisgewings af</translation> <translation id="4946376291507881335">Vang vas</translation> <translation id="495046168593986294">Rollees op</translation> @@ -1393,6 +1395,7 @@ Druk en hou weer die aan/af-skakelaar op die toestel om dit af te skakel.</translation> <translation id="7526573455193969409">Netwerk kan gemonitor word</translation> <translation id="7536035074519304529">IP-adres: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Dateer die linkervenster op</translation> <translation id="7543399541175347147">Linux-programme en Incognito-vensters word nie tans gesteun nie. Ander programme sal gestoor word.</translation> <translation id="7544300628205093162">Sleutelbord se agterlig is aan</translation> <translation id="7548434653388805669">Slaaptyd</translation> @@ -1473,6 +1476,7 @@ <translation id="7893503627044934815">Wil nie hê hierdie lêer moet gewys word nie</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Jy het die sleutelbordkortpad vir skermrotasie gedruk. Wil jy die skerm draai?</translation> +<translation id="7901190436359881020">Ruil die vensters</translation> <translation id="7901405293566323524">Foonspil</translation> <translation id="7902625623987030061">Raak die vingerafdruksensor</translation> <translation id="7904094684485781019">Die administrateur vir hierdie rekening laat nie meer veelvuldige aanmeldings toe nie.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index 62962cf7..593a18e 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C ডিভাইচ (সন্মুখৰ প’র্ট)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" />ক <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) লৈ সলনি কৰা হৈছে। সালসলনিসমূহ ৰাখিবলৈ নিশ্চিত কৰকত ক্লিক কৰক। পূৰ্বৱৰ্তী ছেটিংসমূহ <ph name="TIMEOUT_SECONDS" />ত পুনঃস্থাপন কৰা হ’ব।</translation> <translation id="1013923882670373915">ব্লুটুথ ডিভাইচ "<ph name="DEVICE_NAME" />"এ পেয়াৰ কৰিবলৈ অনুমতি বিচাৰে। অনুগ্ৰহ কৰি সেই ডিভাইচত এই পিন ক'ডটো দিয়ক: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">এইটোৱে <ph name="APP_NAME" /> আৰু অৱস্থানৰ অনুমতি থকা আটাইবোৰ এপ্ আৰু ৱেবছাইট আৰু ChromeOSক ৱাই-ফাই আৰু ম’বাইল নেটৱৰ্কৰ অৱস্থান ব্যৱহাৰ কৰাৰ অনুমতি দিয়ে।</translation> <translation id="1017556409696559990">Chromeত কোনো পূৰ্বৰ ইতিহাস নাথাকিলে একেবাৰে ওপৰৰ ৱিণ্ড’খন মিনিমাইজ কৰক</translation> <translation id="1024364763893396229">আপোনাৰ <ph name="NAME" /> ছেভ কৰক</translation> <translation id="1032891413405719768">ষ্টাইলাছৰ বেটাৰী কম আছে</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">ইতিহাসৰ পৃষ্ঠাটো খোলক</translation> <translation id="1654477262762802994">কণ্ঠধ্বনিৰদ্বাৰা সন্ধান আৰম্ভ কৰক</translation> <translation id="1668469839109562275">বিল্ট-ইন ভিপিএন</translation> +<translation id="1675844249244994876">সোঁফালৰ ৱিণ্ড’খন আপডে’ট কৰক</translation> <translation id="1677472565718498478"><ph name="TIME" /> বাকী</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> সংযোগ হৈ থকা নাই।</translation> <translation id="1677582821739292812">কোনোবাই আপোনাৰ স্ক্ৰীনখনৰ ফালে চাই আছে</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ইথাৰনেট: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">অৱস্থানৰ এক্সেছ অন কৰক</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" />ক আন-পিন কৰা হৈছে</translation> <translation id="1838895407229022812">ৰাতিৰ লাইট অফ কৰা আছে।</translation> <translation id="1854180393107901205">কাষ্ট কৰা বন্ধ কৰক</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">আপুনি কি কৰিব পাৰে?</translation> <translation id="3256109297135787951">আপোনাৰ শ্বেল্ফৰ কোনো বস্তুৰ পৰা হাইলাইট আঁতৰাওক</translation> <translation id="3260969790895726815">কথন স্থানীয়ভাৱে প্ৰক্ৰিয়াকৰণ কৰা হয় আৰু শ্ৰুতলিপিয়ে অফলাইন কাম কৰে, কিন্তু কিছুমান কণ্ঠস্বৰৰ নিৰ্দেশে কাম নকৰে।</translation> +<translation id="3265032511221679826">সঠিক অৱস্থানৰ এক্সেছ অন কৰিবনে?</translation> <translation id="3269597722229482060">সোঁফালে ক্লিক কৰক</translation> <translation id="3289364673986435196">পাৱাৰ মেনু</translation> <translation id="3289544412142055976">বৰ্তমান Linux এপ্সমূহ সমৰ্থিত নহয়</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" />এ পৰিচালনা কৰা ব্যৱহাৰকাৰী</translation> <translation id="3666266999138159418">আপোনাৰ উপঙি থকা ৱিণ্ড’ লুকুৱাবলৈ ছোৱাইপ কৰক</translation> <translation id="367531336287639526">ঠিকনাৰ বাৰৰ বাওঁফালে থকা প্ৰথম চিহ্নটো বাছনি কৰক</translation> +<translation id="3677931086890821290">এইটোৱে অৱস্থানৰ অনুমতি থকা আটাইবোৰ এপ্ আৰু ৱেবছাইট আৰু ChromeOSক ৱাই-ফাই আৰু ম’বাইল নেটৱৰ্কৰ অৱস্থান ব্যৱহাৰ কৰাৰ অনুমতি দিয়ে।</translation> <translation id="3679827876008292680">ৱিণ্ড’ত থকা শেষৰ টেবটোলৈ যাওক</translation> <translation id="36813544980941320">আপোনাৰ ফ'ন আৰু <ph name="DEVICE_NAME" />ৰ মাজত ৱাই-ফাই নেটৱৰ্কটো শ্বেয়াৰ কৰা হ'ব</translation> <translation id="3694122362646626770">ৱেবছাইট</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">স্ক্ৰীনৰ পৰা জুম আউট কৰক</translation> <translation id="4936329710968938986">সকলো, অফ আছে</translation> <translation id="4938176435186993759">আটাইবোৰ পৰামৰ্শ লুকুৱাওক</translation> +<translation id="4943007472417128747">ৱাইফাই ব্যৱহাৰ কৰিবলৈ হটস্পট অফ কৰা হৈছে। হটস্পট ব্যৱহাৰ কৰিবলৈ ৱাইফাই অফ কৰক।</translation> <translation id="4945196315133970626">জাননী অফ কৰক</translation> <translation id="4946376291507881335">কেপচাৰ কৰক</translation> <translation id="495046168593986294">ওপৰলৈ স্ক্ৰল কৰক</translation> @@ -1388,6 +1394,7 @@ ডিভাইচটো শ্বাট ডাউন কৰিবলৈ, ডিভাইচটোত থকা পাৱাৰ বুটামটো পুনৰ টিপি কিছুসময় ধৰি থাকক।</translation> <translation id="7526573455193969409">নেটৱৰ্ক নিৰীক্ষণ কৰা হ’ব পাৰে</translation> <translation id="7536035074519304529">আইপি ঠিকনা: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">বাওঁফালৰ ৱিণ্ড’খন আপডে’ট কৰক</translation> <translation id="7543399541175347147">বর্তমান Linux এপ্ আৰু ইনক'গনিট' ৱিণ্ড'সমূহ সমর্থন নকৰে। অন্য এপ্ ছেভ কৰা হ’ব।</translation> <translation id="7544300628205093162">কীব’ৰ্ডৰ নেপথ্যৰ পোহৰ অন হৈ আছে</translation> <translation id="7548434653388805669">শুবৰ সময় হ’ল</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">এই ফাইলটো দেখুওৱাটো নিবিচাৰোঁ</translation> <translation id="7895348134893321514">ট’ট</translation> <translation id="7897375687985782769">আপুনি স্ক্রীণখন ঘূৰাবলৈ কীব'ৰ্ডৰ শ্বৰ্টকাটত টিপিলে। আপুনি স্ক্রীণখন ঘূৰাব বিচাৰেনে?</translation> +<translation id="7901190436359881020">ৱিণ্ড’সমূহ সলনাসলনি কৰক</translation> <translation id="7901405293566323524">ফ’ন হাব</translation> <translation id="7902625623987030061">ফিংগাৰপ্ৰিণ্ট ছেন্সৰটো স্পৰ্শ কৰক</translation> <translation id="7904094684485781019">এই একাউণ্টটোৰ প্ৰশাসককে একাধিক ছাইন ইন কৰাৰ অনুমতি দিয়া নাই।</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" />ৰ ৰিজ’লিউশ্বনটো <ph name="RESOLUTION" />লৈ সলনি কৰা হৈছে। সালসলনিসমূহ ৰাখিবলৈ নিশ্চিত কৰকত ক্লিক কৰক। পূৰ্বৱৰ্তী ছেটিংসমূহ <ph name="TIMEOUT_SECONDS" />ত পুনঃস্থাপন কৰা হ’ব।</translation> <translation id="9201044636667689546">এই Chromebookটোৰ সৈতে <ph name="NAME" /> সংযোগ কৰক</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে</translation> +<translation id="9207682216934703221">এইটোৱে <ph name="APP_NAME" />, <ph name="APP2_NAME" /> আৰু অৱস্থানৰ অনুমতি থকা আটাইবোৰ এপ্ আৰু ৱেবছাইট আৰু ChromeOSক ৱাই-ফাই আৰু ম’বাইল নেটৱৰ্কৰ অৱস্থান ব্যৱহাৰ কৰাৰ অনুমতি দিয়ে।</translation> <translation id="9210037371811586452">সমন্বিত ডেস্কটপ ম’ড বন্ধ কৰি আছে</translation> <translation id="9211490828691860325">আটাইবোৰ ডেস্ক</translation> <translation id="9211681782751733685">বেটাৰী সম্পূৰ্ণ চ্চাৰ্জ হ’বলৈ <ph name="TIME_REMAINING" /> বাকী আছে।</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index 9fcbc742..feff1616 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C cihazı (ön port)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> <ph name="RESOLUTION" /> ilə dəyişdirilib (<ph name="REFRESH_RATE" /> Hz). Dəyişiklikləri saxlamaq üçün "təsdiq edin" seçiminə toxunun. Əvvəlki ayarlar <ph name="TIMEOUT_SECONDS" /> ərzində bərpa ediləcək.</translation> <translation id="1013923882670373915">Bluetooth cihazı "<ph name="DEVICE_NAME" />" cütlənmək üçün icazə istəyir. Həmin cihaza PIN kodu daxil edin: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285"><ph name="APP_NAME" /> tətbiqinə, məkan icazəsi olan tətbiq və veb-saytlara, habelə ChromeOS-a Wi-Fi və mobil şəbəkə məkanından istifadə icazəsi verilir.</translation> <translation id="1017556409696559990">Chrome-da geri keçid tarixçəsi olmadıqda yuxarı pəncərəni kiçildin</translation> <translation id="1024364763893396229"><ph name="NAME" /> cihazınızı yadda saxlayın</translation> <translation id="1032891413405719768">Qramafon iynəsinin batareyası azdır</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Tarixçə səhifəsini açın</translation> <translation id="1654477262762802994">Səsli sorğuya başlayın</translation> <translation id="1668469839109562275">Daxili VPN</translation> +<translation id="1675844249244994876">Sağ pəncərəni yeniləyin</translation> <translation id="1677472565718498478"><ph name="TIME" /> qaldı</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> qoşulmayıb.</translation> <translation id="1677582821739292812">Kimsə ekranınıza baxır</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Məkana girişi aktiv edin</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> çıxarıldı</translation> <translation id="1838895407229022812">Gecə işığı deaktivdir.</translation> <translation id="1854180393107901205">Yayımı dayandırın</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Nə edə bilərsiniz?</translation> <translation id="3256109297135787951">Rəfdəki elementdən vurğulamanı silin</translation> <translation id="3260969790895726815">Nitq lokal olaraq emal edilir və diktə oflayn işləyir, lakin bəzi səs əmrləri işləməyəcək.</translation> +<translation id="3265032511221679826">Dəqiq məkana giriş aktiv edilsin?</translation> <translation id="3269597722229482060">Sağ düymə ilə toxunun</translation> <translation id="3289364673986435196">Enerji menyusu</translation> <translation id="3289544412142055976">Linux tətbiqləri hazırda dəstəklənmir</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> İdarə edilən istifadəçi</translation> <translation id="3666266999138159418">Üzən pəncərəni gizlətmək üçün sürüşdürün</translation> <translation id="367531336287639526">Ünvan panelinin solundakı birinci ikonanı seçin</translation> +<translation id="3677931086890821290">Məkan icazəsi olan tətbiq və veb-saytlara, habelə ChromeOS-a Wi-Fi və mobil şəbəkə məkanından istifadə icazəsi verilir.</translation> <translation id="3679827876008292680">Pəncərədə sonuncu taba keçin</translation> <translation id="36813544980941320">Wi-Fi şəbəkələri telefonunuz ilə <ph name="DEVICE_NAME" /> arasında paylaşılacaq</translation> <translation id="3694122362646626770">Veb Saytlar</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Ekranı uzaqlaşdırın</translation> <translation id="4936329710968938986">Hər kəs, deaktiv</translation> <translation id="4938176435186993759">Bütün təklifləri gizlədin</translation> +<translation id="4943007472417128747">WiFi-dan istifadə etmək üçün hotspot söndürülüb. Hotspotdan istifadə etmək üçün WiFi-ı söndürün.</translation> <translation id="4945196315133970626">Bildirişləri deaktiv edin</translation> <translation id="4946376291507881335">Çəkin</translation> <translation id="495046168593986294">Yuxarı sürüşdürün</translation> @@ -1388,6 +1394,7 @@ Cihazı söndürmək üçün cihazda enerji düyməsinə yenidən basıb saxlayın.</translation> <translation id="7526573455193969409">Şəbəkəyə nəzarət edilə bilər</translation> <translation id="7536035074519304529">IP ünvanı: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Sol pəncərəni yeniləyin</translation> <translation id="7543399541175347147">Linux tətbiqləri və Anonim pəncərələr hazırda dəstəklənmir. Digər tətbiqlər yadda saxlanılacaq.</translation> <translation id="7544300628205093162">Klaviatura arxa işığı yanır</translation> <translation id="7548434653388805669">Yatmaq vaxtı</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Bu faylın göstərilməsini istəmirəm</translation> <translation id="7895348134893321514">Bölmə</translation> <translation id="7897375687985782769">Ekran fırlanması üçün klaviatura qısayoluna basdınız. Ekranı fırlatmaq istəyirsiniz?</translation> +<translation id="7901190436359881020">Pəncərələri dəyişin</translation> <translation id="7901405293566323524">Telefon Habı</translation> <translation id="7902625623987030061">Barmaq izi sensoruna toxunun</translation> <translation id="7904094684485781019">Administrator bu hesab üçün çoxsaylı girişlərə icazə verməyib.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> əksetmə qabiliyyəti <ph name="RESOLUTION" /> olaraq dəyişildi. Dəyişiklikləri saxlamaq üçün "təsdiq edin" üzərinə klikləyin. Əvvəlki ayarlar <ph name="TIMEOUT_SECONDS" /> ərzində bərpa ediləcək.</translation> <translation id="9201044636667689546"><ph name="NAME" /> cihazını bu Chromebook'a qoşun</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Administratorunuz tərəfindən idarə olunur</translation> +<translation id="9207682216934703221"><ph name="APP_NAME" />, <ph name="APP2_NAME" /> tətbiqlərinə, məkan icazəsi olan tətbiq və veb-saytlara, habelə ChromeOS-a Wi-Fi və mobil şəbəkə məkanından istifadə icazəsi verilir.</translation> <translation id="9210037371811586452">Vahid masaüstü rejimindən çıxır</translation> <translation id="9211490828691860325">Bütün masalar</translation> <translation id="9211681782751733685">Batareyanın tam dolmağına <ph name="TIME_REMAINING" /> qalır.</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index e533d51..adf7bd68 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C устройство (предният порт)</translation> <translation id="1013598600051641573">Разделителната способност на <ph name="DISPLAY_NAME" /> бе променена на <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Хц). Кликнете върху бутона за потвърждаване, за да запазите промените. Предишните настройки ще бъдат възстановени след <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ иска разрешение за сдвояване. Моля, въведете на него следния ПИН код: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Това дава възможност на <ph name="APP_NAME" />, всички приложения и уебсайтове с разрешение за достъп до местоположението и ChromeOS да използват местоположението от Wi-Fi и мобилни мрежи.</translation> <translation id="1017556409696559990">Намаляване на прозореца от първо ниво, когато в Chrome няма история за връщане назад</translation> <translation id="1024364763893396229">Запазете устройството си <ph name="NAME" /></translation> <translation id="1032891413405719768">Батериите на писалката са изтощени</translation> @@ -192,6 +193,7 @@ <ph name="IME" />, <ph name="LOCALE" />.</translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Включване на достъпа до местоположението</translation> <translation id="1830308660060964064">Освободихте <ph name="ITEM_TITLE" /></translation> <translation id="1838895407229022812">Функцията за нощно осветление е изключена.</translation> <translation id="1854180393107901205">Спиране на предаването</translation> @@ -469,6 +471,7 @@ <translation id="3255483164551725916">„What can you do?“ („Какво можеш да правиш?“)</translation> <translation id="3256109297135787951">Премахване на фокуса от елемент в лавицата</translation> <translation id="3260969790895726815">Говорът се обработва локално и функцията за диктуване работи офлайн, но някои гласови команди няма да се поддържат.</translation> +<translation id="3265032511221679826">Да се включи ли достъпът до точното местоположение?</translation> <translation id="3269597722229482060">Кликване с десния бутон</translation> <translation id="3289364673986435196">Меню за включване/изключване</translation> <translation id="3289544412142055976">Понастоящем приложенията за Linux не се поддържат</translation> @@ -579,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> – управляван потребител</translation> <translation id="3666266999138159418">Прекарайте пръст, за да скриете плаващия прозорец</translation> <translation id="367531336287639526">Избиране на първата икона отляво на адресната лента</translation> +<translation id="3677931086890821290">Това дава възможност на всички приложения и уебсайтове с разрешение за достъп до местоположението и ChromeOS да използват местоположението от Wi-Fi и мобилни мрежи.</translation> <translation id="3679827876008292680">Преминаване към последния раздел в прозореца</translation> <translation id="36813544980941320">Wi-Fi мрежите ще бъдат споделяни между телефона и устройството ви <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Уебсайтове</translation> @@ -1747,6 +1751,7 @@ <translation id="9198992156681343238">Разделителната способност на <ph name="DISPLAY_NAME" /> бе променена на <ph name="RESOLUTION" />. Кликнете върху бутона за потвърждаване, за да запазите промените. Предишните настройки ще бъдат възстановени след <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Свържете <ph name="NAME" /> с този Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, управлява се от администратора ви</translation> +<translation id="9207682216934703221">Това дава възможност на <ph name="APP_NAME" />, <ph name="APP2_NAME" />, всички приложения и уебсайтове с разрешение за достъп до местоположението и ChromeOS да използват местоположението от Wi-Fi и мобилни мрежи.</translation> <translation id="9210037371811586452">Излиза се от режима на обединен работен плот</translation> <translation id="9211490828691860325">Всички работни кътове</translation> <translation id="9211681782751733685">Оставащо време до пълното зареждане на батерията: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index eb90d96..78ec5a0 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C ডিভাইস (সামনের পোর্ট)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" />-এর রেজোলিউশন পরিবর্তন করে <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> হার্জ) করা হয়েছে। পরিবর্তিত সেটিংস রেখে দিতে 'কনফার্ম করুন' বিকল্পে ক্লিক করুন। <ph name="TIMEOUT_SECONDS" />-এর মধ্যে পুরনো সেটিংসে ফিরিয়ে নিয়ে যাওয়া হবে।</translation> <translation id="1013923882670373915">ব্লুটুথ ডিভাইস "<ph name="DEVICE_NAME" />" যুক্ত করার অনুমতি চাইছে। ডিভাইসটিতে এই পিন কোড দিন: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">এর ফলে, <ph name="APP_NAME" /> ও লোকেশন সংক্রান্ত অনুমতি থাকা অন্য সবকটি অ্যাপ ও ওয়েবসাইট এবং ChromeOS, ওয়াই-ফাই ও মোবাইল নেটওয়ার্কের লোকেশন ব্যবহার করতে পারবে।</translation> <translation id="1017556409696559990">Chrome-এ আগের কোনও ইতিহাস না থাকলে উপরের উইন্ডোটি মিনিমাইজ করুন</translation> <translation id="1024364763893396229"><ph name="NAME" /> সেভ করুন</translation> <translation id="1032891413405719768">স্টাইলাসের চার্জ কমে গেছে</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ইথারনেট: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">লোকেশন অ্যাক্সেস চালু করুন</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> আনপিন করা হয়েছে</translation> <translation id="1838895407229022812">নাইট লাইট ফিচার বন্ধ করা আছে।</translation> <translation id="1854180393107901205">কাস্ট করা বন্ধ করুন</translation> @@ -235,7 +237,7 @@ <translation id="2023558322300866873">আপনি যেকোনও সময় প্যাকেট ক্যাপচার বন্ধ করে দিতে পারবেন</translation> <translation id="2034971124472263449">যাই হোক সেভ করুন</translation> <translation id="2049240716062114887">ডেস্কের নাম পরিবর্তন করে <ph name="DESK_NAME" /> রাখা হয়েছে</translation> -<translation id="2050339315714019657">প্রতিকৃতি</translation> +<translation id="2050339315714019657">পোর্ট্রেট</translation> <translation id="2064048859448024834">ক্যামেরা প্রিভিউ চালু আছে</translation> <translation id="2067602449040652523">কীবোর্ডের উজ্জ্বলতা</translation> <translation id="2078034614700056995">পরবর্তী ডেস্কে সুইচ করতে, চার আঙুল ব্যবহার করে ডানদিকে সোয়াইপ করুন</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">আপনি কি করতে পারেন?</translation> <translation id="3256109297135787951">আপনার শেল্ফে আইটেম থেকে হাইলাইট সরিয়ে দিন</translation> <translation id="3260969790895726815">স্পিচ স্থানীয়ভাবে প্রসেস করা হয় এবং ডিক্টেশন অফলাইনে কাজ করে, কিন্তু কিছু ভয়েস কমান্ড কাজ করবে না।</translation> +<translation id="3265032511221679826">সুনির্দিষ্ট লোকেশন সংক্রান্ত অ্যাক্সেসের অনুমতি চালু করবেন?</translation> <translation id="3269597722229482060">ডানদিকের বোতামে ক্লিক করুন</translation> <translation id="3289364673986435196">পাওয়ার মেনু</translation> <translation id="3289544412142055976">বর্তমানে Linux অ্যাপ ব্যবহারের সুবিধা নেই</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> ম্যানেজ করা ব্যবহারকারী</translation> <translation id="3666266999138159418">আপনার ফ্লোটিং উইন্ডো লুকাতে সোয়াইপ করুন</translation> <translation id="367531336287639526">অ্যাড্রেস বারের বাঁদিকে প্রথম আইকন বেছে নিন</translation> +<translation id="3677931086890821290">এর ফলে, লোকেশন সংক্রান্ত অনুমতি থাকা অন্য সবকটি অ্যাপ ও ওয়েবসাইট এবং ChromeOS, ওয়াই-ফাই ও মোবাইল নেটওয়ার্কের লোকেশন ব্যবহার করতে পারবে।</translation> <translation id="3679827876008292680">উইন্ডোতে শেষ ট্যাবে যান</translation> <translation id="36813544980941320">ফোন ও <ph name="DEVICE_NAME" />-এর মধ্যে ওয়াই-ফাই নেটওয়ার্ক শেয়ার করা হবে।</translation> <translation id="3694122362646626770">ওয়েবসাইটগুলি</translation> @@ -1743,6 +1747,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" />-এর রেজোলিউশন পরিবর্তন করে <ph name="RESOLUTION" /> করা হয়েছে। পরিবর্তিত সেটিংস বজায় রাখতে, 'কনফার্ম করুন' বোতামে ক্লিক করুন। <ph name="TIMEOUT_SECONDS" />-এর মধ্যে পুরনো সেটিংসে ফিরিয়ে নিয়ে যাওয়া হবে।</translation> <translation id="9201044636667689546">এই Chromebook-এ <ph name="NAME" /> কানেক্ট করুন</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, আপনার অ্যাডমিনিস্ট্রেটর ম্যানেজ করে</translation> +<translation id="9207682216934703221">এর ফলে, <ph name="APP_NAME" />, <ph name="APP2_NAME" />ও লোকেশন সংক্রান্ত অনুমতি থাকা অন্য সবকটি অ্যাপ ও ওয়েবসাইট এবং ChromeOS, ওয়াই-ফাই ও মোবাইল নেটওয়ার্কের লোকেশন ব্যবহার করতে পারবে।</translation> <translation id="9210037371811586452">সমন্বিত ডেস্কটপ মোড থেকে প্রস্থান করছে</translation> <translation id="9211490828691860325">সব ডেক্স</translation> <translation id="9211681782751733685">ব্যাটারি পুরো চার্জ হতে <ph name="TIME_REMAINING" /> বাকি আছে।</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index ed344f4..8fad6bc 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -148,7 +148,7 @@ <translation id="1651914502370159744">Otvaranje stranice Historija</translation> <translation id="1654477262762802994">Započni glasovni upit</translation> <translation id="1668469839109562275">Ugrađeni VPN</translation> -<translation id="1675844249244994876">Ažuriraj desni prozor</translation> +<translation id="1675844249244994876">Ažuriranje desnog prozora</translation> <translation id="1677472565718498478">Još <ph name="TIME" /></translation> <translation id="1677507110654891115">Funkcija <ph name="FEATURE_NAME" /> nije povezana.</translation> <translation id="1677582821739292812">Neko gleda u vaš ekran</translation> @@ -849,7 +849,7 @@ <translation id="493076006037866439">Umanjivanje ekrana</translation> <translation id="4936329710968938986">Svako, isključeno</translation> <translation id="4938176435186993759">Sakrij sve prijedloge</translation> -<translation id="4943007472417128747">Žarišna točka isključena je da biste upotrebljavali Wi-Fi. Da biste koristili žarišnu točku, isključite Wi-Fi.</translation> +<translation id="4943007472417128747">Pristupna tačka je isključena radi korištenja WiFi-ja. Da koristite pristupnu tačku, isključite WiFi.</translation> <translation id="4945196315133970626">Isključi obavještenja</translation> <translation id="4946376291507881335">Snimi</translation> <translation id="495046168593986294">Klizni prema gore</translation> @@ -1073,7 +1073,7 @@ <translation id="5976112937189445008">Pritisnite Enter da snimite prozor</translation> <translation id="5978382165065462689">Dijeljenje kontrole nad vašim ekranom putem pomoći na daljinu.</translation> <translation id="5980301590375426705">Napusti sesiju gosta</translation> -<translation id="5983567367406220847">Žarišna točka je isključena zbog neaktivnosti.</translation> +<translation id="5983567367406220847">Pristupna tačka je isključena zbog neaktivnosti.</translation> <translation id="598407983968395253">Koristi šablon</translation> <translation id="598882571027504733">Za primanje ažuriranja, ponovo pokrenite Chromebook dok je tastatura priključena.</translation> <translation id="6002179289567220515">Upotrijebili ste fizički prekidač da isključite 1 kameru. Također možete isključiti pristup za sve kamere.</translation> @@ -1376,7 +1376,7 @@ <translation id="7452560014878697800">Aplikacija koristi vašu kameru</translation> <translation id="7453330308669753048">Rezultati historije pretraživanja su uklonjeni</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do potpune napunjenosti</translation> -<translation id="7459485586006128091">Zbog interne pogreške isključena je žarišna točka. Pokušajte se povezati ponovno za nekoliko minuta.</translation> +<translation id="7459485586006128091">Pristupna tačka je isključena zbog interne greške. Pokušajte se ponovo povezati za nekoliko minuta.</translation> <translation id="7461924472993315131">PIN</translation> <translation id="746232733191930409">Način rada snimanja ekrana</translation> <translation id="7466449121337984263">Dodirnite senzor</translation> @@ -1396,7 +1396,7 @@ Da isključite uređaj, ponovo pritisnite i zadržite dugme za uključivanje na uređaju.</translation> <translation id="7526573455193969409">Mreža može biti nadzirana</translation> <translation id="7536035074519304529">IP adresa: <ph name="ADDRESS" /></translation> -<translation id="7536832381700852123">Ažuriraj lijevi prozor</translation> +<translation id="7536832381700852123">Ažuriranje lijevog prozora</translation> <translation id="7543399541175347147">Linux aplikacije i anonimni prozori trenutno nisu podržani. Druge aplikacije će se sačuvati.</translation> <translation id="7544300628205093162">Pozadinsko svjetlo tastature je uključeno</translation> <translation id="7548434653388805669">Vrijeme je za spavanje</translation> @@ -1450,7 +1450,7 @@ <translation id="776344839111254542">Kliknite da vidite detalje o ažuriranju</translation> <translation id="7768784765476638775">Odaberite za govor</translation> <translation id="7769299611924763557">GIF će uskoro biti spreman</translation> -<translation id="7773536009433685931">Umjesto toga uključite Wi-Fi</translation> +<translation id="7773536009433685931">Umjesto toga uključite WiFi</translation> <translation id="7780094051999721182">prečice</translation> <translation id="7780159184141939021">Rotiranje ekrana</translation> <translation id="7796735576426975947">Novo obavještenje je skriveno</translation> @@ -1478,7 +1478,7 @@ <translation id="7893503627044934815">Ne želim da se ovaj fajl prikazuje</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Pritisnuli ste prečicu na tastaturi za rotiranje ekrana. Želite li rotirati ekran?</translation> -<translation id="7901190436359881020">Zamijeni prozore</translation> +<translation id="7901190436359881020">Zamjena prozora</translation> <translation id="7901405293566323524">Hub telefona</translation> <translation id="7902625623987030061">Dodirnite senzor za otisak prsta</translation> <translation id="7904094684485781019">Administrator ovog računa nije dozvolio višestruku prijavu.</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 54e2611..7ff9087 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Obre la pàgina de l'historial</translation> <translation id="1654477262762802994">Inicia una consulta per veu</translation> <translation id="1668469839109562275">VPN integrada</translation> +<translation id="1675844249244994876">Actualitza la finestra dreta</translation> <translation id="1677472565718498478">Temps restant: <ph name="TIME" /></translation> <translation id="1677507110654891115">La funció <ph name="FEATURE_NAME" /> no està connectada.</translation> <translation id="1677582821739292812">Algú està mirant la teva pantalla</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">Redueix la pantalla</translation> <translation id="4936329710968938986">Tothom, desactivat</translation> <translation id="4938176435186993759">Amaga tots els suggeriments</translation> +<translation id="4943007472417128747">El punt d'accés Wi‐Fi s'ha desactivat per utilitzar la Wi‐Fi. Desactiva la Wi‐Fi per fer servir el punt d'accés Wi‐Fi.</translation> <translation id="4945196315133970626">Desactiva les notificacions</translation> <translation id="4946376291507881335">Captura</translation> <translation id="495046168593986294">Desplaça't cap amunt</translation> @@ -1385,6 +1387,7 @@ Per apagar el dispositiu, torna a mantenir premut el botó d'engegada.</translation> <translation id="7526573455193969409">És possible que la xarxa estigui supervisada</translation> <translation id="7536035074519304529">Adreça IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Actualitza la finestra esquerra</translation> <translation id="7543399541175347147">Les aplicacions de Linux i les finestres d'incògnit no s'admeten actualment. Les altres aplicacions es desaran.</translation> <translation id="7544300628205093162">La il·luminació a contrallum del teclat està activada</translation> <translation id="7548434653388805669">Ara toca anar a dormir</translation> @@ -1465,6 +1468,7 @@ <translation id="7893503627044934815">No vull que es mostri aquest fitxer</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Has premut la tecla de drecera de la rotació de la pantalla. Vols girar la pantalla?</translation> +<translation id="7901190436359881020">Canvia les finestres</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Toca el sensor d'empremtes digitals</translation> <translation id="7904094684485781019">L'administrador d'aquest compte no ha permès l'inici de sessió múltiple.</translation> @@ -1539,7 +1543,7 @@ <translation id="8214996719228530800">Canal Canary</translation> <translation id="8219451629189078428">El Chromebook ha d'estar encès i endollat durant aquest període de temps. Assegura't que els cables del carregador o de l'adaptador estiguin completament connectats, tant al Chromebook com a l'endoll. No apaguis el Chromebook.</translation> <translation id="8230305195727960608">Mode d'inversió de colors</translation> -<translation id="8233140502441622270">Obre l'aplicació de tecles de drecera</translation> +<translation id="8233140502441622270">Obre l'aplicació Tecles de drecera</translation> <translation id="8236042855478648955">Ara toca fer una pausa</translation> <translation id="8239034820133090126">Activa l'escriptori a la dreta</translation> <translation id="8246282815785366524">Et donem la benvinguda de nou, <ph name="GIVEN_NAME" /></translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index af89f45..738e0e2 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Dyfais USB-C (porth blaen)</translation> <translation id="1013598600051641573">Mae <ph name="DISPLAY_NAME" /> wedi newid i <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Cliciwch Cadarnhau i gadw'r newidiadau. Bydd y gosodiadau blaenorol yn cael eu hadfer mewn <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Hoffai'r ddyfais Bluetooth "<ph name="DEVICE_NAME" />" gael caniatâd i baru. Rhowch y cod PIN hwn ar y ddyfais honno: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Mae hyn yn caniatáu i <ph name="APP_NAME" /> a phob ap a gwefan sydd â chaniatâd lleoliad a ChromeOS ddefnyddio lleoliad Wi-Fi a rhwydweithiau symudol.</translation> <translation id="1017556409696559990">Lleihau'r ffenestr uchaf pan nad oes hanes ôl yn Chrome</translation> <translation id="1024364763893396229">Cadw eich <ph name="NAME" /></translation> <translation id="1032891413405719768">Mae batri'r pwyntil yn isel</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Agor y dudalen Hanes</translation> <translation id="1654477262762802994">Dechrau ymholiad llais</translation> <translation id="1668469839109562275">VPN integredig</translation> +<translation id="1675844249244994876">Diweddaru'r ffenestr ar y dde</translation> <translation id="1677472565718498478"><ph name="TIME" /> ar ôl</translation> <translation id="1677507110654891115">Nid yw <ph name="FEATURE_NAME" /> wedi'i gysylltu.</translation> <translation id="1677582821739292812">Mae rhywun yn edrych ar eich sgrîn</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ether-rwyd: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Troi mynediad lleoliad ymlaen</translation> <translation id="1830308660060964064">Cafodd <ph name="ITEM_TITLE" /> ei ddadbinio</translation> <translation id="1838895407229022812">Mae Golau Nos wedi'i ddiffodd.</translation> <translation id="1854180393107901205">Stopio castio</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Beth allwch chi ei wneud?</translation> <translation id="3256109297135787951">Tynnwch yr amlygu o eitem ar eich silff</translation> <translation id="3260969790895726815">Mae lleferydd yn cael ei brosesu'n lleol ac mae arddweud yn gweithio all-lein, ond ni fydd rhai gorchmynion llais yn gweithio.</translation> +<translation id="3265032511221679826">Troi mynediad union leoliad ymlaen?</translation> <translation id="3269597722229482060">De-glicio</translation> <translation id="3289364673986435196">Dewislen pŵer</translation> <translation id="3289544412142055976">Ni chefnogir apiau Linux ar hyn o bryd</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Defnyddiwr a Reolir</translation> <translation id="3666266999138159418">Sweipiwch i guddio eich ffenestr arnofio</translation> <translation id="367531336287639526">Dewis yr eicon cyntaf i'r chwith o'r bar cyfeiriad</translation> +<translation id="3677931086890821290">Mae hyn yn caniatáu i bob ap a gwefan sydd â chaniatâd lleoliad a ChromeOS ddefnyddio lleoliad Wi-Fi a rhwydweithiau symudol.</translation> <translation id="3679827876008292680">Mynd i'r tab olaf yn y ffenestr</translation> <translation id="36813544980941320">Bydd rhwydweithiau yn cael eu rhannu rhwng eich ffôn a <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Gwefannau</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Pellhau o'r sgrîn</translation> <translation id="4936329710968938986">Pawb, wedi'i ddiffodd</translation> <translation id="4938176435186993759">Cuddio'r holl awgrymiadau</translation> +<translation id="4943007472417128747">Mae'r boethfan wedi'i diffodd er mwyn defnyddio WiFi. I ddefnyddio'r boethfan, diffoddwch y WiFi.</translation> <translation id="4945196315133970626">Diffodd hysbysiadau</translation> <translation id="4946376291507881335">Tynnu sgrinlun</translation> <translation id="495046168593986294">Sgrolio i fyny</translation> @@ -1388,6 +1394,7 @@ I ddiffodd y ddyfais, pwyswch a daliwch y botwm pŵer ar y ddyfais eto.</translation> <translation id="7526573455193969409">Mae'n bosib bod y rhwydwaith yn cael ei fonitro</translation> <translation id="7536035074519304529">Cyfeiriad IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Diweddaru'r ffenestr ar y chwith</translation> <translation id="7543399541175347147">Ni chefnogir apiau Linux a ffenestri anhysbys ar hyn o bryd. Bydd apiau eraill yn cael eu cadw.</translation> <translation id="7544300628205093162">Mae ôl-olau'r bysellfwrdd ymlaen</translation> <translation id="7548434653388805669">Amser gwely</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Ddim eisiau i'r ffeil hon gael ei dangos</translation> <translation id="7895348134893321514">Tôt</translation> <translation id="7897375687985782769">Gwnaethoch bwyso'r llwybr byr bysellfwrdd ar gyfer cylchdroi'r sgrîn. Ydych chi eisiau cylchdroi'r sgrîn?</translation> +<translation id="7901190436359881020">Cyfnewid y ffenestri</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Cyffyrddwch â'r synhwyrydd olion bysedd</translation> <translation id="7904094684485781019">Mae gweinyddwr y cyfrif hwn wedi gwrthod mewngofnodi i fwy nag un cyfrif.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238">Mae cydraniad <ph name="DISPLAY_NAME" /> wedi'i newid i <ph name="RESOLUTION" />. Cliciwch Cadarnhau i gadw'r newidiadau. Bydd y gosodiadau blaenorol yn cael eu hadfer mewn <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Cysylltu <ph name="NAME" /> â'r Chromebook hwn</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Rheolir gan eich Gweinyddwr</translation> +<translation id="9207682216934703221">Mae hyn yn caniatáu i <ph name="APP_NAME" />, <ph name="APP2_NAME" /> a bob ap a gwefan sydd â chaniatâd lleoliad a ChromeOS ddefnyddio lleoliad Wi-Fi a rhwydweithiau symudol.</translation> <translation id="9210037371811586452">Wrthi'n gadael y modd bwrdd gwaith unedig</translation> <translation id="9211490828691860325">Pob desg</translation> <translation id="9211681782751733685">Mae <ph name="TIME_REMAINING" /> ar ôl nes bod y batri wedi'i wefru'n llawn.</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index 37931e3..e3b5166 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -1377,7 +1377,7 @@ <translation id="7490360161041035804">Du kan fastgøre vigtige filer, bl.a. Google Drev-filer. Fastgør ved at holde markøren over et element eller åbne Filer og højreklikke på et element.</translation> <translation id="7497767806359279797">Vælg sprog og tastatur</translation> <translation id="7508690557411636492">Åbnet inden for den seneste måned</translation> -<translation id="7509246181739783082">Bekræft din identitet</translation> +<translation id="7509246181739783082">Verificer din identitet</translation> <translation id="7513622367902644023">Screenshottilstand er valgt</translation> <translation id="7513922695575567867">Kalender for ugen med <ph name="DATE" /> – <ph name="SELECTED_DATE" /> er valgt.</translation> <translation id="7514365320538308">Download</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 86c0238..ab55208 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C-Gerät (Port vorne)</translation> <translation id="1013598600051641573">"<ph name="DISPLAY_NAME" />" wurde auf <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) umgestellt. Bitte bestätigen, um die Änderungen beizubehalten. Die vorherigen Einstellungen werden in <ph name="TIMEOUT_SECONDS" /> wiederhergestellt.</translation> <translation id="1013923882670373915">Das Bluetooth-Gerät „<ph name="DEVICE_NAME" />“ bittet um Erlaubnis für Kopplung. Gib folgenden PIN-Code auf dem Gerät ein: <ph name="PINCODE" />.</translation> +<translation id="1014722676793506285">Dies ermöglicht <ph name="APP_NAME" /> und allen Apps und Websites mit der Berechtigung zur Standortermittlung und ChromeOS, Standorte über WLAN und Mobilfunknetze zu ermitteln.</translation> <translation id="1017556409696559990">Oberes Fenster minimieren, wenn es in Chrome keinen Zurück-Verlauf gibt</translation> <translation id="1024364763893396229"><ph name="NAME" /> speichern</translation> <translation id="1032891413405719768">Die Batterie des Eingabestifts ist schwach</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Standortzugriff aktivieren</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> wurde losgelöst</translation> <translation id="1838895407229022812">Nachtlicht ist ausgeschaltet.</translation> <translation id="1854180393107901205">Übertragung beenden</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Was kannst du alles tun?</translation> <translation id="3256109297135787951">Markierung eines Elements in der Ablage entfernen</translation> <translation id="3260969790895726815">Sprachaufnahmen werden lokal verarbeitet und die Spracheingabe funktioniert offline, einige Sprachbefehle sind jedoch nicht verfügbar.</translation> +<translation id="3265032511221679826">Zugriff auf genauen Standort aktivieren?</translation> <translation id="3269597722229482060">Rechtsklick</translation> <translation id="3289364673986435196">Ein-/Aus-Menü</translation> <translation id="3289544412142055976">Linux-Apps werden derzeit nicht unterstützt</translation> @@ -577,6 +580,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Verwalteter Nutzer</translation> <translation id="3666266999138159418">Wischen, um unverankertes Fenster auszublenden</translation> <translation id="367531336287639526">Erstes Symbol links neben der Adressleiste auswählen</translation> +<translation id="3677931086890821290">Dies ermöglicht allen Apps und Websites mit der Berechtigung zur Standortermittlung und ChromeOS, Standorte über WLAN und Mobilfunknetze zu ermitteln.</translation> <translation id="3679827876008292680">Zu letztem Tab im Fenster gehen</translation> <translation id="36813544980941320">WLANs werden zwischen deinem Smartphone und <ph name="DEVICE_NAME" /> geteilt</translation> <translation id="3694122362646626770">Websites</translation> @@ -1742,6 +1746,7 @@ <translation id="9198992156681343238">Die Auflösung von <ph name="DISPLAY_NAME" /> wurde zu <ph name="RESOLUTION" /> geändert. Bitte bestätigen, um die Änderungen beizubehalten. Die vorherigen Einstellungen werden in <ph name="TIMEOUT_SECONDS" /> wiederhergestellt.</translation> <translation id="9201044636667689546"><ph name="NAME" /> mit diesem Chromebook verbinden</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, von deinem Administrator verwaltet</translation> +<translation id="9207682216934703221">Dies ermöglicht <ph name="APP_NAME" />, <ph name="APP2_NAME" /> und allen Apps und Websites mit der Berechtigung zur Standortermittlung und ChromeOS, Standorte über WLAN und Mobilfunknetze zu ermitteln.</translation> <translation id="9210037371811586452">Unified Desktop-Modus wird beendet</translation> <translation id="9211490828691860325">Alle Desktops</translation> <translation id="9211681782751733685">Noch <ph name="TIME_REMAINING" />, bis der Akku vollständig geladen ist.</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index a655e914..e362ae84 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">Πατήστε Enter για εγγραφή παραθύρου</translation> <translation id="5978382165065462689">Κοινόχρηστος έλεγχος της οθόνης σας μέσω της απομακρυσμένης βοήθειας.</translation> <translation id="5980301590375426705">Έξοδος επισκέπτη</translation> +<translation id="5983567367406220847">Λόγω αδράνειας, το σημείο πρόσβασης Wi-Fi απενεργοποιήθηκε.</translation> <translation id="598407983968395253">Χρήση προτύπου</translation> <translation id="598882571027504733">Για να λάβετε την ενημέρωση, επανεκκινήστε το Chromebook με το συνδεδεμένο πληκτρολόγιο.</translation> <translation id="6002179289567220515">Χρησιμοποιήσατε τον φυσικό διακόπτη για να απενεργοποιήσετε μία κάμερα. Μπορείτε επίσης να απενεργοποιήσετε την πρόσβαση για όλες τις κάμερες.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">Μια εφαρμογή χρησιμοποιεί την κάμερά σας.</translation> <translation id="7453330308669753048">Κατάργηση αποτελέσματος ιστορικού αναζήτησης</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> για πλήρη φόρτιση</translation> +<translation id="7459485586006128091">Λόγω εσωτερικού σφάλματος, το σημείο πρόσβασης Wi-Fi απενεργοποιήθηκε. Δοκιμάστε να συνδεθείτε ξανά σε λίγα λεπτά.</translation> <translation id="7461924472993315131">Καρφίτσωμα</translation> <translation id="746232733191930409">Λειτουργία εγγραφής οθόνης</translation> <translation id="7466449121337984263">Αγγίξτε τον αισθητήρα.</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">Κάντε κλικ, για να δείτε τις λεπτομέρειες της ενημέρωσης</translation> <translation id="7768784765476638775">Επιλέξτε για αυτόματη ανάγνωση</translation> <translation id="7769299611924763557">Το GIF θα είναι έτοιμο σύντομα</translation> +<translation id="7773536009433685931">Εναλλακτικά, ενεργοποιήστε το Wi-Fi</translation> <translation id="7780094051999721182">συντομεύσεις</translation> <translation id="7780159184141939021">Περιστροφή οθόνης</translation> <translation id="7796735576426975947">Απόκρυψη νέας ειδοποίησης</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 00e43be3..274802e 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">Press enter to record window</translation> <translation id="5978382165065462689">Sharing control of your screen via Remote Assistance.</translation> <translation id="5980301590375426705">Exit guest</translation> +<translation id="5983567367406220847">Due to inactivity, hotspot has been turned off.</translation> <translation id="598407983968395253">Use template</translation> <translation id="598882571027504733">To get the update, restart your Chromebook with the keyboard attached.</translation> <translation id="6002179289567220515">You used the physical switch to turn off one camera. You can also turn off access for all cameras.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">An application is using your camera</translation> <translation id="7453330308669753048">Search history result removed</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> until full</translation> +<translation id="7459485586006128091">Due to an internal error, hotspot has been turned off. Try reconnecting in a few minutes.</translation> <translation id="7461924472993315131">Pin</translation> <translation id="746232733191930409">Screen recording mode</translation> <translation id="7466449121337984263">Please touch the sensor</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">Click to view update details</translation> <translation id="7768784765476638775">Select to Speak</translation> <translation id="7769299611924763557">Your GIF will be ready shortly</translation> +<translation id="7773536009433685931">Turn on Wi-Fi instead</translation> <translation id="7780094051999721182">shortcuts</translation> <translation id="7780159184141939021">Rotate screen</translation> <translation id="7796735576426975947">New notification hidden</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index f5efde0..28ecc98 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Dispositivo USB-C (puerto frontal)</translation> <translation id="1013598600051641573">La resolución de <ph name="DISPLAY_NAME" /> se ha cambiado a <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Haz clic en Confirmar para mantener los cambios. La configuración anterior se restaurará en <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para emparejarse. Introduce el código PIN <ph name="PINCODE" /> en el dispositivo</translation> +<translation id="1014722676793506285">Esto permite que <ph name="APP_NAME" />, todas las aplicaciones y los sitios web que tengan el permiso de ubicación y ChromeOS utilicen la ubicación mediante Wi-Fi y redes móviles.</translation> <translation id="1017556409696559990">Minimizar ventana superior cuando no hay historial en Chrome</translation> <translation id="1024364763893396229">Guarda <ph name="NAME" /></translation> <translation id="1032891413405719768">El lápiz óptico tiene poca batería</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Abrir la página Historial</translation> <translation id="1654477262762802994">Iniciar una consulta por voz</translation> <translation id="1668469839109562275">VPN integrada</translation> +<translation id="1675844249244994876">Actualizar la ventana de la derecha</translation> <translation id="1677472565718498478">Queda: <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> no se ha conectado.</translation> <translation id="1677582821739292812">Alguien está mirando tu pantalla</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Activar acceso a la ubicación</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> ya no está fijado</translation> <translation id="1838895407229022812">Luz nocturna desactivada.</translation> <translation id="1854180393107901205">Detener el envío</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">¿Qué puedes hacer?</translation> <translation id="3256109297135787951">Dejar de destacar un elemento de la estantería</translation> <translation id="3260969790895726815">La voz se procesa de forma local y el dictado funciona sin conexión, pero algunos comandos de voz no funcionarán.</translation> +<translation id="3265032511221679826">¿Activar acceso a ubicación precisa?</translation> <translation id="3269597722229482060">Clic derecho</translation> <translation id="3289364673986435196">Menú de encendido</translation> <translation id="3289544412142055976">Por el momento no se admiten aplicaciones de Linux</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733">Usuario administrado (<ph name="USER_EMAIL_ADDRESS" />)</translation> <translation id="3666266999138159418">Desliza para ocultar tu ventana flotante</translation> <translation id="367531336287639526">Seleccionar primer icono a la izquierda de la barra de direcciones</translation> +<translation id="3677931086890821290">Esto permite que todas las aplicaciones y los sitios web que tengan el permiso de ubicación y ChromeOS utilicen la ubicación mediante Wi-Fi y redes móviles.</translation> <translation id="3679827876008292680">Ir a la última pestaña de la ventana</translation> <translation id="36813544980941320">Tu teléfono y el dispositivo <ph name="DEVICE_NAME" /> compartirán las redes Wi‑Fi</translation> <translation id="3694122362646626770">Sitios web</translation> @@ -845,6 +850,7 @@ <translation id="493076006037866439">Reducir la pantalla</translation> <translation id="4936329710968938986">Todos, desactivado</translation> <translation id="4938176435186993759">Ocultar todas las sugerencias</translation> +<translation id="4943007472417128747">El punto de acceso se ha desactivado para usar la conexión Wi-Fi. Para usar el punto de acceso, desactiva la conexión Wi‐Fi.</translation> <translation id="4945196315133970626">Desactivar las notificaciones</translation> <translation id="4946376291507881335">Hacer captura</translation> <translation id="495046168593986294">Desplazarse hacia arriba</translation> @@ -1389,6 +1395,7 @@ Para apagarlo, mantén pulsado de nuevo el botón de encendido del dispositivo.</translation> <translation id="7526573455193969409">Es posible que la red esté supervisada</translation> <translation id="7536035074519304529">Dirección IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Actualizar la ventana de la izquierda</translation> <translation id="7543399541175347147">Las aplicaciones Linux y las ventanas de Incógnito no se admiten actualmente. Se guardarán las demás aplicaciones.</translation> <translation id="7544300628205093162">La retroiluminación del teclado está activada</translation> <translation id="7548434653388805669">Es hora de acostarse</translation> @@ -1469,6 +1476,7 @@ <translation id="7893503627044934815">No quiero que este archivo se muestre</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Has pulsado la combinación de teclas que gira la pantalla. ¿Quieres girar la pantalla?</translation> +<translation id="7901190436359881020">Intercambiar las ventanas</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Toca el sensor de huellas digitales</translation> <translation id="7904094684485781019">El administrador de esta cuenta ha inhabilitado el inicio de sesión múltiple.</translation> @@ -1744,6 +1752,7 @@ <translation id="9198992156681343238">La resolución de <ph name="DISPLAY_NAME" /> se ha cambiado a <ph name="RESOLUTION" />. Haz clic en Confirmar para mantener los cambios. La configuración anterior se restaurará en <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Conecta <ph name="NAME" /> a este Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, gestionada por el administrador</translation> +<translation id="9207682216934703221">Esto permite que <ph name="APP_NAME" />, <ph name="APP2_NAME" />, todas las aplicaciones y los sitios web que tengan el permiso de ubicación y ChromeOS utilicen la ubicación mediante Wi-Fi y redes móviles.</translation> <translation id="9210037371811586452">Saliendo del modo Escritorio unificado</translation> <translation id="9211490828691860325">Todos los escritorios</translation> <translation id="9211681782751733685">Tiempo restante para que se cargue totalmente la batería: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 53fe472..35547e4 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Lehe Ajalugu avamine</translation> <translation id="1654477262762802994">Häälpäringu alustamine</translation> <translation id="1668469839109562275">Sisseehitatud VPN</translation> +<translation id="1675844249244994876">Värskenda paremat akent</translation> <translation id="1677472565718498478"><ph name="TIME" /> tühjenemiseni</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> pole ühendatud.</translation> <translation id="1677582821739292812">Keegi vaatab teie ekraanikuva</translation> @@ -849,6 +850,7 @@ <translation id="493076006037866439">Suumi ekraanil välja</translation> <translation id="4936329710968938986">Kõik, väljas</translation> <translation id="4938176435186993759">Peida kõik soovitused</translation> +<translation id="4943007472417128747">Kuumkoht on WiFi kasutamiseks välja lülitatud. Kuumkoha kasutamiseks lülitage WiFi välja.</translation> <translation id="4945196315133970626">Märguannete väljalülitamine</translation> <translation id="4946376291507881335">Jäädvusta</translation> <translation id="495046168593986294">Keri üles</translation> @@ -1393,6 +1395,7 @@ Seadme väljalülitamiseks vajutage uuesti pikalt seadme toitenuppu.</translation> <translation id="7526573455193969409">Võrku võidakse jälgida</translation> <translation id="7536035074519304529">IP-adress: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Värskenda vasakut akent</translation> <translation id="7543399541175347147">Linuxi rakendusi ja inkognito aknaid praegu ei toetata. Muud rakendused salvestatakse.</translation> <translation id="7544300628205093162">Klaviatuuri taustavalgus on sisse lülitatud</translation> <translation id="7548434653388805669">Aeg magama minna</translation> @@ -1473,6 +1476,7 @@ <translation id="7893503627044934815">Ei soovi seda faili näha</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Vajutasite ekraanikuva pööramise otseteed. Kas soovite ekraanikuva pöörata?</translation> +<translation id="7901190436359881020">Vaheta aknad</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Puudutage sõrmejäljeandurit</translation> <translation id="7904094684485781019">Selle konto administraator on mitmesse kontosse sisselogimise keelanud.</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 2ece361..8ad66a9 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">دستگاه USB-C (درگاه جلو)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> به <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> هرتز) تغییر کرد. برای حفظ تغییرات، روی تأیید کلیک کنید. تنظیمات قبلی <ph name="TIMEOUT_SECONDS" /> دیگر بازیابی خواهد شد.</translation> <translation id="1013923882670373915">دستگاه بلوتوث «<ph name="DEVICE_NAME" />» برای مرتبطسازی به مجوز نیاز دارد. لطفاً این کد پین را در آن دستگاه وارد کنید: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">به <ph name="APP_NAME" /> و همه برنامهها و وبسایتهایی که اجازه دسترسی مکان دارند و ChromeOS اجازه داده میشود از مکان شبکه تلفن همراه و Wi-Fi استفاده کنند.</translation> <translation id="1017556409696559990">کوچک کردن پنجره بالایی وقتی سابقه قبلی در Chrome وجود ندارد</translation> <translation id="1024364763893396229">ذخیره کردن <ph name="NAME" /></translation> <translation id="1032891413405719768">شارژ باتری قلم کم است</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">باز کردن صفحه سابقه</translation> <translation id="1654477262762802994">شروع پُرسمان صوتی</translation> <translation id="1668469839109562275">VPN داخلی</translation> +<translation id="1675844249244994876">بهروزرسانی پنجره راست</translation> <translation id="1677472565718498478"><ph name="TIME" /> باقیمانده</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> متصل نیست.</translation> <translation id="1677582821739292812">فردی درحال نگاه کردن به صفحهنمایش شما است</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">اترنت: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">روشن کردن دسترسی به مکان</translation> <translation id="1830308660060964064">پین <ph name="ITEM_TITLE" /> برداشته شد</translation> <translation id="1838895407229022812">«نور شب» خاموش است</translation> <translation id="1854180393107901205">توقف فرستادن</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">What can you do? (چه کاری میتوانی انجام دهی؟)</translation> <translation id="3256109297135787951">حذف برجستهسازی از مورد روی قفسه</translation> <translation id="3260969790895726815">گفتار بهصورت محلی پردازش میشود و ویژگی دیکته آفلاین کار میکند، اما برخیاز فرمانهای صوتی کار نخواهند کرد.</translation> +<translation id="3265032511221679826">دسترسی به مکان دقیق روشن شود؟</translation> <translation id="3269597722229482060">کلیک راست</translation> <translation id="3289364673986435196">منوی روشن/خاموش</translation> <translation id="3289544412142055976">درحالحاضر از برنامههای Linux پشتیبانی نمیشود</translation> @@ -577,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> کاربر مدیریتشده</translation> <translation id="3666266999138159418">برای پنهان کردن پنجره شناور، تند بکشید</translation> <translation id="367531336287639526">انتخاب اولین نماد در سمت راست نوار نشانی</translation> +<translation id="3677931086890821290">با این کار، همه برنامهها و وبسایتهای دارای اجازه مکان و ChromeOS مجاز میشوند از مکان شبکههای تلفن همراه و Wi-Fi استفاده کنند.</translation> <translation id="3679827876008292680">رفتن به آخرین برگه در پنجره</translation> <translation id="36813544980941320">تلفنتان و <ph name="DEVICE_NAME" /> باهم از شبکههای Wi-Fi استفاده خواهند کرد</translation> <translation id="3694122362646626770">وبسایتها</translation> @@ -843,6 +848,7 @@ <translation id="493076006037866439">زومپس کردن صفحهنمایش</translation> <translation id="4936329710968938986">همه، خاموش</translation> <translation id="4938176435186993759">پنهان کردن همه پیشنهادها</translation> +<translation id="4943007472417128747">نقطه اتصال برای استفاده از Wi-Fi خاموش شده است. برای استفاده از نقطه اتصال، Wi-Fi را خاموش کنید.</translation> <translation id="4945196315133970626">غیرفعال کردن اعلانها</translation> <translation id="4946376291507881335">ضبط</translation> <translation id="495046168593986294">پیمایش به بالا</translation> @@ -1387,6 +1393,7 @@ برای خاموش کردن دستگاه، دکمه روشن/خاموش روی دستگاه را دوباره فشار دهید و نگه دارید.</translation> <translation id="7526573455193969409">ممکن است شبکه پایش شود</translation> <translation id="7536035074519304529">نشانی IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">بهروزرسانی پنجره چپ</translation> <translation id="7543399541175347147">درحالحاضر از برنامههای Linux و پنجرههای «ناشناس» پشتیبانی نمیشود. برنامههای دیگر ذخیره خواهد شد.</translation> <translation id="7544300628205093162">نور پسزمینه صفحهکلید روشن شد</translation> <translation id="7548434653388805669">وقت خواب</translation> @@ -1467,6 +1474,7 @@ <translation id="7893503627044934815">نمیخواهم این فایل نشان داده شود</translation> <translation id="7895348134893321514">نگهدارنده</translation> <translation id="7897375687985782769">میانبر صفحهکلید مربوط به چرخش صفحه را فشار دادید. میخواهید صفحه را بچرخانید؟</translation> +<translation id="7901190436359881020">جابهجا کردن پنجرهها</translation> <translation id="7901405293566323524">مرکز تلفن</translation> <translation id="7902625623987030061">حسگر اثر انگشت را لمس کنید</translation> <translation id="7904094684485781019">سرپرست این حساب اجازه ورود چندگانه به سیستم را نمیدهد.</translation> @@ -1741,6 +1749,7 @@ <translation id="9198992156681343238">وضوح <ph name="DISPLAY_NAME" /> به <ph name="RESOLUTION" /> تغییر کرد. برای حفظ تغییرات، روی تأیید کلیک کنید. تنظیمات قبلی <ph name="TIMEOUT_SECONDS" /> دیگر بازیابی خواهد شد.</translation> <translation id="9201044636667689546"><ph name="NAME" /> را به این Chromebook متصل کنید</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />، تحتمدیریت سرپرست</translation> +<translation id="9207682216934703221">با این کار، <ph name="APP_NAME" />، <ph name="APP2_NAME" />، و همه برنامهها و وبسایتهای دارای اجازه مکان و ChromeOS مجاز میشوند از مکان شبکههای تلفن همراه و Wi-Fi استفاده کنند.</translation> <translation id="9210037371811586452">خروج از حالت میزکار یکپارچه</translation> <translation id="9211490828691860325">همه میزکارها</translation> <translation id="9211681782751733685"><ph name="TIME_REMAINING" /> زمان تا شارژ کامل باتری باقیمانده است.</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 74cf6c7..74e4922 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">C-tyypin USB-laite (etuportti)</translation> <translation id="1013598600051641573">Näytön <ph name="DISPLAY_NAME" /> resoluutioksi vaihdettiin <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Pidä muutokset valitsemalla Vahvista. Aiempi asetus palautetaan <ph name="TIMEOUT_SECONDS" /> päästä.</translation> <translation id="1013923882670373915">Bluetooth-laite <ph name="DEVICE_NAME" /> pyytää lupaa laiteparin muodostamiseen. Anna tämä PIN-koodi kyseisellä laitteella: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Tämän ansiosta <ph name="APP_NAME" /> ja kaikki sovellukset ja verkkosivustot, joilla on sijaintilupa, sekä ChromeOS voivat käyttää Wi-Fi- ja mobiiliverkkojen sijaintia.</translation> <translation id="1017556409696559990">Pienennä yläikkuna, kun Chromella ei ole Takaisin-historiaa</translation> <translation id="1024364763893396229">Tallenna <ph name="NAME" /></translation> <translation id="1032891413405719768">Näyttökynän akku on vähissä</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Avaa Historia-sivu</translation> <translation id="1654477262762802994">Aloita puhekysely</translation> <translation id="1668469839109562275">Sisäänrakennettu VPN</translation> +<translation id="1675844249244994876">Päivitä oikeanpuoleinen ikkuna</translation> <translation id="1677472565718498478"><ph name="TIME" /> jäljellä</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ei ole yhdistetty.</translation> <translation id="1677582821739292812">Joku katsoo näyttöäsi</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Laita sijainti päälle</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> irrotettiin</translation> <translation id="1838895407229022812">Yövalo on pois päältä.</translation> <translation id="1854180393107901205">Lopeta suoratoisto</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Mitä osaat tehdä?</translation> <translation id="3256109297135787951">Poista korostus hyllyssä olevasta kohteesta</translation> <translation id="3260969790895726815">Puhe käsitellään paikallisesti ja sanelu toimii ilman verkkoyhteyttä, mutta jotkin äänikomennot eivät toimi.</translation> +<translation id="3265032511221679826">Sallitaanko tarkan sijainnin käyttö?</translation> <translation id="3269597722229482060">Klikkaa kakkospainiketta</translation> <translation id="3289364673986435196">Virtavalikko</translation> <translation id="3289544412142055976">Linux-sovelluksia ei tällä hetkellä tueta</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> ylläpidetty käyttäjä</translation> <translation id="3666266999138159418">Piilota kelluva ikkuna pyyhkäisemällä</translation> <translation id="367531336287639526">Valitse ensimmäinen kuvake osoitepalkin vasemmalta puolelta</translation> +<translation id="3677931086890821290">Tämän ansiosta kaikki sovellukset ja verkkosivustot, joilla on sijaintilupa, sekä ChromeOS voivat käyttää Wi-Fi- ja mobiiliverkkojen sijaintia.</translation> <translation id="3679827876008292680">Siirry ikkunan viimeiselle välilehdelle</translation> <translation id="36813544980941320">Wi-Fi-verkot jaetaan puhelimesi ja <ph name="DEVICE_NAME" />-laitteesi välillä</translation> <translation id="3694122362646626770">Verkkosivustot</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Loitonna näkymää</translation> <translation id="4936329710968938986">Kaikki, pois päältä</translation> <translation id="4938176435186993759">Piilota kaikki ehdotukset</translation> +<translation id="4943007472417128747">Hotspot on laitettu pois päältä, jotta voit käyttää Wi-Fi-yhteyttä. Jos haluat käyttää hotspotia, laita Wi-Fi pois päältä.</translation> <translation id="4945196315133970626">Laita ilmoitukset pois päältä</translation> <translation id="4946376291507881335">Kuvakaappaus</translation> <translation id="495046168593986294">Vieritä ylös</translation> @@ -1166,7 +1172,7 @@ <translation id="6459472438155181876">Ruutua laajennetaan: <ph name="DISPLAY_NAME" /></translation> <translation id="6477681113376365978">Tiedostoa ei voi ladata</translation> <translation id="6482559668224714696">Koko näytön suurennus</translation> -<translation id="6483727822843292440">Selaa ikkunoita vähiten käytetyn ikkunan kautta</translation> +<translation id="6483727822843292440">Selaa ikkunoita alkaen viimeiseksi käytetystä ikkunasta</translation> <translation id="6490471652906364588">C-tyypin USB-laite (oikean sivun portti)</translation> <translation id="6491071886865974820"><ph name="MANAGER" /> edellyttää, että <ph name="DEVICE_TYPE" /> on päivitetty määräaikaan mennessä</translation> <translation id="649452524636452238">Älykortin PIN-koodi</translation> @@ -1388,6 +1394,7 @@ Sammuta laite painamalla sen virtapainiketta pitkään uudelleen.</translation> <translation id="7526573455193969409">Verkkoa saatetaan valvoa</translation> <translation id="7536035074519304529">IP-osoite: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Päivitä vasemmanpuoleinen ikkuna</translation> <translation id="7543399541175347147">Linux-sovelluksia ja incognito-ikkunoita ei tällä hetkellä tueta. Muut sovellukset tallennetaan.</translation> <translation id="7544300628205093162">Näppäimistön taustavalo on päällä</translation> <translation id="7548434653388805669">Nukkumaanmenoaika</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">En halua, että tämä tiedosto näkyy</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Painoit näytön kääntämisen pikanäppäintä. Haluatko kääntää näytön?</translation> +<translation id="7901190436359881020">Vaihda ikkunoita</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Kosketa sormenjälkitunnistinta</translation> <translation id="7904094684485781019">Tämän tilin järjestelmänvalvoja on estänyt useisiin tileihin kirjautumisen.</translation> @@ -1742,6 +1750,7 @@ <translation id="9198992156681343238">Näytön <ph name="DISPLAY_NAME" /> resoluutioksi vaihdettiin <ph name="RESOLUTION" />. Pidä muutokset valitsemalla Vahvista. Aiempi asetus palautetaan <ph name="TIMEOUT_SECONDS" /> päästä.</translation> <translation id="9201044636667689546">Yhdistä <ph name="NAME" /> tähän Chromebookiin</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, järjestelmänvalvojan hallinnoima</translation> +<translation id="9207682216934703221">Tämän ansiosta <ph name="APP_NAME" />, <ph name="APP2_NAME" /> ja kaikki sovellukset ja verkkosivustot, joilla on sijaintilupa, sekä ChromeOS voivat käyttää Wi-Fi- ja mobiiliverkkojen sijaintia.</translation> <translation id="9210037371811586452">Poistutaan yhtenäisen työpöydän tilasta</translation> <translation id="9211490828691860325">Kaikki työpöydät</translation> <translation id="9211681782751733685">Akku on ladattu täyteen <ph name="TIME_REMAINING" /> kuluttua.</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index e784a5ae1..449e3d37 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C device (port sa harap)</translation> <translation id="1013598600051641573">Ginawang <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) ang <ph name="DISPLAY_NAME" />. I-click ang kumpirmahin para panatilihin ang mga pagbabago. Ire-restore ang mga nakaraang setting pagkalipas ng <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Gusto ng bluetooth device na "<ph name="DEVICE_NAME" />" ng pahintulot na magpares. Pakilagay ang PIN na ito sa device na iyon: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Binibigyang-daan nito ang <ph name="APP_NAME" /> at lahat ng app at website na may pahintulot sa lokasyon at ChromeOS na gumamit ng Wi-Fi at lokasyon ng mga mobile network.</translation> <translation id="1017556409696559990">I-minimize ang nasa ibabaw na window kapag walang history ng pagbalik sa Chrome</translation> <translation id="1024364763893396229">I-save ang iyong <ph name="NAME" /></translation> <translation id="1032891413405719768">Mahina na ang baterya ng stylus</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Buksan ang page ng History</translation> <translation id="1654477262762802994">Magsimula ng query gamit ang boses</translation> <translation id="1668469839109562275">Built-in na VPN</translation> +<translation id="1675844249244994876">I-update ang kanang window</translation> <translation id="1677472565718498478"><ph name="TIME" /> na lang ang natitira</translation> <translation id="1677507110654891115">Hindi nakakonekta ang <ph name="FEATURE_NAME" />.</translation> <translation id="1677582821739292812">May taong tumitingin sa iyong screen</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">I-on ang access sa lokasyon</translation> <translation id="1830308660060964064">Na-unpin ang <ph name="ITEM_TITLE" /></translation> <translation id="1838895407229022812">Naka-off ang Night Light.</translation> <translation id="1854180393107901205">Ihinto ang pagka-cast</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Ano'ng maaari mong gawin?</translation> <translation id="3256109297135787951">Nag-aalis ng highlight sa isang item sa iyong shelf</translation> <translation id="3260969790895726815">Lokal na pinoproseso ang speech at gumagana offline ang dictation, pero hindi gagana ang ilang command gamit ang boses.</translation> +<translation id="3265032511221679826">I-on ang access sa eksaktong lokasyon?</translation> <translation id="3269597722229482060">Mag-right Click</translation> <translation id="3289364673986435196">Power menu</translation> <translation id="3289544412142055976">Kasalukuyang hindi sinusuportahan ang mga Linux app.</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733">Pinapamahalaang user na <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Mag-swipe para i-hide ang iyong naka-float na window</translation> <translation id="367531336287639526">Piliin ang unang icon sa kaliwa ng address bar</translation> +<translation id="3677931086890821290">Binibigyang-daan nito ang lahat ng app at website na may pahintulot sa lokasyon at ChromeOS na gumamit ng Wi-Fi at lokasyon ng mga mobile network.</translation> <translation id="3679827876008292680">Pumunta sa huling tab sa window</translation> <translation id="36813544980941320">Ibabahagi ang mga Wi-Fi network sa pagitan ng iyong telepono at <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Mga Website</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Mag-zoom out sa screen</translation> <translation id="4936329710968938986">Lahat, naka-off</translation> <translation id="4938176435186993759">I-hide ang lahat ng suhestyon</translation> +<translation id="4943007472417128747">Na-off ang Hotspot para gamitin ang WiFi. Para gamitin ang Hotspot, i-off ang WiFi.</translation> <translation id="4945196315133970626">I-off ang mga notification</translation> <translation id="4946376291507881335">I-capture</translation> <translation id="495046168593986294">Mag-scroll pataas</translation> @@ -1388,6 +1394,7 @@ Para i-shut down ang device, pindutin ulit nang matagal ang power button sa device.</translation> <translation id="7526573455193969409">Maaaring sinusubaybayan ang network</translation> <translation id="7536035074519304529">IP address: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">I-update ang kaliwang window</translation> <translation id="7543399541175347147">Kasalukuyang hindi sinusuportahan ang mga Linux app at Incognito window. Mase-save ang iba pang app.</translation> <translation id="7544300628205093162">Na-on ang backlight ng keyboard</translation> <translation id="7548434653388805669">Oras nang matulog</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Ayaw ipakita ang file na ito</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Napindot mo ang keyboard shortcut para sa pag-rotate ng screen. Gusto mo bang i-rotate ang screen?</translation> +<translation id="7901190436359881020">Ipagpalit ang mga window</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Pindutin ang fingerprint sensor</translation> <translation id="7904094684485781019">Hindi pinayagan ng administrator para sa account na ito ang multiple na pag-sign in.</translation> @@ -1742,6 +1750,7 @@ <translation id="9198992156681343238">Ginawang <ph name="RESOLUTION" /> ang resolution ng <ph name="DISPLAY_NAME" />. I-click ang kumpirmahin para panatilihin ang mga pagbabago. Ire-restore ang mga dating setting pagkalipas ng <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Ikonekta ang <ph name="NAME" /> sa Chromebook na ito</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Pinapamahalaan ng iyong Administrator</translation> +<translation id="9207682216934703221">Binibigyang-daan nito ang <ph name="APP_NAME" />, <ph name="APP2_NAME" />, at lahat ng app at website na may pahintulot sa lokasyon at ChromeOS na gumamit ng Wi-Fi at lokasyon ng mga mobile network.</translation> <translation id="9210037371811586452">Lumalabas sa unified desktop mode</translation> <translation id="9211490828691860325">Lahat ng desk</translation> <translation id="9211681782751733685"><ph name="TIME_REMAINING" /> ang natitira bago ma-charge nang kumpleto ang baterya.</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 4741809..320dfd9 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Ouvrir la page "Historique"</translation> <translation id="1654477262762802994">Soumettre une requête vocale</translation> <translation id="1668469839109562275">VPN intégré</translation> +<translation id="1675844249244994876">Mettre à jour la fenêtre de droite</translation> <translation id="1677472565718498478">Temps restant : <ph name="TIME" /></translation> <translation id="1677507110654891115">La fonctionnalité <ph name="FEATURE_NAME" /> n'est pas connectée.</translation> <translation id="1677582821739292812">Quelqu'un regarde votre écran</translation> @@ -843,6 +844,7 @@ <translation id="493076006037866439">Faire un zoom arrière sur l'écran</translation> <translation id="4936329710968938986">Tout le monde, désactivé</translation> <translation id="4938176435186993759">Masquer toutes les suggestions</translation> +<translation id="4943007472417128747">Le point d'accès a été désactivé pour utiliser le Wi-Fi. Pour utiliser le point d'accès, désactivez le Wi-Fi.</translation> <translation id="4945196315133970626">Désactiver les notifications</translation> <translation id="4946376291507881335">Capturer</translation> <translation id="495046168593986294">Faire défiler vers le haut</translation> @@ -1386,6 +1388,7 @@ Pour éteindre l'appareil, appuyez à nouveau de manière prolongée sur le bouton Marche/Arrêt.</translation> <translation id="7526573455193969409">Il est possible que le réseau soit surveillé</translation> <translation id="7536035074519304529">Adresse IP : <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Mettre à jour la fenêtre de gauche</translation> <translation id="7543399541175347147">Les applis Linux et les fenêtres de navigation privée ne sont pas prises en charge pour le moment. Les autres applis seront enregistrées.</translation> <translation id="7544300628205093162">Le rétroéclairage du clavier est activé</translation> <translation id="7548434653388805669">Il est l'heure d'aller au lit</translation> @@ -1466,6 +1469,7 @@ <translation id="7893503627044934815">Je ne souhaite pas que ce fichier soit affiché</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Vous avez appuyé sur le raccourci clavier de rotation d'écran. Voulez-vous faire pivoter l'écran ?</translation> +<translation id="7901190436359881020">Intervertir les fenêtres</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Appuyez sur le lecteur d'empreinte</translation> <translation id="7904094684485781019">L'administrateur de ce compte a désactivé la connexion multicompte.</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index 4516c6f..0baf4715f 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Dispositivo USB‑C (porto frontal)</translation> <translation id="1013598600051641573">A resolución do dispositivo <ph name="DISPLAY_NAME" /> cambiouse a <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Para gardar os cambios, fai clic en Confirmar. A configuración anterior restaurarase en <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">O dispositivo Bluetooth "<ph name="DEVICE_NAME" />" quere recibir permiso para sincronizarse. Introduce este código PIN nese dispositivo: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Desta forma, <ph name="APP_NAME" />, todas as aplicacións e os sitios web con permiso de localización e ChromeOS poden utilizar a localización mediante wifi e redes de telefonía móbil.</translation> <translation id="1017556409696559990">Minimizar ventá superior cando non haxa historial en Chrome</translation> <translation id="1024364763893396229">Garda o dispositivo (<ph name="NAME" />)</translation> <translation id="1032891413405719768">O lapis óptico ten pouca batería</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Activar acceso á localización</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> (soltouse)</translation> <translation id="1838895407229022812">A función Luz nocturna está desactivada.</translation> <translation id="1854180393107901205">Deter emisión</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Que podes facer?</translation> <translation id="3256109297135787951">Deixa de destacar un elemento do estante</translation> <translation id="3260969790895726815">A voz procésase localmente e o ditado funciona sen conexión, pero algúns comandos de voz non funcionarán.</translation> +<translation id="3265032511221679826">Queres activar o acceso á localización precisa?</translation> <translation id="3269597722229482060">Facer clic co botón dereito</translation> <translation id="3289364673986435196">Menú de acendido</translation> <translation id="3289544412142055976">As aplicación de Linux agora mesmo non son compatibles</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Usuario xestionado</translation> <translation id="3666266999138159418">Pasa o dedo para ocultar a ventá flotante</translation> <translation id="367531336287639526">Selecciona a primeira icona á esquerda da barra de enderezos</translation> +<translation id="3677931086890821290">Desta forma, todas as aplicacións e os sitios web con permiso de localización e ChromeOS poden utilizar a localización mediante wifi e redes de telefonía móbil.</translation> <translation id="3679827876008292680">Ir á última pestana da ventá</translation> <translation id="36813544980941320">O teu teléfono e o dispositivo (<ph name="DEVICE_NAME" />) compartirán as redes wifi</translation> <translation id="3694122362646626770">Sitios web</translation> @@ -1744,6 +1748,7 @@ <translation id="9198992156681343238">A resolución de <ph name="DISPLAY_NAME" /> cambiouse a <ph name="RESOLUTION" />. Para gardar os cambios, fai clic en Confirmar. A configuración anterior restaurarase en <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Conecta o dispositivo (<ph name="NAME" />) a este Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, xestionada polo teu administrador</translation> +<translation id="9207682216934703221">Desta forma, <ph name="APP_NAME" />, <ph name="APP2_NAME" /> e todas as aplicacións e os sitios web con permiso de localización e ChromeOS poden utilizar a localización mediante wifi e redes de telefonía móbil.</translation> <translation id="9210037371811586452">Saíndo do modo de escritorio unificado</translation> <translation id="9211490828691860325">Todos os ordenadores</translation> <translation id="9211681782751733685">Tempo restante para que se cargue a batería por completo: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 436b5f9..7a47569 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">ઇતિહાસ પેજ ખોલો</translation> <translation id="1654477262762802994">વૉઇસ ક્વેરી શરૂ કરો</translation> <translation id="1668469839109562275">બિલ્ટ-ઇન VPN</translation> +<translation id="1675844249244994876">જમણી વિન્ડો અપડેટ કરો</translation> <translation id="1677472565718498478"><ph name="TIME" /> બાકી</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> કનેક્ટ કરેલું નથી.</translation> <translation id="1677582821739292812">કોઈ વ્યક્તિ તમારી સ્ક્રીન જોઈ રહી છે</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">સ્ક્રીનને નાની કરો</translation> <translation id="4936329710968938986">પ્રત્યેક, બંધ</translation> <translation id="4938176435186993759">બધા સૂચનો છુપાવો</translation> +<translation id="4943007472417128747">વાઇ-ફાઇનો ઉપયોગ કરવા માટે હૉટસ્પૉટ બંધ કરવામાં આવ્યું છે. હૉટસ્પૉટનો ઉપયોગ કરવા માટે, વાઇ-ફાઇ બંધ કરો.</translation> <translation id="4945196315133970626">નોટિફિકેશન બંધ કરો</translation> <translation id="4946376291507881335">કૅપ્ચર કરો</translation> <translation id="495046168593986294">ઉપર સ્ક્રોલ કરો</translation> @@ -1388,6 +1390,7 @@ ડિવાઇસ શટ ડાઉન કરવા માટે, ફરીથી ડિવાઇસ પરનું પાવર બટન દબાવી રાખો.</translation> <translation id="7526573455193969409">નેટવર્કને મોનિટર કરવામાં આવી શકે છે</translation> <translation id="7536035074519304529">IP સરનામું: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">ડાબી વિન્ડો અપડેટ કરો</translation> <translation id="7543399541175347147">Linux ઍપ અને છૂપી વિન્ડોને હાલમાં સપોર્ટ કરવામાં આવતો નથી. અન્ય ઍપ સાચવવામાં આવશે.</translation> <translation id="7544300628205093162">કીબોર્ડની બૅકલાઇટ ચાલુ છે</translation> <translation id="7548434653388805669">સૂવાનો સમય</translation> @@ -1468,6 +1471,7 @@ <translation id="7893503627044934815">આ ફાઇલ બતાવવા માગતા નથી</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">તમે સ્ક્રીનને ફેરવવા માટે કીબોર્ડ શૉર્ટકટ દબાવેલ છે. શું તમે સ્ક્રીનને ફેરવવા માગો છો?</translation> +<translation id="7901190436359881020">વિન્ડો સ્વૉપ કરો</translation> <translation id="7901405293566323524">ફોન હબ</translation> <translation id="7902625623987030061">ફિંગરપ્રિન્ટ સેન્સરને ટચ કરો</translation> <translation id="7904094684485781019">આ એકાઉન્ટ માટે વ્યસ્થાપકે એકથી વધુ સાઇન ઇનને નામંજૂર કર્યું છે.</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index 7328512..88bbf3c 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C डिवाइस (सामने वाला पोर्ट)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> को <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> हर्ट्ज़) में बदला गया. बदलाव बनाए रखने के लिए, 'जारी रखें' पर क्लिक करें. सेटिंग को <ph name="TIMEOUT_SECONDS" /> में पहले जैसा किया जाएगा.</translation> <translation id="1013923882670373915">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" युग्मित करने की अनुमति चाहता है. कृपया उस डिवाइस पर यह पिन कोड डालें: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">इससे <ph name="APP_NAME" /> के साथ-साथ अन्य सभी ऐप्लिकेशन और वेबसाइटों को जगह की जानकारी को ऐक्सेस करने की अनुमति मिलती है. साथ ही, ChromeOS को वाई-फ़ाई और मोबाइल नेटवर्क की जगह की जानकारी को इस्तेमाल करने की अनुमति मिलती है.</translation> <translation id="1017556409696559990">Chrome में गतिविधि का कोई पिछला इतिहास न होने पर, सबसे ऊपर वाली विंडो को छोटा करें</translation> <translation id="1024364763893396229"><ph name="NAME" /> को सेव करें</translation> <translation id="1032891413405719768">स्टाइलस की बैटरी कम हो गई है</translation> @@ -192,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ईथरनेट: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">जगह की जानकारी शेयर करने की सुविधा चालू करें</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> को अनपिन किया गया</translation> <translation id="1838895407229022812">नाइट लाइट बंद है.</translation> <translation id="1854180393107901205">कास्ट करना रोकें</translation> @@ -469,6 +471,7 @@ <translation id="3255483164551725916">तुम क्या-क्या कर सकती हो?</translation> <translation id="3256109297135787951">अपने शेल्फ़ पर मौजूद किसी आइटम से हाइलाइट हटाएं</translation> <translation id="3260969790895726815">बोली को स्थानीय तौर पर प्रोसेस किया जाता है और बोलकर लिखवाने की सुविधा ऑफ़लाइन काम करती है. हालांकि, बोले गए कुछ निर्देश काम नहीं करेंगे.</translation> +<translation id="3265032511221679826">क्या आपको जगह की सटीक जानकारी शेयर करने की सुविधा चालू करनी है?</translation> <translation id="3269597722229482060">दायां क्लिक करें</translation> <translation id="3289364673986435196">पावर मेन्यू</translation> <translation id="3289544412142055976">फ़िलहाल, Linux ऐप्लिकेशन के लिए यह सुविधा उपलब्ध नहीं है</translation> @@ -579,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> प्रबंधित उपयोगकर्ता</translation> <translation id="3666266999138159418">फ़्लोटिंग विंडो को छिपाने के लिए स्वाइप करें</translation> <translation id="367531336287639526">पता बार की बाईं ओर पहले आइकॉन को चुनने के लिए</translation> +<translation id="3677931086890821290">इससे सभी ऐप्लिकेशन और वेबसाइटों को जगह की जानकारी को ऐक्सेस करने की अनुमति मिलती है. साथ ही, ChromeOS को वाई-फ़ाई और मोबाइल नेटवर्क की जगह की जानकारी को इस्तेमाल करने की अनुमति मिलती है.</translation> <translation id="3679827876008292680">विंडो में आखिरी टैब पर जाएं</translation> <translation id="36813544980941320">आपके फ़ोन और <ph name="DEVICE_NAME" /> के बीच वाई-फ़ाई नेटवर्क शेयर किए जाएंगे</translation> <translation id="3694122362646626770">वेबसाइट</translation> @@ -1748,6 +1752,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> का रिज़ॉल्यूशन बदलकर <ph name="RESOLUTION" /> कर दिया गया है. बदलाव बनाए रखने के लिए, 'जारी रखें' पर क्लिक करें. सेटिंग को <ph name="TIMEOUT_SECONDS" /> में पहले जैसा दिया जाएगा.</translation> <translation id="9201044636667689546"><ph name="NAME" /> को इस Chromebook से कनेक्ट करें</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, आपका एडमिन मैनेज करता है</translation> +<translation id="9207682216934703221">इससे <ph name="APP_NAME" /> और <ph name="APP2_NAME" /> के साथ-साथ अन्य सभी ऐप्लिकेशन और वेबसाइटों को जगह की जानकारी को ऐक्सेस करने की अनुमति मिलती है. साथ ही, ChromeOS को वाई-फ़ाई और मोबाइल नेटवर्क की जगह की जानकारी को इस्तेमाल करने की अनुमति मिलती है.</translation> <translation id="9210037371811586452">संयुक्त डेस्कटॉप मोड से बाहर निकाला जा रहा है</translation> <translation id="9211490828691860325">सभी डेस्क</translation> <translation id="9211681782751733685">बैटरी के पूरी तरह से चार्ज होने में<ph name="TIME_REMAINING" /> का समय बाकी है.</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index 9f6581c..afcb14a 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">C típusú USB-vel kompatibilis eszköz (elülső port)</translation> <translation id="1013598600051641573">A(z) <ph name="DISPLAY_NAME" /> felbontása a következőre módosult: <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). A módosítás megtartásához kattintson a Megerősítés gombra. A beállítás <ph name="TIMEOUT_SECONDS" /> múlva visszaáll a korábbi értékre.</translation> <translation id="1013923882670373915">A(z) „<ph name="DEVICE_NAME" />” Bluetooth-eszköz engedélyt kér a párosításra. Kérjük, adja meg ezt a PIN kódot azon az eszközön: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Ezzel lehetővé teszi a(z) <ph name="APP_NAME" />, valamint a helymeghatározási jogosultsággal rendelkező és ChromeOS-t futtató alkalmazások és webhelyek mindegyike számára, hogy használják a Wi-Fi- és a mobilhálózatok helyadatait.</translation> <translation id="1017556409696559990">A legfelső ablak kis méretre állítása, ha nincsenek előzmények a Chrome-ban</translation> <translation id="1024364763893396229"><ph name="NAME" /> eszközének mentése</translation> <translation id="1032891413405719768">Az érintőceruza töltöttségi szintje alacsony</translation> @@ -191,6 +192,7 @@ <ph name="IME" />, <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Helyhozzáférés bekapcsolása</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> rögzítése feloldva</translation> <translation id="1838895407229022812">Az Éjszakai fény ki van kapcsolva.</translation> <translation id="1854180393107901205">Átküldés leállítása</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Mit lehet csinálni?</translation> <translation id="3256109297135787951">A kiemelés eltávolítása a polcon található elemről</translation> <translation id="3260969790895726815">A beszéd feldolgozása helyben történik, a diktálás pedig offline is működik, egyes hangalapú utasítások azonban nem lesznek használhatók.</translation> +<translation id="3265032511221679826">Bekapcsolja a pontos helyhez való hozzáférést?</translation> <translation id="3269597722229482060">Kattintás jobb egérgombbal</translation> <translation id="3289364673986435196">Bekapcsológombhoz tartozó menü</translation> <translation id="3289544412142055976">A Linux-alkalmazások jelenleg nem támogatottak.</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> felügyelt felhasználó</translation> <translation id="3666266999138159418">Gyors csúsztatással elrejtheti a lebegő ablakot</translation> <translation id="367531336287639526">A címsávtól balra lévő első ikon kiválasztása</translation> +<translation id="3677931086890821290">Ezzel lehetővé teszi a helymeghatározási jogosultsággal rendelkező és ChromeOS-t futtató alkalmazások és webhelyek mindegyike számára, hogy használják a Wi-Fi- és a mobilhálózatok helyadatait.</translation> <translation id="3679827876008292680">Ugrás az ablak utolsó lapjára</translation> <translation id="36813544980941320">A Wi-Fi-hálózatok meg lesznek osztva a telefon és a(z) <ph name="DEVICE_NAME" /> között</translation> <translation id="3694122362646626770">Webhelyek</translation> @@ -1744,6 +1748,7 @@ <translation id="9198992156681343238">A(z) <ph name="DISPLAY_NAME" /> felbontása a következőre módosult: <ph name="RESOLUTION" />. A módosítás megtartásához kattintson a Megerősítés gombra. A beállítás <ph name="TIMEOUT_SECONDS" /> múlva visszaáll a korábbi értékre.</translation> <translation id="9201044636667689546"><ph name="NAME" /> csatlakoztatása ehhez a Chromebookhoz</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, a rendszergazdája kezeli</translation> +<translation id="9207682216934703221">Ezzel lehetővé teszi a(z) <ph name="APP_NAME" /> és a(z) <ph name="APP2_NAME" />, valamint a helymeghatározási jogosultsággal rendelkező és ChromeOS-t futtató alkalmazások és webhelyek mindegyike számára, hogy használják a Wi-Fi- és a mobilhálózatok helyadatait.</translation> <translation id="9210037371811586452">Kilépés az Egységes asztali módból</translation> <translation id="9211490828691860325">Az összes asztal</translation> <translation id="9211681782751733685">Akkumulátor teljes feltöltéséig hátralévő idő: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index d723b43..2fb4b1c 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C սարք (առջևի միացք)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> էկրանի լուծաչափը դարձել է <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Հց)։ Հպեք «Հաստատել»՝ փոփոխությունները պահպանելու համար։ Նախորդ կարգավորումները կվերականգնվեն <ph name="TIMEOUT_SECONDS" /> հետո։</translation> <translation id="1013923882670373915">«<ph name="DEVICE_NAME" />» Bluetooth սարքը զուգավորվելու թույլտվություն է խնդրում: Մուտքագրեք սարքում հետևյալ PIN կոդը` <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Այս կարգավորումը թույլ է տալիս ChromeOS-ին, <ph name="APP_NAME" /> հավելվածին և բոլոր հավելվածներին ու կայքերին, որոնք ունեն տեղորոշման թույլտվություն, օգտագործել Wi-Fi-ի և բջջային ցանցերի տեղադրության մասին տվյալները։</translation> <translation id="1017556409696559990">Փոքրացնել վերևի պատուհանը, երբ Chrome-ում փոփոխությունների պատմություն չկա</translation> <translation id="1024364763893396229">Պահեք ձեր «<ph name="NAME" />» սարքը</translation> <translation id="1032891413405719768">Ստիլուսի մարտկոցի լիցքը սպառվում է</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet՝ <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Միացնել տեղորոշման թույլտվությունը</translation> <translation id="1830308660060964064">«<ph name="ITEM_TITLE" />» տարրն ապամրացվեց</translation> <translation id="1838895407229022812">Գիշերային ռեժիմն անջատված է</translation> <translation id="1854180393107901205">Դադարեցնել հեռարձակումը</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Ի՞նչ կարող ես անել:</translation> <translation id="3256109297135787951">Չեղարկել տարրի նշումը դարակում</translation> <translation id="3260969790895726815">Քանի որ խոսքը սարքում է մշակվում, թելադրումը կարելի է օգտագործել անցանց ռեժիմում, սակայն որոշ ձայնային հրամաններ չեն աշխատի։</translation> +<translation id="3265032511221679826">Միացնե՞լ ճշգրիտ տեղորոշումը</translation> <translation id="3269597722229482060">Աջ սեղմում</translation> <translation id="3289364673986435196">Սնուցման կոճակի ընտրացանկ</translation> <translation id="3289544412142055976">Լինուքսի հավելվածները ներկայումս չեն աջակցվում</translation> @@ -577,6 +580,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> կառավարվող օգտատեր</translation> <translation id="3666266999138159418">Թերթեք՝ սահող պատուհանը թաքցնելու համար</translation> <translation id="367531336287639526">Ընտրել առաջին տարրը հասցեագոտու ձախ կողմում</translation> +<translation id="3677931086890821290">Այս կարգավորումը թույլ է տալիս ChromeOS-ին և բոլոր հավելվածներին ու կայքերին, որոնք ունեն տեղորոշման թույլտվություն, օգտագործել Wi-Fi-ի և բջջային ցանցերի տեղադրության մասին տվյալները։</translation> <translation id="3679827876008292680">Անցնել պատուհանի վերջին ներդիր</translation> <translation id="36813544980941320">Ձեր հեռախոսում և <ph name="DEVICE_NAME" />-ում կօգտագործվեն նույն Wi-Fi ցանցերը</translation> <translation id="3694122362646626770">Վեբկայքեր</translation> @@ -1219,6 +1223,7 @@ <translation id="6683022854667115063">Ականջակալներ</translation> <translation id="6696025732084565524">Անհրաժեշտ է թարմացնել արտաքին ստեղնաշարը</translation> <translation id="6700713906295497288">IME ընտրացանկի կոճակ</translation> +<translation id="6705577071209924099">Կարգավորել լուսավորությունը</translation> <translation id="6707693040195709527">Օպերացիոն համակարգի նախորդ տարբերակին անցնելու ժամանակը լրացել է</translation> <translation id="6710213216561001401">Նախորդը</translation> <translation id="6723839937902243910">Սնուցում</translation> @@ -1740,6 +1745,7 @@ <translation id="9198992156681343238">Լուծաչափը (<ph name="DISPLAY_NAME" />) փոխվել է <ph name="RESOLUTION" />-ի։ Հպեք «Հաստատել»՝ փոփոխությունները պահպանելու համար։ Նախորդ կարգավորումները կվերականգնվեն <ph name="TIMEOUT_SECONDS" /> հետո։</translation> <translation id="9201044636667689546">Զուգակցել <ph name="NAME" /> սարքն այս Chromebook-ի հետ</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, կառավարվում է ձեր ադմինիստրատորի կողմից</translation> +<translation id="9207682216934703221">Այս կարգավորումը թույլ է տալիս ChromeOS-ին, <ph name="APP_NAME" /> և <ph name="APP2_NAME" /> հավելվածներին, ինչպես նաև բոլոր հավելվածներին ու կայքերին, որոնք ունեն տեղորոշման թույլտվություն, օգտագործել Wi-Fi-ի և բջջային ցանցերի տեղադրության մասին տվյալները։</translation> <translation id="9210037371811586452">Ելք միասնական աշխատասեղանի ռեժիմից</translation> <translation id="9211490828691860325">Բոլոր աշխատասեղանները</translation> <translation id="9211681782751733685">Մարտկոցի լրիվ լիցքավորման համար մնացել է <ph name="TIME_REMAINING" />։</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 7bd2370..d1a3ee89 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Perangkat USB-C (port depan)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> diubah ke <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Klik konfirmasi untuk menyimpan perubahan. Setelan sebelumnya akan dipulihkan dalam <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Perangkat Bluetooth "<ph name="DEVICE_NAME" />" meminta izin untuk bersanding. Masukan kode PIN ini pada perangkat tersebut: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Tindakan ini akan mengizinkan <ph name="APP_NAME" /> dan semua aplikasi dan situs yang memiliki izin lokasi, serta ChromeOS untuk menggunakan lokasi jaringan seluler dan Wi-Fi.</translation> <translation id="1017556409696559990">Minimalkan jendela atas saat tidak ada histori sebelumnya di Chrome</translation> <translation id="1024364763893396229">Simpan <ph name="NAME" /> Anda</translation> <translation id="1032891413405719768">Baterai stilus lemah</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Buka halaman Histori</translation> <translation id="1654477262762802994">Mulai kueri suara</translation> <translation id="1668469839109562275">VPN bawaan</translation> +<translation id="1675844249244994876">Perbarui jendela kanan</translation> <translation id="1677472565718498478">Sisa waktu <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> tidak terhubung.</translation> <translation id="1677582821739292812">Seseorang sedang melihat layar Anda</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Aktifkan akses lokasi</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> telah dilepas pinnya</translation> <translation id="1838895407229022812">Cahaya Malam nonaktif.</translation> <translation id="1854180393107901205">Hentikan transmisi</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Apa yang bisa kamu lakukan?</translation> <translation id="3256109297135787951">Menghapus tanda dari item di rak</translation> <translation id="3260969790895726815">Ucapan diproses secara lokal dan dikte berfungsi secara offline, tetapi beberapa perintah suara tidak akan berfungsi.</translation> +<translation id="3265032511221679826">Aktifkan akses lokasi akurat?</translation> <translation id="3269597722229482060">Klik Kanan</translation> <translation id="3289364673986435196">Menu daya</translation> <translation id="3289544412142055976">Aplikasi Linux saat ini tidak didukung</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733">Pengguna Terkelola <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Geser untuk menyembunyikan jendela mengambang</translation> <translation id="367531336287639526">Pilih ikon pertama di sebelah kiri kolom URL</translation> +<translation id="3677931086890821290">Tindakan ini akan mengizinkan semua aplikasi dan situs yang memiliki izin lokasi serta ChromeOS untuk menggunakan lokasi jaringan seluler dan Wi-Fi.</translation> <translation id="3679827876008292680">Buka tab terakhir di jendela</translation> <translation id="36813544980941320">Ponsel dan <ph name="DEVICE_NAME" /> akan menggunakan jaringan Wi-Fi yang sama</translation> <translation id="3694122362646626770">Situs web</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Perkecil layar</translation> <translation id="4936329710968938986">Siapa saja, nonaktif</translation> <translation id="4938176435186993759">Sembunyikan semua saran</translation> +<translation id="4943007472417128747">Hotspot telah dinonaktifkan untuk menggunakan Wi-Fi. Untuk menggunakan Hotspot, nonaktifkan Wi-Fi.</translation> <translation id="4945196315133970626">Nonaktifkan notifikasi</translation> <translation id="4946376291507881335">Ambil gambar</translation> <translation id="495046168593986294">Scroll ke atas</translation> @@ -1388,6 +1394,7 @@ Untuk mematikan perangkat, tekan dan tahan tombol daya di perangkat lagi.</translation> <translation id="7526573455193969409">Jaringan mungkin dipantau</translation> <translation id="7536035074519304529">Alamat IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Perbarui jendela kiri</translation> <translation id="7543399541175347147">Aplikasi Linux dan jendela Samaran saat ini tidak didukung. Aplikasi lainnya akan disimpan.</translation> <translation id="7544300628205093162">Lampu latar keyboard mati</translation> <translation id="7548434653388805669">Waktunya tidur</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Tidak ingin file ini ditampilkan</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Anda menekan pintasan keyboard untuk rotasi layar. Ingin memutar layar?</translation> +<translation id="7901190436359881020">Tukar jendela</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Sentuh sensor sidik jari</translation> <translation id="7904094684485781019">Administrator untuk akun ini menonaktifkan fitur masuk banyak akun.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238">Resolusi <ph name="DISPLAY_NAME" /> diubah ke <ph name="RESOLUTION" />. Klik konfirmasi untuk menyimpan perubahan. Setelan sebelumnya akan dipulihkan dalam <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Hubungkan <ph name="NAME" /> ke Chromebook ini</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Dikelola oleh Administrator Anda</translation> +<translation id="9207682216934703221">Tindakan ini akan mengizinkan <ph name="APP_NAME" />, <ph name="APP2_NAME" />, dan semua aplikasi dan situs yang memiliki izin lokasi, serta ChromeOS untuk menggunakan lokasi jaringan seluler dan Wi-Fi.</translation> <translation id="9210037371811586452">Keluar dari mode desktop terpadu</translation> <translation id="9211490828691860325">Semua desktop</translation> <translation id="9211681782751733685">Kurang <ph name="TIME_REMAINING" /> lagi sampai baterai terisi penuh.</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index cfc7208..a831e15 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Opna síðu ferils</translation> <translation id="1654477262762802994">Hefja raddfyrirspurn</translation> <translation id="1668469839109562275">Innbyggt VPN</translation> +<translation id="1675844249244994876">Uppfæra hægri glugga</translation> <translation id="1677472565718498478"><ph name="TIME" /> eftir</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> er ótengt.</translation> <translation id="1677582821739292812">Einhver er að horfa á skjáinn þinn</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">Minnka aðdrátt á skjá</translation> <translation id="4936329710968938986">Öll, slökkt</translation> <translation id="4938176435186993759">Fela allar tillögur</translation> +<translation id="4943007472417128747">Slökkt var á heitum reit til að nota WiFi. Slökktu á WiFi til að nota heitan reit.</translation> <translation id="4945196315133970626">Slökkva á tilkynningum</translation> <translation id="4946376291507881335">Taka mynd</translation> <translation id="495046168593986294">Fletta upp</translation> @@ -1388,6 +1390,7 @@ Til að slökkva á tækinu skaltu halda aflrofa tækisins inni aftur.</translation> <translation id="7526573455193969409">Hugsanlega er fylgst með netinu</translation> <translation id="7536035074519304529">IP-tala: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Uppfæra vinstri glugga</translation> <translation id="7543399541175347147">Linux forrit og huliðsgluggar eru ekki studdir eins og er. Önnur forrit verða vistuð.</translation> <translation id="7544300628205093162">Kveikt er á baklýsingu lyklaborðs</translation> <translation id="7548434653388805669">Háttatími</translation> @@ -1468,6 +1471,7 @@ <translation id="7893503627044934815">Ég vil ekki sjá þessa skrá</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Þú ýttir á flýtilykilinn fyrir skjásnúning. Viltu snúa skjánum?</translation> +<translation id="7901190436359881020">Víxla gluggum</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Snertu fingrafaralesarann</translation> <translation id="7904094684485781019">Stjórnandi þessa reiknings hefur gert innskráningu á marga reikninga óvirka.</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 5fb9394..f7668fec 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Dispositivo USB-C (porta anteriore)</translation> <translation id="1013598600051641573">La risoluzione di <ph name="DISPLAY_NAME" /> è stata impostata su <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Fai clic su Conferma per mantenere le modifiche. Le impostazioni precedenti verranno ripristinate tra <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Il dispositivo Bluetooth "<ph name="DEVICE_NAME" />" chiede l'autorizzazione per essere accoppiato. Inserisci questo codice PIN sul dispositivo: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285"><ph name="APP_NAME" /> e tutti i siti web e le app che dispongono dell'autorizzazione di accesso alla posizione e di ChromeOS possono usare la posizione rilevata da reti Wi-Fi e mobili.</translation> <translation id="1017556409696559990">Riduci a icona la finestra principale quando non è presente una cronologia precedente in Chrome</translation> <translation id="1024364763893396229">Salva <ph name="NAME" /></translation> <translation id="1032891413405719768">Batteria dello stilo in esaurimento</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Attiva l'accesso alla posizione</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> è stato sbloccato</translation> <translation id="1838895407229022812">Luminosità notturna non attiva.</translation> <translation id="1854180393107901205">Interrompi trasmissione</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Cosa sai fare?</translation> <translation id="3256109297135787951">Consente di rimuovere l'evidenziazione da un elemento sulla barra delle app</translation> <translation id="3260969790895726815">Il riconoscimento vocale viene elaborato localmente e la dettatura funziona offline, ma alcuni comandi vocali non funzionano.</translation> +<translation id="3265032511221679826">Vuoi attivare l'accesso alla posizione esatta?</translation> <translation id="3269597722229482060">Clic con il pulsante destro</translation> <translation id="3289364673986435196">Menu del tasto di accensione</translation> <translation id="3289544412142055976">Al momento le app Linux non sono supportate</translation> @@ -574,6 +577,7 @@ <translation id="366222428570480733">Utente gestito <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Scorri per nascondere la finestra mobile</translation> <translation id="367531336287639526">Seleziona la prima icona a sinistra della barra degli indirizzi</translation> +<translation id="3677931086890821290">Tutti i siti web e le app che dispongono dell'autorizzazione di accesso alla posizione e di ChromeOS possono usare la posizione rilevata da reti Wi-Fi e mobili.</translation> <translation id="3679827876008292680">Vai all'ultima scheda nella finestra</translation> <translation id="36813544980941320">Il tuo telefono e il dispositivo <ph name="DEVICE_NAME" /> useranno le stesse reti Wi-Fi</translation> <translation id="3694122362646626770">Siti web</translation> @@ -1739,6 +1743,7 @@ <translation id="9198992156681343238">La risoluzione di <ph name="DISPLAY_NAME" /> è stata cambiata in <ph name="RESOLUTION" />. Fai clic su Conferma per mantenere le modifiche. Le impostazioni precedenti verranno ripristinate tra <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Connetti <ph name="NAME" /> a questo Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, gestita dall'amministratore</translation> +<translation id="9207682216934703221"><ph name="APP_NAME" />, <ph name="APP2_NAME" /> e tutti i siti web e le app che dispongono dell'autorizzazione di accesso alla posizione e di ChromeOS possono usare la posizione rilevata da reti Wi-Fi e mobili.</translation> <translation id="9210037371811586452">Uscita dalla modalità Desktop unificato</translation> <translation id="9211490828691860325">Tutte le scrivanie</translation> <translation id="9211681782751733685">Tempo rimanente al caricamento completo della batteria: <ph name="TIME_REMAINING" /></translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index 15d168c..514d4e0 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">מכשיר עם יציאת USB-C (יציאה קדמית)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> השתנה ל-<ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> הרץ). לשמירת השינויים, יש ללחוץ על 'אישור'. ההגדרות הקודמות ישוחזרו בעוד <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">מכשיר ה-Bluetooth "<ph name="DEVICE_NAME" />" מבקש הרשאה לבצע התאמה. יש להזין את קוד האימות הבא במכשיר: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">כך <ph name="APP_NAME" /> וכל האפליקציות והאתרים עם הרשאת המיקום ו-ChromeOS יוכלו להשתמש במיקום ב-Wi-Fi וברשתות סלולריות.</translation> <translation id="1017556409696559990">מזעור החלון העליון כשאין היסטוריה קודמת ב-Chrome</translation> <translation id="1024364763893396229">שמירה של <ph name="NAME" /></translation> <translation id="1032891413405719768">סוללת הסטיילוס חלשה</translation> @@ -192,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">אתרנט: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">הפעלת הגישה למיקום</translation> <translation id="1830308660060964064">ההצמדה של <ph name="ITEM_TITLE" /> בוטלה</translation> <translation id="1838895407229022812">תאורת הלילה כבויה.</translation> <translation id="1854180393107901205">הפסקת ההעברה</translation> @@ -469,6 +471,7 @@ <translation id="3255483164551725916">מה אפשר לעשות?</translation> <translation id="3256109297135787951">הסרת הסימון מפריט במדף</translation> <translation id="3260969790895726815">הדיבור מעובד באופן מקומי וההכתבה פועלת במצב אופליין, אבל חלק מהפקודות הקוליות לא פועלות.</translation> +<translation id="3265032511221679826">להפעיל את הגישה למיקום המדויק?</translation> <translation id="3269597722229482060">לחיצה ימנית</translation> <translation id="3289364673986435196">תפריט ההפעלה</translation> <translation id="3289544412142055976">בשלב הזה, אין תמיכה באפליקציות Linux</translation> @@ -579,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> משתמש מנוהל</translation> <translation id="3666266999138159418">ניתן להחליק להסתרת החלון הצף</translation> <translation id="367531336287639526">בחירת הסמל הראשון מימין לסרגל הכתובות</translation> +<translation id="3677931086890821290">כך כל האפליקציות והאתרים עם הרשאת המיקום ו-ChromeOS יוכלו להשתמש במיקום ב-Wi-Fi וברשתות סלולריות.</translation> <translation id="3679827876008292680">מעבר לכרטיסייה האחרונה בחלון</translation> <translation id="36813544980941320">רשתות Wi-Fi ישותפו בין הטלפון שלך לבין <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">אתרים</translation> @@ -1751,6 +1755,7 @@ <translation id="9198992156681343238">הרזולוציה של <ph name="DISPLAY_NAME" /> שונתה ל-<ph name="RESOLUTION" />. לשמירת השינויים, יש ללחוץ על 'אישור'. ההגדרות הקודמות ישוחזרו בעוד <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">יש לחבר את <ph name="NAME" /> ל-Chromebook הזה</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, הרשת מנוהלת על ידי מנהל המערכת שלך</translation> +<translation id="9207682216934703221">כך <ph name="APP_NAME" />, <ph name="APP2_NAME" /> וכל האפליקציות והאתרים עם הרשאת המיקום ו-ChromeOS יוכלו להשתמש במיקום ב-Wi-Fi וברשתות סלולריות.</translation> <translation id="9210037371811586452">יציאה ממצב Unified Desktop</translation> <translation id="9211490828691860325">כל שולחנות העבודה הווירטואליים</translation> <translation id="9211681782751733685"><ph name="TIME_REMAINING" /> עד לטעינה מלאה של הסוללה.</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index d6d14e2..44d08f2f 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C デバイス(前面のポート)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> を <ph name="RESOLUTION" />(<ph name="REFRESH_RATE" /> Hz)に変更しました。変更を保存するには確定してください。<ph name="TIMEOUT_SECONDS" /> 秒後に以前の設定に戻ります。</translation> <translation id="1013923882670373915">Bluetooth デバイス「<ph name="DEVICE_NAME" />」がペア設定の権限をリクエストしています。このデバイスに次の PIN コードを入力してください: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">位置情報へのアクセスを許可した <ph name="APP_NAME" /> およびすべてのアプリとウェブサイト、ChromeOS で、Wi-Fi とモバイル ネットワークの位置情報を使用できるようになります。</translation> <translation id="1017556409696559990">Chrome に戻る操作の履歴がない場合にトップ ウィンドウを最小化する</translation> <translation id="1024364763893396229"><ph name="NAME" /> を保存</translation> <translation id="1032891413405719768">タッチペンのバッテリー残量が少なくなっています</translation> @@ -192,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">イーサネット: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">位置情報へのアクセスをオンにする</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> の固定を解除しました</translation> <translation id="1838895407229022812">夜間モードはオフです。</translation> <translation id="1854180393107901205">キャストを停止</translation> @@ -469,6 +471,7 @@ <translation id="3255483164551725916">何ができる?</translation> <translation id="3256109297135787951">シェルフのアイテムのハイライト表示を解除する</translation> <translation id="3260969790895726815">音声はローカルで処理されました。オフラインで音声入力を使用できますが、一部の音声コマンドは動作しません。</translation> +<translation id="3265032511221679826">正確な位置情報へのアクセスをオンにしますか?</translation> <translation id="3269597722229482060">右クリック</translation> <translation id="3289364673986435196">電源ボタン メニュー</translation> <translation id="3289544412142055976">Linux アプリは現在サポートされていません</translation> @@ -579,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> の管理対象ユーザー</translation> <translation id="3666266999138159418">フローティング ウィンドウを非表示にするにはスワイプします</translation> <translation id="367531336287639526">アドレスバーの左側にある最初のアイコンを選択します</translation> +<translation id="3677931086890821290">位置情報へのアクセスを許可したすべてのアプリとウェブサイト、ChromeOS で、Wi-Fi とモバイル ネットワークの位置情報を使用できるようになります。</translation> <translation id="3679827876008292680">ウィンドウ内の最後のタブに移動する</translation> <translation id="36813544980941320">スマートフォンと <ph name="DEVICE_NAME" /> で Wi-Fi ネットワークが共有されます</translation> <translation id="3694122362646626770">ウェブサイト</translation> @@ -1747,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> の解像度を <ph name="RESOLUTION" /> に変更しました。変更を保存するには確定してください。<ph name="TIMEOUT_SECONDS" /> 秒後に以前の設定に戻ります。</translation> <translation id="9201044636667689546">この Chromebook に <ph name="NAME" /> を接続してください</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />、管理者によって管理</translation> +<translation id="9207682216934703221">位置情報へのアクセスを許可した <ph name="APP_NAME" />、<ph name="APP2_NAME" /> およびすべてのアプリとウェブサイト、ChromeOS で、Wi-Fi とモバイル ネットワークの位置情報を使用できるようになります。</translation> <translation id="9210037371811586452">デスクトップ統合モードの終了中</translation> <translation id="9211490828691860325">すべてのデスク</translation> <translation id="9211681782751733685">充電完了まであと <ph name="TIME_REMAINING" />です。</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 0de74c7..5417548 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">ისტორიის გვერდის გახსნა</translation> <translation id="1654477262762802994">ხმოვანი მოთხოვნის დაწყება</translation> <translation id="1668469839109562275">ჩაშენებული VPN</translation> +<translation id="1675844249244994876">მარჯვენა ფანჯრის განახლება</translation> <translation id="1677472565718498478">დარჩენილია <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> არ არის დაკავშირებული.</translation> <translation id="1677582821739292812">ვიღაც უყურებს თქვენს ეკრანს</translation> @@ -848,6 +849,7 @@ <translation id="493076006037866439">ეკრანზე მასშტაბის შემცირება</translation> <translation id="4936329710968938986">ყველა, გამორთული</translation> <translation id="4938176435186993759">ყველა შემოთავაზების დამალვა</translation> +<translation id="4943007472417128747">უსადენო ქსელი გამოირთო Wi-Fi ქსელის გამოსაყენებლად. უსადენო ქსელი რომ გამოიყენოთ, გამორთეთ Wi-Fi ქსელი.</translation> <translation id="4945196315133970626">შეტყობინებების გამორთვა</translation> <translation id="4946376291507881335">აღბეჭდვა</translation> <translation id="495046168593986294">ზემოთ გადაადგილება</translation> @@ -1392,6 +1394,7 @@ მოწყობილობის გამოსართავად ხელახლა დააჭირეთ ხანგრძლივად ელკვების ღილაკს მოწყობილობაზე.</translation> <translation id="7526573455193969409">ქსელზე შესაძლოა ხორციელდებოდეს მონიტორინგი</translation> <translation id="7536035074519304529">IP მისამართი: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">მარცხენა ფანჯრის განახლება</translation> <translation id="7543399541175347147">Linux აპები და ინკოგნიტო ფანჯრები ამჟამად მხარდაუჭერელია. სხვა აპები შეინახება.</translation> <translation id="7544300628205093162">კლავიატურის შენათება ჩართულია</translation> <translation id="7548434653388805669">ძილის დროა</translation> @@ -1472,6 +1475,7 @@ <translation id="7893503627044934815">არ მსურს, ეს ფაილი ჩანდეს ხოლმე</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">თქვენ დააჭირეთ ეკრანის ბრუნვის კლავიატურის მალსახმობს. გსურთ ეკრანის შებრუნება?</translation> +<translation id="7901190436359881020">ფანჯრების ჩანაცვლება</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">შეეხეთ თითის ანაბეჭდის სენსორს</translation> <translation id="7904094684485781019">ამ ანგარიშის ადმინისტრატორმა აკრძალა სისტემაში ერთდროული შესვლა.</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index 0f836e0..5009608 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">Терезені жазу үшін басыңыз</translation> <translation id="5978382165065462689">Remote Assistance арқылы экранды бөлісіп басқару.</translation> <translation id="5980301590375426705">Қонақты шығару</translation> +<translation id="5983567367406220847">Әрекетсіздікке байланысты хотспот өшірілді.</translation> <translation id="598407983968395253">Үлгіні қолдану</translation> <translation id="598882571027504733">Жаңартылған нұсқаны алу үшін, пернетақта жалғанған күйі Chromebook ноутбугын қайта қосыңыз.</translation> <translation id="6002179289567220515">1 камераны өшіру үшін физикалық ауыстырғышты пайдаландыңыз. Сондай-ақ барлық камераны пайдалану мүмкіндігін өшіруге болады.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">Қолданба камераңызды пайдаланып жатыр.</translation> <translation id="7453330308669753048">Іздеу тарихы нәтижесі өшірілді.</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | Толуға <ph name="TIME" /> қалды</translation> +<translation id="7459485586006128091">Ішкі қатеге байланысты хотспот өшірілді. Бірнеше минуттан кейін қайта қосылып көріңіз.</translation> <translation id="7461924472993315131">Бекіту</translation> <translation id="746232733191930409">Экран жазу режимі</translation> <translation id="7466449121337984263">Саусақ ізін оқу сканерін түртіңіз.</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">Жаңарту мәліметтерін қарау үшін басыңыз</translation> <translation id="7768784765476638775">Select to Speak</translation> <translation id="7769299611924763557">GIF файлыңыз жақын арада дайын болады.</translation> +<translation id="7773536009433685931">Оның орнына Wi-Fi функциясын қосу</translation> <translation id="7780094051999721182">таңбашалар</translation> <translation id="7780159184141939021">Экранды бұру</translation> <translation id="7796735576426975947">Жаңа хабарландыру жасырылған</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index fcd8bfea..733a94fe 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">ចុច enter ដើម្បីថតវិនដូ</translation> <translation id="5978382165065462689">ចែករំលែកការបញ្ជាអេក្រង់របស់អ្នកតាមរយៈជំនួយការពីចម្ងាយ។</translation> <translation id="5980301590375426705">ចាកចេញពីរបៀបភ្ញៀវ</translation> +<translation id="5983567367406220847">ដោយសារភាពអសកម្ម ហតស្ប៉តត្រូវបានបិទ។</translation> <translation id="598407983968395253">ប្រើទម្រង់គំរូ</translation> <translation id="598882571027504733">ដើម្បីទទួលបានកំណែថ្មី សូមចាប់ផ្តើម Chromebook របស់អ្នកឡើងវិញដោយប្រើក្តារចុចដែលភ្ជាប់មកជាមួយ។</translation> <translation id="6002179289567220515">អ្នកបានប្រើប្រាស់ប៊ូតុងបិទបើកនៅលើឧបករណ៍ ដើម្បីបិទកាមេរ៉ា 1។ អ្នកក៏អាចបិទការចូលប្រើប្រាស់សម្រាប់កាមេរ៉ាទាំងអស់បានដែរ។</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">កម្មវិធីកំពុងប្រើកាមេរ៉ារបស់អ្នក</translation> <translation id="7453330308669753048">បានដកលទ្ធផលប្រវត្តិស្វែងរកចេញ</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" />ទៀតទើបពេញ</translation> +<translation id="7459485586006128091">ដោយសារមានបញ្ហាខាងក្នុង ហតស្ប៉តត្រូវបានបិទ។ សូមសាកល្បងភ្ជាប់ឡើងវិញក្នុងពេលបន្តិចទៀត។</translation> <translation id="7461924472993315131">លេខសម្គាល់</translation> <translation id="746232733191930409">មុខងារថតវីដេអូអេក្រង់</translation> <translation id="7466449121337984263">សូមប៉ះឧបករណ៍ចាប់សញ្ញា</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">ចុចដើម្បីមើលព័ត៌មានលម្អិតអំពីកំណែថ្មី</translation> <translation id="7768784765476638775">ជ្រើសរើសដើម្បីអាន</translation> <translation id="7769299611924763557">GIF របស់អ្នកនឹងរួចរាល់ក្នុងពេលឆាប់ៗនេះ</translation> +<translation id="7773536009433685931">បើក WiFi ជំនួសវិញ</translation> <translation id="7780094051999721182">ផ្លូវកាត់</translation> <translation id="7780159184141939021">បង្វិលអេក្រង់</translation> <translation id="7796735576426975947">បានលាក់ការជូនដំណឹងថ្មី</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 51d24d2..86c968d 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C ಸಾಧನ (ಮುಂದಿನ ಪೋರ್ಟ್)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> ರೆಸಲ್ಯೂಷನ್ <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) ಗೆ ಬದಲಾಗಿದೆ. ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲು 'ಖಚಿತಪಡಿಸಿ' ಕ್ಲಿಕ್ ಮಾಡಿ. ಈ ಹಿಂದಿನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು <ph name="TIMEOUT_SECONDS" /> ನಲ್ಲಿ ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="1013923882670373915">ಬ್ಲೂಟೂತ್ ಸಾಧನವು "<ph name="DEVICE_NAME" />" ಜೋಡಣೆಗಾಗಿ ಅನುಮತಿಯನ್ನು ಬಯಸುತ್ತದೆ. ದಯವಿಟ್ಟು ಆ ಸಾಧನದಲ್ಲಿ ಈ PIN ಕೋಡ್ ನಮೂದಿಸಿ: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">ಇದು <ph name="APP_NAME" /> ಮತ್ತು ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳು ಹಾಗೂ ವೈ-ಫೈ ಮತ್ತು ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳ ಸ್ಥಳವನ್ನು ಬಳಸಲು ChromeOS ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="1017556409696559990">Chrome ನಲ್ಲಿ ಯಾವುದೇ ಹಿಂದಿನ ಇತಿಹಾಸವಿಲ್ಲದಿದ್ದಾಗ ಮೇಲಿನ ವಿಂಡೋವನ್ನು ಕುಗ್ಗಿಸಿ</translation> <translation id="1024364763893396229">ನಿಮ್ಮ <ph name="NAME" /> ಅನ್ನು ಉಳಿಸಿ</translation> <translation id="1032891413405719768">ಸ್ಟೈಲಸ್ ಬ್ಯಾಟರಿ ಕಡಿಮೆಯಾಗಿದೆ</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">ಇತಿಹಾಸ ಪುಟವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="1654477262762802994">ಧ್ವನಿ ಪ್ರಶ್ನೆಯನ್ನು ಕೇಳಲು ಪ್ರಾರಂಭಿಸಿ</translation> <translation id="1668469839109562275">ಬಿಲ್ಟ್-ಇನ್ VPN</translation> +<translation id="1675844249244994876">ಬಲ ವಿಂಡೋವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="1677472565718498478"><ph name="TIME" /> ಬಾಕಿ ಉಳಿದಿದೆ</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ಅನ್ನು ಕನೆಕ್ಟ್ ಮಾಡಲಾಗಿಲ್ಲ.</translation> <translation id="1677582821739292812">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಯಾರೋ ನೋಡುತ್ತಿದ್ದಾರೆ</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ಇಥರ್ನೆಟ್: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು ಆನ್ ಮಾಡಿ</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> ಅನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="1838895407229022812">ನೈಟ್ ಲೈಟ್ ಆಫ್ ಆಗಿದೆ.</translation> <translation id="1854180393107901205">ಬಿತ್ತರಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಿ</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">ನೀವೇನು ಮಾಡಬಲ್ಲಿರಿ?</translation> <translation id="3256109297135787951">ನಿಮ್ಮ ಶೆಲ್ಫ್ನಲ್ಲಿರುವ ಐಟಂನಿಂದ ಹೈಲೈಟ್ ಅನ್ನು ತೆಗೆದುಹಾಕಿ</translation> <translation id="3260969790895726815">ಧ್ವನಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಡಿಕ್ಟೇಶನ್ ಆಫ್ಲೈನ್ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಆದರೆ ಕೆಲವು ಧ್ವನಿ ಆಜ್ಞೆಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದಿಲ್ಲ.</translation> +<translation id="3265032511221679826">ನಿಖರವಾದ ಸ್ಥಳ ಪ್ರವೇಶವನ್ನು ಆನ್ ಮಾಡಬೇಕೆ?</translation> <translation id="3269597722229482060">ಬಲ-ಕ್ಲಿಕ್</translation> <translation id="3289364673986435196">ಪವರ್ ಮೆನು</translation> <translation id="3289544412142055976">Linux ಆ್ಯಪ್ಗಳು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> ನಿರ್ವಹಿಸಲಾದ ಬಳಕೆದಾರರು</translation> <translation id="3666266999138159418">ನಿಮ್ಮ ಫ್ಲೋಟಿಂಗ್ ವಿಂಡೋವನ್ನು ಮರೆಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ</translation> <translation id="367531336287639526">ವಿಳಾಸ ಪಟ್ಟಿಯ ಎಡಭಾಗದಲ್ಲಿರುವ ಮೊದಲ ಐಕಾನ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> +<translation id="3677931086890821290">ಇದು ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳು ಹಾಗೂ ವೈ-ಫೈ ಮತ್ತು ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳ ಸ್ಥಳವನ್ನು ಬಳಸಲು ChromeOS ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="3679827876008292680">ವಿಂಡೋದಲ್ಲಿ ಕೊನೆಯ ಟ್ಯಾಬ್ಗೆ ಹೋಗಿ</translation> <translation id="36813544980941320">ನಿಮ್ಮ ಫೋನ್ ಮತ್ತು <ph name="DEVICE_NAME" /> ನಡುವೆ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತದೆ</translation> <translation id="3694122362646626770">ವೆಬ್ಸೈಟ್ಗಳು</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">ಸ್ಕ್ರೀನ್ನಿಂದ ಜೂಮ್ ಔಟ್ ಮಾಡಿ</translation> <translation id="4936329710968938986">ಪ್ರತಿಯೊಬ್ಬರು, ಆಫ್ ಆಗಿದೆ</translation> <translation id="4938176435186993759">ಎಲ್ಲಾ ಸಲಹೆಗಳನ್ನು ಮರೆಮಾಡಿ</translation> +<translation id="4943007472417128747">ವೈಫೈ ಬಳಸಲು ಹಾಟ್ಸ್ಪಾಟ್ ಅನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ. ಹಾಟ್ಸ್ಪಾಟ್ ಅನ್ನು ಬಳಸಲು, ವೈಫೈ ಆಫ್ ಮಾಡಿ.</translation> <translation id="4945196315133970626">ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಿ</translation> <translation id="4946376291507881335">ಕ್ಯಾಪ್ಚರ್ ಮಾಡಿ</translation> <translation id="495046168593986294">ಮೇಲಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation> @@ -1388,6 +1394,7 @@ ಸಾಧನವನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲು, ಸಾಧನದಲ್ಲಿನ ಪವರ್ ಬಟನ್ ಅನ್ನು ಪುನಃ ಒತ್ತಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ.</translation> <translation id="7526573455193969409">ನೆಟ್ವರ್ಕ್ನ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾಗಿದೆ</translation> <translation id="7536035074519304529">ಐಪಿ ವಿಳಾಸ: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">ಎಡ ವಿಂಡೋವನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="7543399541175347147">Linux ಆ್ಯಪ್ಗಳು ಮತ್ತು ಅಜ್ಞಾತ ವಿಂಡೋಗಳು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ. ಇತರ ಆ್ಯಪ್ಗಳನ್ನು ಉಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="7544300628205093162">ಕೀಬೋರ್ಡ್ ಬ್ಯಾಕ್ ಲೈಟ್ ಆನ್ ಆಗಿದೆ</translation> <translation id="7548434653388805669">ಮಲಗುವ ಸಮಯ</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">ಈ ಫೈಲ್ ಅನ್ನು ತೋರಿಸುವುದು ಬೇಡ</translation> <translation id="7895348134893321514">ಟೋಟ್</translation> <translation id="7897375687985782769">ನೀವು ಪರದೆಯನ್ನು ತಿರುಗಿಸಲು ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್ಕಟ್ ಒತ್ತಿದ್ದೀರಿ. ನೀವು ಪರದೆಯನ್ನು ತಿರುಗಿಸಲು ಬಯಸುವಿರಾ?</translation> +<translation id="7901190436359881020">ವಿಂಡೋಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation> <translation id="7901405293566323524">ಫೋನ್ ಹಬ್</translation> <translation id="7902625623987030061">ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸರ್ ಅನ್ನು ಸ್ಪರ್ಶಿಸಿ</translation> <translation id="7904094684485781019">ಈ ಖಾತೆಗಾಗಿ ನಿರ್ವಾಹಕರು ಬಹುವಿಧದ ಸೈನ್ ಇನ್ ಅನುಮತಿಸಿಲ್ಲ.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> ರೆಸಲ್ಯೂಷನ್ <ph name="RESOLUTION" /> ಗೆ ಬದಲಾಗಿದೆ. ಬದಲಾವಣೆಗಳನ್ನು ಉಳಿಸಲು 'ಖಚಿತಪಡಿಸಿ' ಕ್ಲಿಕ್ ಮಾಡಿ. ಹಿಂದಿನ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಇನ್ನು <ph name="TIMEOUT_SECONDS" /> ನಲ್ಲಿ ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="9201044636667689546"><ph name="NAME" /> ಅನ್ನು ಈ Chromebook ಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ವಹಿಸಿದ್ದಾರೆ</translation> +<translation id="9207682216934703221">ಇದು <ph name="APP_NAME" />, <ph name="APP2_NAME" /> ಮತ್ತು ಸ್ಥಳ ಅನುಮತಿಯನ್ನು ಹೊಂದಿರುವ ಎಲ್ಲಾ ಆ್ಯಪ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳು ಹಾಗೂ ವೈ-ಫೈ ಮತ್ತು ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳ ಸ್ಥಳವನ್ನು ಬಳಸಲು ChromeOS ಅನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation> <translation id="9210037371811586452">ಏಕೀಕೃತ ಡೆಸ್ಕ್ಟಾಪ್ ಮೋಡ್ನಿಂದ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="9211490828691860325">ಎಲ್ಲಾ ಡೆಸ್ಕ್ಗಳು</translation> <translation id="9211681782751733685">ಬ್ಯಾಟರಿ ಸಂಪೂರ್ಣವಾಗಿ ಚಾರ್ಜ್ ಆಗಲು <ph name="TIME_REMAINING" /> ಉಳಿದಿದೆ.</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index 8e7c4e3..0ff9740 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C 기기(전면 포트)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> 화면이 <ph name="RESOLUTION" />(<ph name="REFRESH_RATE" />Hz) 해상도로 변경되었습니다. 변경사항을 적용하려면 확인을 클릭하세요. <ph name="TIMEOUT_SECONDS" /> 후 이전 설정으로 복원됩니다.</translation> <translation id="1013923882670373915">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 기기에서 다음 PIN 코드를 입력하세요. <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">이를 통해 위치 정보 액세스 권한이 있고 ChromeOS를 지원하는 <ph name="APP_NAME" /> 및 모든 앱과 웹사이트에서 Wi-Fi 및 모바일 네트워크 위치를 사용할 수 있습니다.</translation> <translation id="1017556409696559990">Chrome에 뒤로 기록이 없는 경우 상단 창 최소화</translation> <translation id="1024364763893396229"><ph name="NAME" /> 저장</translation> <translation id="1032891413405719768">스타일러스 배터리 부족</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">방문 기록 페이지 열기</translation> <translation id="1654477262762802994">음성 검색 시작</translation> <translation id="1668469839109562275">기본 제공 VPN</translation> +<translation id="1675844249244994876">오른쪽 창 업데이트</translation> <translation id="1677472565718498478"><ph name="TIME" /> 남음</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" />이 연결되어 있지 않습니다.</translation> <translation id="1677582821739292812">누가 내 화면을 보고 있습니다.</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">이더넷: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">위치 액세스 사용 설정</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> 고정 취소됨</translation> <translation id="1838895407229022812">야간 조명이 꺼졌습니다.</translation> <translation id="1854180393107901205">전송 중지</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">무엇을 할 수 있어?</translation> <translation id="3256109297135787951">실행기에 있는 항목에서 강조표시를 삭제합니다.</translation> <translation id="3260969790895726815">음성이 로컬에서 처리되고 음성기록이 오프라인으로 작동하지만 일부 음성 명령은 작동하지 않습니다.</translation> +<translation id="3265032511221679826">정확한 위치 액세스를 사용 설정하시겠습니까?</translation> <translation id="3269597722229482060">마우스 오른쪽 버튼 클릭</translation> <translation id="3289364673986435196">전원 메뉴</translation> <translation id="3289544412142055976">Linux 앱은 현재 지원되지 않습니다.</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> 관리 사용자</translation> <translation id="3666266999138159418">스와이프하여 플로팅 창 숨기기</translation> <translation id="367531336287639526">주소 표시줄 왼쪽에 있는 첫 번째 아이콘 선택</translation> +<translation id="3677931086890821290">이를 통해 위치 정보 액세스 권한이 있고 ChromeOS를 지원하는 모든 앱과 웹사이트에서 Wi-Fi 및 모바일 네트워크 위치를 사용할 수 있습니다.</translation> <translation id="3679827876008292680">창의 마지막 탭으로 이동</translation> <translation id="36813544980941320">Wi-Fi 네트워크가 휴대전화와 <ph name="DEVICE_NAME" /> 간에 공유됩니다.</translation> <translation id="3694122362646626770">웹사이트</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">화면 축소</translation> <translation id="4936329710968938986">모든 사용자, 사용 안 함</translation> <translation id="4938176435186993759">모든 추천 숨기기</translation> +<translation id="4943007472417128747">Wi-Fi를 사용하기 위해 핫스팟이 사용 중지되었습니다. 핫스팟을 사용하려면 Wi-Fi를 사용 중지하세요.</translation> <translation id="4945196315133970626">알림 사용 중지</translation> <translation id="4946376291507881335">캡처</translation> <translation id="495046168593986294">위로 스크롤</translation> @@ -1388,6 +1394,7 @@ 기기를 종료하려면 기기의 전원 버튼을 다시 길게 누르세요.</translation> <translation id="7526573455193969409">네트워크가 모니터링될 수 있음</translation> <translation id="7536035074519304529">IP 주소: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">왼쪽 창 업데이트</translation> <translation id="7543399541175347147">Linux 앱 및 시크릿 창은 현재 지원되지 않습니다. 다른 앱은 저장됩니다.</translation> <translation id="7544300628205093162">키보드 백라이트 켜짐</translation> <translation id="7548434653388805669">취침 시간</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">파일을 표시하지 않음</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">화면 회전 단축키를 누르셨습니다. 화면을 회전하시겠습니까?</translation> +<translation id="7901190436359881020">창 교체</translation> <translation id="7901405293566323524">휴대전화 허브</translation> <translation id="7902625623987030061">지문 센서를 터치하세요.</translation> <translation id="7904094684485781019">이 계정의 관리자가 멀티 로그인을 허용하지 않습니다.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" />의 해상도가 <ph name="RESOLUTION" />(으)로 변경되었습니다. 변경사항을 유지하려면 확인을 클릭하세요. <ph name="TIMEOUT_SECONDS" /> 후 이전 설정으로 복원됩니다.</translation> <translation id="9201044636667689546"><ph name="NAME" /> 기기를 Chromebook에 연결합니다.</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, 관리자가 관리함</translation> +<translation id="9207682216934703221">이를 통해 위치 정보 액세스 권한이 있고 ChromeOS를 지원하는 <ph name="APP_NAME" />, <ph name="APP2_NAME" />, 모든 앱과 웹사이트에서 Wi-Fi 및 모바일 네트워크 위치를 사용할 수 있습니다.</translation> <translation id="9210037371811586452">통합 바탕화면 모드 종료 중</translation> <translation id="9211490828691860325">모든 데스크</translation> <translation id="9211681782751733685">배터리 충전이 완료될 때까지 남은 시간은 <ph name="TIME_REMAINING" />입니다.</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 871413f..db78aeb4 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C түзмөгү (маңдайкы оюкча)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> дааналыгы төмөнкүгө өзгөртүлдү: <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Герц). Өзгөртүүлөрдү сактоо үчүн "Ырастоо" баскычын басыңыз. Мурунку жөндөөлөр <ph name="TIMEOUT_SECONDS" /> кийин калыбына келтирилет.</translation> <translation id="1013923882670373915">"<ph name="DEVICE_NAME" />" Bluetooth түзмөгү жупташуу үчүн уруксат сурап жатат. Ал түзмөккө бул PIN кодду киргизиңиз: <ph name="PINCODE" />.</translation> +<translation id="1014722676793506285"><ph name="APP_NAME" /> жана жайгашкан жерди аныктоого уруксат алган бардык колдонмолор менен вебсайттарга, ошондой эле ChromeOS'ко Wi-Fi жана мобилдик тармактын жайгашкан жерин колдонуу мүмкүнчүлүгү берилет.</translation> <translation id="1017556409696559990">Chrome'до таржымал болбогон учурда жогорку терезени кичирейтүү</translation> <translation id="1024364763893396229"><ph name="NAME" /> түзмөгүңүздү сактаңыз</translation> <translation id="1032891413405719768">Стилус батареясынын кубаты аз</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Жайгашкан жерди аныктоону күйгүзүү</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> бошотулду</translation> <translation id="1838895407229022812">Түнкү жарык өчүк.</translation> <translation id="1854180393107901205">Тышкы экранга чыгарууну токтотуу</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Эмне кыла аласыз?</translation> <translation id="3256109297135787951">Текчедеги нерсени бөлүп көрсөтүүнү алып салуу</translation> <translation id="3260969790895726815">Кеп түзмөктө иштетилип, текстти айтып терүү офлайнда иштейт, бирок айрым үн буйруктары иштебейт.</translation> +<translation id="3265032511221679826">Так даректи аныктоону күйгүзөсүзбү?</translation> <translation id="3269597722229482060">Оң баскычын чыкылдатуу</translation> <translation id="3289364673986435196">Кубат баскычынын менюсу</translation> <translation id="3289544412142055976">Учурда Linux колдонмолору колдоого алынбайт</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Башкарылган колдонуучу</translation> <translation id="3666266999138159418">Калкыма терезени жашыруу үчүн экранды сүрүңүз</translation> <translation id="367531336287639526">Дарек тилкесинин сол жагындагы биринчи сүрөтчөнү тандоо</translation> +<translation id="3677931086890821290">Жайгашкан жерди аныктоого уруксат алган бардык колдонмолор менен вебсайттарга, ошондой эле ChromeOS'ко Wi-Fi жана мобилдик тармактардын жайгашкан жерин колдонуу мүмкүнчүлүгү берилет.</translation> <translation id="3679827876008292680">Терезедеги акыркы өтмөккө өтүү</translation> <translation id="36813544980941320">Wi-Fi тармактары телефонуңуз жана <ph name="DEVICE_NAME" /> түзмөгүңүз менен бөлүшүлөт</translation> <translation id="3694122362646626770">Вебсайттар</translation> @@ -1155,7 +1159,7 @@ <translation id="6424520630891723617"><ph name="SECURITY_STATUS" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" /></translation> <translation id="642644398083277086">Бардык билдирмелерди өчүрүү</translation> <translation id="643147933154517414">Баары даяр</translation> -<translation id="6431865393913628856">Экрандан видео жаздырып алуу</translation> +<translation id="6431865393913628856">Экранды жаздыруу</translation> <translation id="6442259747294754014">Түзмөктүн микрофонун колдонуу мүмкүнчүлүгү өчүк</translation> <translation id="6445835306623867477"><ph name="RECEIVER_NAME" /> бөлмөсүндөгү <ph name="ROUTE_TITLE" /></translation> <translation id="6445915701151710649">процессор</translation> @@ -1743,6 +1747,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> дааналыгы төмөнкүгө өзгөртүлдү: <ph name="RESOLUTION" />. Өзгөртүүлөрдү сактоо үчүн "Ырастоо" баскычын басыңыз. Мурунку жөндөөлөр <ph name="TIMEOUT_SECONDS" /> кийин калыбына келтирилет.</translation> <translation id="9201044636667689546"><ph name="NAME" /> түзмөгүн ушул Chromebook менен байланыштырыңыз</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Администраторуңуз башкарат</translation> +<translation id="9207682216934703221"><ph name="APP_NAME" />, <ph name="APP2_NAME" /> жана жайгашкан жерди аныктоого уруксат алган бардык колдонмолор менен вебсайттарга, ошондой эле ChromeOS'ко Wi-Fi жана мобилдик тармактын жайгашкан жерин колдонуу мүмкүнчүлүгү берилет.</translation> <translation id="9210037371811586452">Биргелешкен иш такта режиминен чыгууда</translation> <translation id="9211490828691860325">Бардык иш такталар</translation> <translation id="9211681782751733685">Батарея <ph name="TIME_REMAINING" /> кийин толот.</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index 847d5c8..28185fa 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">ເປີດໜ້າປະຫວັດ</translation> <translation id="1654477262762802994">ເລີ່ມຄຳຊອກຫາດ້ວຍສຽງ</translation> <translation id="1668469839109562275">VPN ໃນຕົວ</translation> +<translation id="1675844249244994876">ອັບເດດໜ້າຈໍເບື້ອງຂວາ</translation> <translation id="1677472565718498478">ຍັງເຫຼືອ <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ບໍ່ໄດ້ເຊື່ອມຕໍ່.</translation> <translation id="1677582821739292812">ມີຄົນກຳລັງເບິ່ງໜ້າຈໍຂອງທ່ານ</translation> @@ -848,6 +849,7 @@ <translation id="493076006037866439">ຊູມອອກຈາກໜ້າຈໍ</translation> <translation id="4936329710968938986">ທຸກຄົນ, ປິດ</translation> <translation id="4938176435186993759">ເຊື່ອງການແນະນຳທັງໝົດ</translation> +<translation id="4943007472417128747">ປິດຮັອດສະປອດເພື່ອໃຊ້ Wi-Fi ແລ້ວ. ເພື່ອໃຊ້ຮັອດສະປອດ, ໃຫ້ປິດ Wi-Fi.</translation> <translation id="4945196315133970626">ປິດການແຈ້ງເຕືອນ</translation> <translation id="4946376291507881335">ຖ່າຍຮູບ</translation> <translation id="495046168593986294">ເລື່ອນຂຶ້ນ</translation> @@ -1394,6 +1396,7 @@ ເພື່ອປິດເຄື່ອງ, ໃຫ້ກົດປຸ່ມເປີດປິດຄ້າງໄວ້ຢູ່ອຸປະກອນອີກຄັ້ງ.</translation> <translation id="7526573455193969409">ອາດມີການຕິດຕາມເບິ່ງເຄືອຂ່າຍ</translation> <translation id="7536035074519304529">ທີ່ຢູ່ IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">ອັບເດດໜ້າຈໍເບື້ອງຊ້າຍ</translation> <translation id="7543399541175347147">ຕອນນີ້ບໍ່ຮອງຮັບແອັບ Linux ແລະ ໜ້າຈໍທີ່ບໍ່ເປີດເຜີຍຕົວຕົນເທື່ອ. ແອັບອື່ນໆຈະຖືກບັນທຶກໄວ້.</translation> <translation id="7544300628205093162">ເປີດແສງໄຟແປ້ນພິມແລ້ວ</translation> <translation id="7548434653388805669">ຮອດເວລານອນແລ້ວ</translation> @@ -1475,6 +1478,7 @@ <translation id="7893503627044934815">ບໍ່ຕ້ອງການໃຫ້ສະແດງໄຟລ໌ນີ້</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">ທ່ານໄດ້ກົດປຸ່ມລັດແປ້ນພິມສຳລັບການໝຸນໜ້າຈໍແລ້ວ. ທ່ານຕ້ອງການໝຸນໜ້າຈໍບໍ?</translation> +<translation id="7901190436359881020">ສະຫຼັບໜ້າຈໍ</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">ແຕະເຊັນເຊີລາຍນິ້ວມື</translation> <translation id="7904094684485781019">ຜູ້ຄວບຄຸມສໍາລັບບັນຊີນີ້ໄດ້ຖອນການອະນຸຍາດສຳລັບການລົງຊື່ເຂົ້າໃຊ້ຫຼາຍອັນ.</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index baa40251..d97d4f6 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C įrenginys (prievadas priekyje)</translation> <translation id="1013598600051641573">„<ph name="DISPLAY_NAME" />“ pakeistas į <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Spustelėkite patvirtinimo mygtuką, kad išsaugotumėte pakeitimus. Ankstesni nustatymai bus atkurti po <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">„Bluetooth“ įrenginys „<ph name="DEVICE_NAME" />“ prašo leidimo susieti. Šiame įrenginyje įveskite šį PIN kodą: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">„<ph name="APP_NAME" />“ ir visoms programoms bei svetainėms, turinčioms leidimą pasiekti vietovės duomenis ir „ChromeOS“, leidžiama naudoti „Wi-Fi“ ir mobiliojo ryšio tinklų vietovę.</translation> <translation id="1017556409696559990">Sumažinti viršutinį langą, kai naršyklėje „Chrome“ nėra istorijos</translation> <translation id="1024364763893396229">Išsaugokite „<ph name="NAME" />“</translation> <translation id="1032891413405719768">Rašiklio akumuliatorius senka</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Atidaryti istorijos puslapį</translation> <translation id="1654477262762802994">Pradėti užklausą balsu</translation> <translation id="1668469839109562275">Įtaisytasis VPN</translation> +<translation id="1675844249244994876">Atnaujinti dešinįjį langą</translation> <translation id="1677472565718498478">Liko <ph name="TIME" /></translation> <translation id="1677507110654891115">„<ph name="FEATURE_NAME" />“ neprijungta.</translation> <translation id="1677582821739292812">Kažkas žiūri į jūsų ekraną</translation> @@ -191,6 +193,7 @@ <ph name="IME" />, <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Eternetas: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Prieigos prie vietovės įjungimas</translation> <translation id="1830308660060964064">Atsegta: <ph name="ITEM_TITLE" /></translation> <translation id="1838895407229022812">Nakties šviesa išjungta.</translation> <translation id="1854180393107901205">Sustabdyti perdavimą</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">„What can you do?“ (Ką gali atlikti?)</translation> <translation id="3256109297135787951">Pašalinti elemento lentynoje paryškinimą</translation> <translation id="3260969790895726815">Kalba apdorojama vietiniu mastu, o diktavimas veikia neprisijungus, bet kai kurios komandos balsu neveiks.</translation> +<translation id="3265032511221679826">Įjungti prieigą prie tikslios vietovės?</translation> <translation id="3269597722229482060">Spustelėti dešiniuoju klavišu</translation> <translation id="3289364673986435196">Įjungimo meniu</translation> <translation id="3289544412142055976">„Linux“ programos šiuo metu nepalaikomos</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> tvarkomas naudotojas</translation> <translation id="3666266999138159418">Perbraukite, kad paslėptumėte slankųjį langą</translation> <translation id="367531336287639526">Pasirinkti pirmą piktogramą adreso juostos kairėje</translation> +<translation id="3677931086890821290">Tai leidžia visoms programoms ir svetainėms, turinčioms leidimą pasiekti vietovės duomenis ir „ChromeOS“, naudoti „Wi-Fi“ ir mobiliojo ryšio tinklų vietovę.</translation> <translation id="3679827876008292680">Eiti į paskutinį skirtuką lange</translation> <translation id="36813544980941320">„Wi-Fi“ tinklai bus bendrinami telefone ir „<ph name="DEVICE_NAME" />“ įrenginyje</translation> <translation id="3694122362646626770">Svetainės</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Tolinti ekrane</translation> <translation id="4936329710968938986">Visi, išjungta</translation> <translation id="4938176435186993759">Slėpti visus pasiūlymus</translation> +<translation id="4943007472417128747">Viešosios interneto prieigos taškas išjungtas, kad būtų galima naudoti „Wi-Fi“. Jei norite naudoti viešosios interneto prieigos tašką, išjunkite „Wi-Fi“.</translation> <translation id="4945196315133970626">Išjungti pranešimus</translation> <translation id="4946376291507881335">Užfiksuoti</translation> <translation id="495046168593986294">Slinkti į viršų</translation> @@ -1388,6 +1394,7 @@ Jei norite išjungti įrenginį, dar kartą paspauskite ir palaikykite įrenginio maitinimo mygtuką.</translation> <translation id="7526573455193969409">Tinklas gali būti stebimas</translation> <translation id="7536035074519304529">IP adresas: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Atnaujinti kairįjį langą</translation> <translation id="7543399541175347147">„Linux“ programos ir inkognito langai šiuo metu nepalaikomi. Kitos programos bus išsaugotos.</translation> <translation id="7544300628205093162">Klaviatūra foninis apšvietimas įjungtas</translation> <translation id="7548434653388805669">Laikas eiti miegoti</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Nenoriu, kad šis failas būtų rodomas</translation> <translation id="7895348134893321514">Perkelti</translation> <translation id="7897375687985782769">Paspaudėte ekrano pasukimo spartųjį klavišą. Ar norite pasukti ekraną?</translation> +<translation id="7901190436359881020">Sukeisti langus</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Palieskite kontrolinio kodo jutiklį</translation> <translation id="7904094684485781019">Šios paskyros administratorius neleidžia naudoti kelių paskyrų.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238">„<ph name="DISPLAY_NAME" />“ skyra pakeista į <ph name="RESOLUTION" />. Spustelėkite „Patvirtinti“ ir išsaugokite pakeitimus. Ankstesni nustatymai bus atkurti už <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Susieti „<ph name="NAME" />“ su šiuo „Chromebook“</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, tvarko administratorius</translation> +<translation id="9207682216934703221">„<ph name="APP_NAME" />“, „<ph name="APP2_NAME" />“ ir visoms programoms bei svetainėms, turinčioms leidimą pasiekti vietovės duomenis ir „ChromeOS“, leidžiama naudoti „Wi-Fi“ ir mobiliojo ryšio tinklų vietovę.</translation> <translation id="9210037371811586452">Išjungiamas sujungiamojo darbalaukio režimas</translation> <translation id="9211490828691860325">Visi darbalaukiai</translation> <translation id="9211681782751733685">Iki akumuliatoriaus įkrovimo liko <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 8cac6edaf..cd71a72 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">വിൻഡോ റെക്കോർഡ് ചെയ്യാൻ Enter അമർത്തുക</translation> <translation id="5978382165065462689">നിങ്ങളുടെ വിദൂര സഹായി മുഖേന സ്ക്രീനിന്റെ നിയന്ത്രണം പങ്കിടുക.</translation> <translation id="5980301590375426705">ഗസ്റ്റ് എക്സിറ്റ്</translation> +<translation id="5983567367406220847">നിഷ്ക്രിയത്വത്തെ തുടർന്ന്, ഹോട്ട്സ്പോട്ട് ഓഫാക്കി.</translation> <translation id="598407983968395253">ടെംപ്ലേറ്റ് ഉപയോഗിക്കുക</translation> <translation id="598882571027504733">അപ്ഡേറ്റ് നേടാൻ, അറ്റാച്ച് ചെയ്ത കീബോഡിനൊപ്പം Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക.</translation> <translation id="6002179289567220515">1 ക്യാമറ ഓഫാക്കാൻ നിങ്ങൾ ഫിസിക്കൽ സ്വിച്ച് ഉപയോഗിച്ചു. എല്ലാ ക്യാമറകളിലേക്കുമുള്ള ആക്സസും നിങ്ങൾക്ക് ഓഫാക്കാനാകും.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">ഒരു ആപ്പ് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നു</translation> <translation id="7453330308669753048">തിരയൽ ചരിത്ര ഫലം നീക്കം ചെയ്തു</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | പൂർണ്ണമായി ചാർജ് ആകാൻ <ph name="TIME" /> എടുക്കും</translation> +<translation id="7459485586006128091">ആന്തരിക പിശകിനെ തുടർന്ന്, ഹോട്ട്സ്പോട്ട് ഓഫാക്കി. അൽപ്പ സമയത്തിന് ശേഷം വീണ്ടും കണക്റ്റ് ചെയ്യാൻ ശ്രമിക്കുക.</translation> <translation id="7461924472993315131">പിൻ ചെയ്യുക</translation> <translation id="746232733191930409">സ്ക്രീൻ റെക്കോർഡിംഗ് മോഡ്</translation> <translation id="7466449121337984263">സെൻസറിൽ സ്പർശിക്കുക</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">അപ്ഡേറ്റ് ചെയ്ത വിശദാംശങ്ങൾ കാണാൻ ക്ലിക്ക് ചെയ്യുക</translation> <translation id="7768784765476638775">വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക</translation> <translation id="7769299611924763557">നിങ്ങളുടെ GIF ഉടൻ തയ്യാറാകും</translation> +<translation id="7773536009433685931">പകരം വൈഫൈ ഓണാക്കുക</translation> <translation id="7780094051999721182">കുറുക്കുവഴികൾ</translation> <translation id="7780159184141939021">സ്ക്രീൻ തിരിക്കുക</translation> <translation id="7796735576426975947">പുതിയ അറിയിപ്പ് മറച്ചിരിക്കുന്നു</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index 3f54ef61..415548f 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Түүхийн хуудсыг нээх</translation> <translation id="1654477262762802994">Дуут асуулга эхлүүлэх</translation> <translation id="1668469839109562275">Бүрэлдэхүүн VPN</translation> +<translation id="1675844249244994876">Баруун талын цонхыг шинэчлэх</translation> <translation id="1677472565718498478"><ph name="TIME" /> үлдсэн</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> холбогдоогүй.</translation> <translation id="1677582821739292812">Хэн нэгэн дэлгэц рүү тань харж байна</translation> @@ -845,6 +846,7 @@ <translation id="493076006037866439">Дэлгэцийг жижгэрүүлэх</translation> <translation id="4936329710968938986">Бүгд, унтраалттай</translation> <translation id="4938176435186993759">Бүх зөвлөмжийг нуух</translation> +<translation id="4943007472417128747">Wi-Fi-г ашиглахын тулд сүлжээний цэгийг унтраасан. Сүлжээний цэгийг ашиглахын тулд Wi-Fi-г унтраана уу.</translation> <translation id="4945196315133970626">Мэдэгдлийг унтраах</translation> <translation id="4946376291507881335">Зураг авах</translation> <translation id="495046168593986294">Дээш гүйлгэх</translation> @@ -1389,6 +1391,7 @@ Төхөөрөмжийг унтраахын тулд төхөөрөмжийн асаах/унтраах товчийг дахин удаан дарна уу.</translation> <translation id="7526573455193969409">Сүлжээг хянаж байж болзошгүй</translation> <translation id="7536035074519304529">IP хаяг: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Зүүн талын цонхыг шинэчлэх</translation> <translation id="7543399541175347147">Linux аппууд болон Нууцлалтай цонхнуудыг одоогоор дэмждэггүй. Бусад аппыг хадгална.</translation> <translation id="7544300628205093162">Гарын арын гэрэл асаалттай байна</translation> <translation id="7548434653388805669">Унтах цаг</translation> @@ -1469,6 +1472,7 @@ <translation id="7893503627044934815">Энэ файлыг харахыг хүсэхгүй байна</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Та дэлгэц эргүүлэх товчлуурын шууд холбоосыг дарсан байна. Дэлгэцийг эргүүлэх үү?</translation> +<translation id="7901190436359881020">Цонхнуудыг солих</translation> <translation id="7901405293566323524">Утасны Hub</translation> <translation id="7902625623987030061">Хурууны хээ мэдрэгчид хүрнэ үү</translation> <translation id="7904094684485781019">Энэ бүртгэлийн админ нь олон тооны нэвтрэлтийг хэрэгсэхгүй болгосон байна.</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 7b41333a..04a903a 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">इतिहास पेज उघडा</translation> <translation id="1654477262762802994">व्हॉइस क्वेरी सुरू करा</translation> <translation id="1668469839109562275">बिल्ट-इन VPN</translation> +<translation id="1675844249244994876">उजवी विंडो अपडेट करा</translation> <translation id="1677472565718498478"><ph name="TIME" /> शिल्लक</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> कनेक्ट केलेले नाही.</translation> <translation id="1677582821739292812">एखादी व्यक्ती तुमच्या स्क्रीनकडे पाहत आहे</translation> @@ -848,6 +849,7 @@ <translation id="493076006037866439">स्क्रीनवर झूम आउट करा</translation> <translation id="4936329710968938986">प्रत्येकजण, बंद आहे</translation> <translation id="4938176435186993759">सर्व सूचना लपवा</translation> +<translation id="4943007472417128747">वायफाय वापरण्यासाठी हॉटस्पॉट बंद केला आहे. हॉटस्पॉट वापरण्यासाठी, वायफाय बंद करा.</translation> <translation id="4945196315133970626">सूचना बंद करा</translation> <translation id="4946376291507881335">कॅप्चर करा</translation> <translation id="495046168593986294">वर स्क्रोल करा</translation> @@ -1392,6 +1394,7 @@ डिव्हाइस बंद करण्यासाठी, डिव्हाइसवरील पॉवर बटण पुन्हा प्रेस करून धरून ठेवा.</translation> <translation id="7526573455193969409">नेटवर्कचे परीक्षण केले जाऊ शकते</translation> <translation id="7536035074519304529">IP पत्ता: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">डावी विंडो अपडेट करा</translation> <translation id="7543399541175347147">Linux अॅप्स आणि गुप्त विंडोना सध्या सपोर्ट नाही. इतर ॲप्स सेव्ह केली जातील.</translation> <translation id="7544300628205093162">कीबोर्ड बॅकलाइट सुरू आहे</translation> <translation id="7548434653388805669">झोपण्याची वेळ</translation> @@ -1472,6 +1475,7 @@ <translation id="7893503627044934815">ही फाइल दिसावी असे वाटत नाही</translation> <translation id="7895348134893321514">टोटे</translation> <translation id="7897375687985782769">तुम्ही स्क्रीन रोटेशनसाठी कीबोर्ड शॉर्टकट दाबला आहे. तुम्हाला स्क्रीन फिरवायची आहे का?</translation> +<translation id="7901190436359881020">विंडो स्वॅप करा</translation> <translation id="7901405293566323524">फोन हब</translation> <translation id="7902625623987030061">फिंगरप्रिंट सेन्सरला स्पर्श करा</translation> <translation id="7904094684485781019">या खात्याच्या ॲडमिनिस्ट्रेटरने एकाहून अधिक साइन इन ची परवानगी रद्द केली आहे.</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index 8a547f4..0a27fec 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Peranti USB-C (port depan)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> diubah kepada <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Klik sahkan untuk menyimpan perubahan. Tetapan terdahulu akan dipulihkan dalam masa <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Peranti Bluetooth "<ph name="DEVICE_NAME" />" ingin kebenaran untuk berpasangan. Sila masukkan kod PIN ini pada peranti tersebut: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Tindakan ini membenarkan <ph name="APP_NAME" /> dan semua apl dan laman web dengan kebenaran lokasi dan ChromeOS untuk menggunakan Wi-Fi dan lokasi rangkaian mudah alih.</translation> <translation id="1017556409696559990">Minimumkan tetingkap pada bahagian atas jika tiada sejarah lama pada Chrome</translation> <translation id="1024364763893396229">Simpan <ph name="NAME" /> anda</translation> <translation id="1032891413405719768">Bateri stilus lemah</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Buka halaman Sejarah</translation> <translation id="1654477262762802994">Mulakan pertanyaan suara</translation> <translation id="1668469839109562275">VPN terbina dalam</translation> +<translation id="1675844249244994876">Kemaskinikan tetingkap kanan</translation> <translation id="1677472565718498478">Berbaki <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> tidak disambungkan.</translation> <translation id="1677582821739292812">Seseorang sedang memandang skrin anda</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Hidupkan akses lokasi</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> telah dinyahsemat</translation> <translation id="1838895407229022812">Cahaya Malam dimatikan.</translation> <translation id="1854180393107901205">Berhenti menghantar</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Apakah yang boleh anda lakukan?</translation> <translation id="3256109297135787951">Buang serlahan daripada item pada rak anda</translation> <translation id="3260969790895726815">Pertuturan diproses secara setempat dan pengimlakan berfungsi di luar talian, tetapi beberapa perintah suara tidak akan berfungsi.</translation> +<translation id="3265032511221679826">Hidupkan akses lokasi tepat?</translation> <translation id="3269597722229482060">Klik Kanan</translation> <translation id="3289364673986435196">Menu kuasa</translation> <translation id="3289544412142055976">Apl Linux tidak disokong pada masa ini</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Pengguna terurus</translation> <translation id="3666266999138159418">Leret untuk menyembunyikan tetingkap terapung anda</translation> <translation id="367531336287639526">Pilih ikon pertama pada sebelah kiri bar alamat</translation> +<translation id="3677931086890821290">Tindakan ini membenarkan semua apl dan laman web dengan kebenaran lokasi dan ChromeOS untuk menggunakan Wi-Fi dan lokasi rangkaian mudah alih.</translation> <translation id="3679827876008292680">Akses tab terakhir dalam tetingkap</translation> <translation id="36813544980941320">Rangkaian Wi-Fi akan dikongsi antara telefon anda dengan <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Laman web</translation> @@ -845,6 +850,7 @@ <translation id="493076006037866439">Zum keluar daripada skrin</translation> <translation id="4936329710968938986">Semua orang, dimatikan</translation> <translation id="4938176435186993759">Sembunyikan semua cadangan</translation> +<translation id="4943007472417128747">Tempat Liputan telah dimatikan untuk menggunakan Wi-Fi. Untuk menggunakan Tempat Liputan, matikan Wi-Fi.</translation> <translation id="4945196315133970626">Matikan pemberitahuan</translation> <translation id="4946376291507881335">Tangkap</translation> <translation id="495046168593986294">Tatal ke atas</translation> @@ -1389,6 +1395,7 @@ Untuk mematikan peranti, tekan dan tahan butang kuasa pada peranti sekali lagi.</translation> <translation id="7526573455193969409">Rangkaian mungkin dipantau</translation> <translation id="7536035074519304529">Alamat IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Kemaskinikan tetingkap kiri</translation> <translation id="7543399541175347147">Apl Linux dan tetingkap inkognito tidak disokong pada masa ini. Apl lain akan disimpan.</translation> <translation id="7544300628205093162">Cahaya belakang papan kekunci dihidupkan</translation> <translation id="7548434653388805669">Masa untuk tidur</translation> @@ -1469,6 +1476,7 @@ <translation id="7893503627044934815">Tidak mahu fail ini ditunjukkan</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Anda menekan pintasan papan kekunci untuk putaran skrin. Adakah anda ingin memutarkan skrin?</translation> +<translation id="7901190436359881020">Tukar tetingkap</translation> <translation id="7901405293566323524">Hab Telefon</translation> <translation id="7902625623987030061">Sentuh penderia cap jari</translation> <translation id="7904094684485781019">Pentadbir akaun ini tidak membenarkan berbilang log masuk.</translation> @@ -1744,6 +1752,7 @@ <translation id="9198992156681343238">Peleraian <ph name="DISPLAY_NAME" /> telah ditukar kepada <ph name="RESOLUTION" />. Klik sahkan untuk menyimpan perubahan. Tetapan terdahulu akan dipulihkan dalam masa <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Sambungkan <ph name="NAME" /> kepada Chromebook ini</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Diurus oleh Pentadbir anda</translation> +<translation id="9207682216934703221">Tindakan ini membenarkan <ph name="APP_NAME" />, <ph name="APP2_NAME" /> dan semua apl dan laman web dengan kebenaran lokasi dan ChromeOS untuk menggunakan Wi-Fi dan lokasi rangkaian mudah alih.</translation> <translation id="9210037371811586452">Keluar daripada mod desktop bersatu</translation> <translation id="9211490828691860325">Semua meja</translation> <translation id="9211681782751733685">Tinggal <ph name="TIME_REMAINING" /> sehingga bateri dicas sepenuhnya.</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 8c9977f5..54c8e9e 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">ဝင်းဒိုးကို မှတ်တမ်းတင်ရန် Enter နှိပ်ပါ</translation> <translation id="5978382165065462689">အဝေးမှ ထောက်ကူခြင်း ဆိုသည်မှ တဆင့် သင့်ဖန်သားပြင်အားမျှဝေသုံးစွဲခြင်း။</translation> <translation id="5980301590375426705">ဧည့်သည် ထွက်ရန်</translation> +<translation id="5983567367406220847">အသုံးပြုမှုမရှိသဖြင့် ဟော့စပေါ့ကို ပိတ်လိုက်သည်။</translation> <translation id="598407983968395253">နမူနာပုံစံ သုံးရန်</translation> <translation id="598882571027504733">အပ်ဒိတ်ရယူနိုင်ရန်အတွက် ကီးဘုတ်ကို ချိတ်ဆက်ထားပြီး Chromebook ကို ပြန်လည်စတင်ပါ။</translation> <translation id="6002179289567220515">ပကတိခလုတ်ဖြင့် ကင်မရာ ၁ ခုကို ပိတ်လိုက်သည်။ ကင်မရာအာလုံး၏ သုံးခွင့်ကိုလည်း ပိတ်နိုင်သည်။</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">အပလီကေးရှင်းတစ်ခုက သင့်ကင်မရာကို အသုံးပြုနေသည်</translation> <translation id="7453330308669753048">ရှာဖွေမှတ်တမ်းရလဒ်ကို ဖယ်ရှားပြီးပြီ</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | အားပြည့်ရန် <ph name="TIME" /> ကျန်သည်</translation> +<translation id="7459485586006128091">အတွင်းပိုင်း အမှားကြောင့် ဟော့စပေါ့ကို ပိတ်လိုက်သည်။ ခဏအကြာတွင် ပြန်ချိတ်ဆက်ကြည့်ပါ။</translation> <translation id="7461924472993315131">ပင်နံပါတ်</translation> <translation id="746232733191930409">ဖန်သားပြင်ရိုက်ကူးခြင်းမုဒ်</translation> <translation id="7466449121337984263">အာရုံခံကိရိယာကို ထိပါ</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">အပ်ဒိတ်အသေးစိတ် အချက်အလက်များကို ကြည့်ရန် နှိပ်ပါ</translation> <translation id="7768784765476638775">စကားပြော-ရွေးရန်</translation> <translation id="7769299611924763557">သင်၏ GIF မကြာမီ အသင့်ဖြစ်ပါမည်</translation> +<translation id="7773536009433685931">၎င်းအစား WiFi ဖွင့်ရန်</translation> <translation id="7780094051999721182">ဖြတ်လမ်းလင့်ခ်များ</translation> <translation id="7780159184141939021">မျက်နှာပြင် လှည့်ခြင်း</translation> <translation id="7796735576426975947">အကြောင်းကြားချက်အသစ် ဖျောက်ထားသည်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index f0540162..80209f1c 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">हिस्ट्री पेज खोल्नुहोस्</translation> <translation id="1654477262762802994">आवाजमार्फत गरिने क्वेरी सुरु गर्नुहोस्</translation> <translation id="1668469839109562275">अन्तर्निर्मित VPN</translation> +<translation id="1675844249244994876">दायाँ विन्डो मिलाउनुहोस्</translation> <translation id="1677472565718498478"><ph name="TIME" /> बाँकी छ</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> कनेक्ट गरिएको छैन।</translation> <translation id="1677582821739292812">कुनै व्यक्तिले तपाईंको स्क्रिनमा हेरिरहनुभएको छ</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">स्क्रिनमा जुम आउट गर्नुहोस्</translation> <translation id="4936329710968938986">सबैका लागि, अफ छ</translation> <translation id="4938176435186993759">सबै सिफारिसहरू लुकाइयोस्</translation> +<translation id="4943007472417128747">WiFi प्रयोग गर्नका निम्ति हटस्पट अफ गरिएको छ। हटस्पट प्रयोग गर्न WiFi अफ गर्नुहोस्।</translation> <translation id="4945196315133970626">सूचनाहरू अफ गर्नुहोस्</translation> <translation id="4946376291507881335">फोटो खिच्नुहोस्</translation> <translation id="495046168593986294">माथि स्क्रोल गर्नुहोस्</translation> @@ -1388,6 +1390,7 @@ डिभाइस सट डाउन गर्न डिभाइसमा रहेको पावर बटन फेरि थिचिराख्नुहोस्।</translation> <translation id="7526573455193969409">नेटवर्कको अनुगमन गरिने सम्भावना छ</translation> <translation id="7536035074519304529">IP एड्रेस: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">बायाँ विन्डो मिलाउनुहोस्</translation> <translation id="7543399541175347147">Linux एप र इन्कोग्निटो विन्डो हाल प्रयोग गर्न मिल्दैन। अन्य एपहरू सेभ गरिने छन्।</translation> <translation id="7544300628205093162">किबोर्डको ब्याकलाइट अन छ</translation> <translation id="7548434653388805669">सुत्ने बेला भयो</translation> @@ -1468,6 +1471,7 @@ <translation id="7893503627044934815">मलाई यो फाइल नदेखाइयोस्</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">तपाईंले स्क्रिन घुमाउनेसम्बन्धी किबोर्ड सर्टकट थिच्नुभयो। तपाईं स्क्रिन घुमाउन चाहनुहुन्छ?</translation> +<translation id="7901190436359881020">विन्डोहरू अदलबदल गर्नुहोस्</translation> <translation id="7901405293566323524">फोन हब</translation> <translation id="7902625623987030061">फिंगरप्रिन्ट सेन्सरमा छुनुहोस्</translation> <translation id="7904094684485781019">यो खाताको प्रशासकले बहु साइन इनलाई अनुमति दिएको छैन ।</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index 3ce61ed..3998feb 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C-apparaat (poort aan voorkant)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> gewijzigd in <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Klik op Bevestigen om de wijzigingen te behouden. De vorige instellingen worden over <ph name="TIMEOUT_SECONDS" /> hersteld.</translation> <translation id="1013923882670373915">Bluetooth-apparaat '<ph name="DEVICE_NAME" />' wil rechten om te koppelen. Voer de volgende pincode in op dat apparaat: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Hiermee kunnen <ph name="APP_NAME" /> en alle apps en websites met locatierechten en ChromeOS de locatie van wifi en mobiele netwerken gebruiken.</translation> <translation id="1017556409696559990">Het bovenste venster minimaliseren als er geen geschiedenis voor teruggaan in Chrome is</translation> <translation id="1024364763893396229">Je <ph name="NAME" /> opslaan</translation> <translation id="1032891413405719768">Batterij van stylus bijna leeg</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Pagina Geschiedenis openen</translation> <translation id="1654477262762802994">Een gesproken zoekopdracht starten</translation> <translation id="1668469839109562275">Ingebouwde VPN</translation> +<translation id="1675844249244994876">Het rechtervenster updaten</translation> <translation id="1677472565718498478"><ph name="TIME" /> resterend</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> is niet verbonden.</translation> <translation id="1677582821739292812">Iemand bekijkt je scherm</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Locatietoegang aanzetten</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> is losgemaakt</translation> <translation id="1838895407229022812">Nachtverlichting staat uit.</translation> <translation id="1854180393107901205">Casten stoppen</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Wat kun je doen?</translation> <translation id="3256109297135787951">De markering voor een item op je plank verwijderen</translation> <translation id="3260969790895726815">Spraak wordt lokaal verwerkt en dicteren werkt offline, maar sommige spraakopdrachten werken niet.</translation> +<translation id="3265032511221679826">Toegang tot exacte locatie aanzetten?</translation> <translation id="3269597722229482060">Klikken met rechtermuisknop</translation> <translation id="3289364673986435196">Aan/uit-menu</translation> <translation id="3289544412142055976">Linux-apps worden momenteel niet ondersteund</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733">Beheerde gebruiker <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Swipe om het zwevende venster te verbergen</translation> <translation id="367531336287639526">Het eerste icoon links van de adresbalk selecteren</translation> +<translation id="3677931086890821290">Hiermee kunnen alle apps en websites met locatierechten en ChromeOS de locatie van wifi en mobiele netwerken gebruiken.</translation> <translation id="3679827876008292680">Naar het laatste tabblad in het venster gaan</translation> <translation id="36813544980941320">Wifi-netwerken worden gedeeld tussen je telefoon en <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Websites</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Uitzoomen op scherm</translation> <translation id="4936329710968938986">Iedereen, uit</translation> <translation id="4938176435186993759">Alle suggesties verbergen</translation> +<translation id="4943007472417128747">De hotspot is uitgezet om wifi te gebruiken. Zet wifi uit om de hotspot te gebruiken.</translation> <translation id="4945196315133970626">Meldingen uitzetten</translation> <translation id="4946376291507881335">Opnemen</translation> <translation id="495046168593986294">Omhoog scrollen</translation> @@ -1067,6 +1073,7 @@ <translation id="5976112937189445008">Druk op Enter om het venster op te nemen</translation> <translation id="5978382165065462689">De controle over je scherm delen via externe support.</translation> <translation id="5980301590375426705">Gastsessie sluiten</translation> +<translation id="5983567367406220847">De hotspot is uitgezet vanwege inactiviteit.</translation> <translation id="598407983968395253">Template gebruiken</translation> <translation id="598882571027504733">Als je de update wilt downloaden, sluit je het toetsenbord aan en start je je Chromebook opnieuw op</translation> <translation id="6002179289567220515">Je hebt de fysieke schakelaar gebruikt om 1 camera uit te zetten. Je kunt de toegang ook voor alle camera's uitzetten.</translation> @@ -1366,6 +1373,7 @@ <translation id="7452560014878697800">Een app gebruikt je camera</translation> <translation id="7453330308669753048">Zoekgeschiedenisresultaat verwijderd</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> tot volledig opgeladen</translation> +<translation id="7459485586006128091">De hotspot is uitgezet vanwege een interne fout. Probeer over een paar minuten opnieuw verbinding te maken.</translation> <translation id="7461924472993315131">Vastzetten</translation> <translation id="746232733191930409">Schermopnamemodus</translation> <translation id="7466449121337984263">Raak de sensor aan</translation> @@ -1385,6 +1393,7 @@ Als je het apparaat wilt uitzetten, houd je de aan/uit-knop op het apparaat weer ingedrukt.</translation> <translation id="7526573455193969409">Netwerk kan worden bijgehouden</translation> <translation id="7536035074519304529">IP-adres: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Het linkervenster updaten</translation> <translation id="7543399541175347147">Linux-apps en incognitovensters worden momenteel niet ondersteund. Andere apps worden opgeslagen.</translation> <translation id="7544300628205093162">Achtergrondverlichting van toetsenbord staat aan</translation> <translation id="7548434653388805669">Bedtijd</translation> @@ -1438,6 +1447,7 @@ <translation id="776344839111254542">Klik om updategegevens te bekijken</translation> <translation id="7768784765476638775">Selecteer om voor te lezen</translation> <translation id="7769299611924763557">Je gif is bijna klaar</translation> +<translation id="7773536009433685931">Wifi aanzetten</translation> <translation id="7780094051999721182">snelkoppelingen</translation> <translation id="7780159184141939021">Scherm draaien</translation> <translation id="7796735576426975947">Nieuwe melding verborgen</translation> @@ -1465,6 +1475,7 @@ <translation id="7893503627044934815">Wil niet dat dit bestand wordt getoond</translation> <translation id="7895348134893321514">Bak</translation> <translation id="7897375687985782769">Je hebt op de sneltoets voor schermrotatie gedrukt. Wil je het scherm draaien?</translation> +<translation id="7901190436359881020">De vensters omwisselen</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Raak de vingerafdruksensor aan</translation> <translation id="7904094684485781019">De beheerder van dit account heeft toegang tot meerdere accounts niet toegestaan.</translation> @@ -1740,6 +1751,7 @@ <translation id="9198992156681343238">De resolutie van <ph name="DISPLAY_NAME" /> is gewijzigd in <ph name="RESOLUTION" />. Klik op 'Bevestigen' om de wijzigingen te behouden. De vorige instellingen worden over <ph name="TIMEOUT_SECONDS" /> hersteld.</translation> <translation id="9201044636667689546"><ph name="NAME" /> koppelen aan deze Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, beheerd door je beheerder</translation> +<translation id="9207682216934703221">Hiermee kunnen <ph name="APP_NAME" />, <ph name="APP2_NAME" /> en alle apps en websites met locatierechten en ChromeOS de locatie van wifi en mobiele netwerken gebruiken.</translation> <translation id="9210037371811586452">Samengestelde desktopmodus wordt gesloten</translation> <translation id="9211490828691860325">Alle bureaus</translation> <translation id="9211681782751733685">Nog <ph name="TIME_REMAINING" /> totdat de batterij volledig is opgeladen.</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index e25305706..cf126ad 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">Trykk på Enter for å ta opp vinduet</translation> <translation id="5978382165065462689">Deler kontroll av skjermen via fjernhjelp.</translation> <translation id="5980301590375426705">Avslutt gjesteøkten</translation> +<translation id="5983567367406220847">Wifi-sonen er slått av på grunn av inaktivitet.</translation> <translation id="598407983968395253">Bruk mal</translation> <translation id="598882571027504733">For å laste ned oppdateringen, start Chromebooken på nytt med tastaturet tilkoblet.</translation> <translation id="6002179289567220515">Du brukte den fysiske bryteren til å slå av ett kamera. Du kan også slå av tilgangen for alle kameraene.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">Et program bruker kameraet ditt</translation> <translation id="7453330308669753048">Resultatet er fjernet fra søkeloggen</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" /> % | <ph name="TIME" /> til fulladet</translation> +<translation id="7459485586006128091">Wifi-sonen er slått av på grunn av en intern feil. Prøv å koble til på nytt om noen minutter.</translation> <translation id="7461924472993315131">Fest</translation> <translation id="746232733191930409">Skjermopptaksmodus</translation> <translation id="7466449121337984263">Trykk på sensoren</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">Klikk for å se oppdateringsdetaljene</translation> <translation id="7768784765476638775">Tekstopplesing</translation> <translation id="7769299611924763557">GIF-en din er snart klar</translation> +<translation id="7773536009433685931">Slå på wifi i stedet</translation> <translation id="7780094051999721182">snarveier</translation> <translation id="7780159184141939021">Rotér skjermen</translation> <translation id="7796735576426975947">Et nytt varsel er skjult</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 964bdd4..058256a 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C ਡੀਵਾਈਸ (ਅੱਗੇ ਦਾ ਪੋਰਟ)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> ਨੂੰ <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) 'ਤੇ ਬਦਲਿਆ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਨੂੰ ਬਣਾਈ ਰੱਖਣ ਲਈ 'ਤਸਦੀਕ ਕਰੋ' 'ਤੇ ਕਲਿੱਕ ਕਰੋ। ਪਿਛਲੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ <ph name="TIMEOUT_SECONDS" /> ਵਿੱਚ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="1013923882670373915">Bluetooth ਡੀਵਾਈਸ "<ph name="DEVICE_NAME" />" ਜੋੜਾਬੱਧ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਚਾਹੁੰਦਾ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਉਸ ਡੀਵਾਈਸ 'ਤੇ ਇਹ ਪਿੰਨ ਦਾਖਲ ਕਰੋ: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">ਇਸ ਨਾਲ <ph name="APP_NAME" /> ਅਤੇ ਉਨ੍ਹਾਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਵਾਈ-ਫਾਈ ਅਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਦਾ ਟਿਕਾਣਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ ਜਿਨ੍ਹਾਂ ਕੋਲ ਟਿਕਾਣਾ ਇਜਾਜ਼ਤ ਅਤੇ ChromeOS ਹੈ।</translation> <translation id="1017556409696559990">Chrome ਵਿੱਚ ਕੋਈ ਵੀ ਪੁਰਾਣਾ ਇਤਿਹਾਸ ਨਾ ਹੋਣ 'ਤੇ ਉੱਪਰਲੀ ਵਿੰਡੋ ਨੂੰ ਛੋਟਾ ਕਰੋ</translation> <translation id="1024364763893396229">ਆਪਣਾ <ph name="NAME" /> ਰੱਖਿਅਤ ਕਰੋ</translation> <translation id="1032891413405719768">ਸਟਾਈਲਸ ਦੀ ਬੈਟਰੀ ਘੱਟ ਹੈ</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">'ਇਤਿਹਾਸ' ਪੰਨਾ ਖੋਲ੍ਹੋ</translation> <translation id="1654477262762802994">ਅਵਾਜ਼ੀ ਪੁੱਛਗਿੱਛ ਸ਼ੁਰੂ ਕਰੋ</translation> <translation id="1668469839109562275">ਅੰਦਰ-ਮੌਜੂਦ VPN</translation> +<translation id="1675844249244994876">ਸੱਜੀ ਵਿੰਡੋ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="1677472565718498478"><ph name="TIME" /> ਬਾਕੀ</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> ਕਨੈਕਟ ਨਹੀਂ ਹੈ।</translation> <translation id="1677582821739292812">ਕੋਈ ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਵੱਲ ਦੇਖ ਰਿਹਾ ਹੈ</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ਈਥਰਨੈੱਟ: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">ਟਿਕਾਣਾ ਪਹੁੰਚ ਚਾਲੂ ਕਰੋ</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> ਨੂੰ ਅਨਪਿੰਨ ਕੀਤਾ ਗਿਆ ਸੀ</translation> <translation id="1838895407229022812">ਰਾਤ ਦੀ ਰੋਸ਼ਨੀ ਬੰਦ ਹੈ।</translation> <translation id="1854180393107901205">ਕਾਸਟ ਕਰਨਾ ਰੋਕੋ</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ?</translation> <translation id="3256109297135787951">ਆਪਣੀ ਸ਼ੈਲਫ਼ 'ਤੇ ਕਿਸੇ ਆਈਟਮ ਦਾ ਉਜਾਗਰ ਹੋਣਾ ਹਟਾਓ</translation> <translation id="3260969790895726815">ਬੋਲੀ 'ਤੇ ਸਥਾਨਕ ਤੌਰ 'ਤੇ ਪ੍ਰਕਿਰਿਆ ਕੀਤੀ ਜਾਂਦੀ ਹੈ ਅਤੇ ਡਿਕਟੇਸ਼ਨ ਆਫ਼ਲਾਈਨ ਕੰਮ ਕਰਦੀ ਹੈ, ਪਰ ਕੁਝ ਅਵਾਜ਼ੀ ਆਦੇਸ਼ ਕੰਮ ਨਹੀਂ ਕਰਨਗੇ।</translation> +<translation id="3265032511221679826">ਕੀ ਸਹੀ ਟਿਕਾਣੇ ਦੀ ਪਹੁੰਚ ਨੂੰ ਚਾਲੂ ਕਰਨਾ ਹੈ?</translation> <translation id="3269597722229482060">ਸੱਜਾ-ਕਲਿੱਕ</translation> <translation id="3289364673986435196">ਪਾਵਰ ਮੀਨੂ</translation> <translation id="3289544412142055976">Linux ਐਪਾਂ ਫ਼ਿਲਹਾਲ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> ਪ੍ਰਬੰਧਿਤ ਵਰਤੋਂਕਾਰ</translation> <translation id="3666266999138159418">ਆਪਣੀ ਫਲੋਟਿੰਗ ਵਿੰਡੋ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਸਵਾਈਪ ਕਰੋ</translation> <translation id="367531336287639526">ਪਤਾ ਬਾਰ ਦੇ ਖੱਬੇ ਪਾਸੇ ਵਾਲੇ ਪਹਿਲੇ ਪ੍ਰਤੀਕ ਨੂੰ ਚੁਣੋ</translation> +<translation id="3677931086890821290">ਇਸ ਨਾਲ ਉਨ੍ਹਾਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਵਾਈ-ਫਾਈ ਅਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਦਾ ਟਿਕਾਣਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ ਜਿਨ੍ਹਾਂ ਕੋਲ ਟਿਕਾਣਾ ਇਜਾਜ਼ਤ ਅਤੇ ChromeOS ਹੈ।</translation> <translation id="3679827876008292680">ਵਿੰਡੋ ਵਿੱਚ ਆਖਰੀ ਟੈਬ 'ਤੇ ਜਾਓ</translation> <translation id="36813544980941320">ਤੁਹਾਡੇ ਫ਼ੋਨ ਅਤੇ <ph name="DEVICE_NAME" /> ਵਿਚਾਲੇ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਸਾਂਝਾ ਕੀਤਾ ਜਾਵੇਗਾ</translation> <translation id="3694122362646626770">ਵੈਬਸਾਈਟਾਂ</translation> @@ -845,6 +850,7 @@ <translation id="493076006037866439">ਸਕ੍ਰੀਨ ਦਾ ਜ਼ੂਮ ਘਟਾਓ</translation> <translation id="4936329710968938986">ਹਰ ਕੋਈ, ਬੰਦ</translation> <translation id="4938176435186993759">ਸਾਰੇ ਸੁਝਾਵਾਂ ਨੂੰ ਲੁਕਾਓ</translation> +<translation id="4943007472417128747">ਵਾਈ-ਫਾਈ ਵਰਤਣ ਲਈ ਹੌਟਸਪੌਟ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਹੌਟਸਪੌਟ ਵਰਤਣ ਲਈ, ਵਾਈ-ਫਾਈ ਨੂੰ ਬੰਦ ਕਰੋ।</translation> <translation id="4945196315133970626">ਸੂਚਨਾਵਾਂ ਬੰਦ ਕਰੋ</translation> <translation id="4946376291507881335">ਕੈਪਚਰ ਕਰੋ</translation> <translation id="495046168593986294">ਉੱਪਰ ਵੱਲ ਸਕ੍ਰੋਲ ਕਰੋ</translation> @@ -1389,6 +1395,7 @@ ਡੀਵਾਈਸ ਨੂੰ ਬੰਦ ਕਰਨ ਲਈ, ਡੀਵਾਈਸ 'ਤੇ ਦੁਬਾਰਾ ਪਾਵਰ ਬਟਨ ਦਬਾਈ ਰੱਖੋ।</translation> <translation id="7526573455193969409">ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਨੈੱਟਵਰਕ ਦੀ ਨਿਗਰਾਨੀ ਹੋ ਰਹੀ ਹੋਵੇ</translation> <translation id="7536035074519304529">IP ਪਤਾ: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">ਖੱਬੀ ਵਿੰਡੋ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="7543399541175347147">Linux ਐਪਾਂ ਅਤੇ ਇਨਕੋਗਨਿਟੋ ਵਿੰਡੋਆਂ ਫ਼ਿਲਹਾਲ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ। ਹੋਰ ਐਪਾਂ ਨੂੰ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="7544300628205093162">ਕੀ-ਬੋਰਡ ਬੈਕਲਾਈਟ ਚਾਲੂ ਹੈ</translation> <translation id="7548434653388805669">ਸੌਣ ਦਾ ਸਮਾਂ ਹੋ ਗਿਆ ਹੈ</translation> @@ -1469,6 +1476,7 @@ <translation id="7893503627044934815">ਇਸ ਫ਼ਾਈਲ ਨੂੰ ਦਿਸਣ ਨਹੀਂ ਦੇਣਾ ਚਾਹੁੰਦੇ</translation> <translation id="7895348134893321514">ਟੋਟ</translation> <translation id="7897375687985782769">ਤੁਸੀਂ ਸਕ੍ਰੀਨ ਘੁਮਾਉਣ ਲਈ ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਦਬਾਇਆ ਹੈ। ਕੀ ਤੁਸੀਂ ਸਕ੍ਰੀਨ ਘੁਮਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?</translation> +<translation id="7901190436359881020">ਵਿੰਡੋਆਂ ਨੂੰ ਸਵੈਪ ਕਰੋ</translation> <translation id="7901405293566323524">ਫ਼ੋਨ ਹੱਬ</translation> <translation id="7902625623987030061">ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨੂੰ ਸਪਰਸ਼ ਕਰੋ</translation> <translation id="7904094684485781019">ਇਸ ਖਾਤੇ ਦੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਨੂੰ ਇਜਾਜ਼ਤ ਨਹੀਂ ਦਿੱਤੀ ਹੈ।</translation> @@ -1744,6 +1752,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਨੂੰ <ph name="RESOLUTION" /> 'ਤੇ ਬਦਲ ਦਿੱਤਾ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਨੂੰ ਬਣਾਈ ਰੱਖਣ ਲਈ 'ਤਸਦੀਕ ਕਰੋ' 'ਤੇ ਕਲਿੱਕ ਕਰੋ। ਪਿਛਲੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ <ph name="TIMEOUT_SECONDS" /> ਵਿੱਚ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾਵੇਗਾ।</translation> <translation id="9201044636667689546"><ph name="NAME" /> ਨੂੰ ਇਸ Chromebook ਨਾਲ ਕਨੈਕਟ ਕਰੋ</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> +<translation id="9207682216934703221">ਇਸ ਨਾਲ <ph name="APP_NAME" />, <ph name="APP2_NAME" /> ਅਤੇ ਉਨ੍ਹਾਂ ਸਾਰੀਆਂ ਐਪਾਂ ਅਤੇ ਵੈੱਬਸਾਈਟਾਂ ਨੂੰ ਵਾਈ-ਫਾਈ ਅਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕਾਂ ਦਾ ਟਿਕਾਣਾ ਵਰਤਣ ਦੀ ਆਗਿਆ ਮਿਲਦੀ ਹੈ ਜਿਨ੍ਹਾਂ ਕੋਲ ਟਿਕਾਣਾ ਇਜਾਜ਼ਤ ਅਤੇ ChromeOS ਹੈ।</translation> <translation id="9210037371811586452">'ਯੂਨੀਫਾਈਡ ਡੈਸਕਟਾਪ ਮੋਡ' ਤੋਂ ਬਾਹਰ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="9211490828691860325">ਸਾਰੇ ਡੈਸਕ</translation> <translation id="9211681782751733685">ਬੈਟਰੀ ਦੇ ਪੂਰਾ ਚਾਰਜ ਹੋਣ ਵਿੱਚ <ph name="TIME_REMAINING" /> ਬਾਕੀ।</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index e58c27b..cb6ea48 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Urządzenie USB-C (przedni port)</translation> <translation id="1013598600051641573">Rozdzielczość ekranu <ph name="DISPLAY_NAME" /> została zmieniona na <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Kliknij „Potwierdź”, by zachować zmiany. Poprzednie ustawienia zostaną przywrócone za <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Urządzenie Bluetooth „<ph name="DEVICE_NAME" />” chce się sparować. Wpisz na nim ten kod PIN: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Ta funkcja sprawia, że <ph name="APP_NAME" />, wszystkie aplikacje i strony, które mają dostęp do lokalizacji, a także ChromeOS, mogą korzystać z Wi-Fi i sieci komórkowych do geolokalizacji.</translation> <translation id="1017556409696559990">Gdy w Chrome nie ma historii, minimalizuj okno u góry</translation> <translation id="1024364763893396229">Zapisz urządzenie <ph name="NAME" /></translation> <translation id="1032891413405719768">Niski poziom baterii rysika</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Otwórz stronę Historia</translation> <translation id="1654477262762802994">Rozpocznij zapytanie głosowe</translation> <translation id="1668469839109562275">Wbudowana sieć VPN</translation> +<translation id="1675844249244994876">Zaktualizuj okno po prawej stronie</translation> <translation id="1677472565718498478">Pozostało <ph name="TIME" /></translation> <translation id="1677507110654891115">Funkcja <ph name="FEATURE_NAME" /> nie ma połączenia.</translation> <translation id="1677582821739292812">Ktoś patrzy na Twój ekran</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Włącz dostęp do lokalizacji</translation> <translation id="1830308660060964064">Element <ph name="ITEM_TITLE" /> został odpięty</translation> <translation id="1838895407229022812">Podświetlenie nocne jest wyłączone.</translation> <translation id="1854180393107901205">Zatrzymaj przesyłanie</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Co potrafisz?</translation> <translation id="3256109297135787951">Anuluj zaznaczenia elementu na półce</translation> <translation id="3260969790895726815">Mowa jest przetwarzana lokalnie, a dyktowanie działa offline, ale niektóre polecenia głosowe nie będą działać.</translation> +<translation id="3265032511221679826">Włączyć dostęp do dokładnej lokalizacji?</translation> <translation id="3269597722229482060">Kliknij prawym</translation> <translation id="3289364673986435196">Menu zasilania</translation> <translation id="3289544412142055976">Aplikacje na Linuksa nie są obecnie obsługiwane</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733">Użytkownik zarządzany <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Przesuń, aby ukryć pływające okno</translation> <translation id="367531336287639526">Wybierz pierwszą ikonę na lewo od paska adresu</translation> +<translation id="3677931086890821290">Ta funkcja sprawia, że wszystkie aplikacje i strony, które mają dostęp do lokalizacji, a także ChromeOS, mogą korzystać z Wi-Fi i sieci komórkowych do geolokalizacji.</translation> <translation id="3679827876008292680">Przejdź do ostatniej karty w oknie</translation> <translation id="36813544980941320">Twój telefon i <ph name="DEVICE_NAME" /> będą wspólnie korzystać z sieci Wi-Fi</translation> <translation id="3694122362646626770">Witryny</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Pomniejsz na ekranie</translation> <translation id="4936329710968938986">Wszystkim, wyłączono</translation> <translation id="4938176435186993759">Ukryj wszystkie sugestie</translation> +<translation id="4943007472417128747">Hotspot został wyłączony, żeby można było korzystać z Wi-Fi. Aby korzystać z hotspota, wyłącz Wi-Fi.</translation> <translation id="4945196315133970626">Wyłącz powiadomienia</translation> <translation id="4946376291507881335">Zapis</translation> <translation id="495046168593986294">Przewiń w górę</translation> @@ -1067,6 +1073,7 @@ <translation id="5976112937189445008">Aby nagrać okno, naciśnij Enter</translation> <translation id="5978382165065462689">Udostępnianie sterowania ekranem przy użyciu pomocy zdalnej.</translation> <translation id="5980301590375426705">Zakończ sesję gościa</translation> +<translation id="5983567367406220847">Z powodu braku aktywności hotspot został wyłączony.</translation> <translation id="598407983968395253">Użyj szablonu</translation> <translation id="598882571027504733">Aby pobrać aktualizację, uruchom Chromebooka ponownie z podłączoną klawiaturą.</translation> <translation id="6002179289567220515">Wyłączyłeś(-aś) 1 kamerę za pomocą fizycznego przełącznika. Możesz też wyłączyć dostęp do wszystkich kamer.</translation> @@ -1368,6 +1375,7 @@ <translation id="7452560014878697800">Aplikacja używa kamery</translation> <translation id="7453330308669753048">Wynik historii wyszukiwania został usunięty</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | Pełne naładowanie za <ph name="TIME" /></translation> +<translation id="7459485586006128091">Hotspot został wyłączony z powodu błędu wewnętrznego. Za kilka minut spróbuj jeszcze raz nawiązać połączenie.</translation> <translation id="7461924472993315131">Przypnij</translation> <translation id="746232733191930409">Tryb nagrywania ekranu</translation> <translation id="7466449121337984263">Dotknij czytnika</translation> @@ -1387,6 +1395,7 @@ Aby wyłączyć urządzenie, ponownie naciśnij i przytrzymaj na nim przycisk zasilania.</translation> <translation id="7526573455193969409">Sieć może być monitorowana</translation> <translation id="7536035074519304529">Adres IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Zaktualizuj okno po lewej stronie</translation> <translation id="7543399541175347147">Aplikacje na Linuksa ani okna incognito nie są obecnie obsługiwane. Inne aplikacje zostaną zapisane.</translation> <translation id="7544300628205093162">Podświetlenie klawiatury jest włączone</translation> <translation id="7548434653388805669">Czas iść spać</translation> @@ -1440,6 +1449,7 @@ <translation id="776344839111254542">Kliknij, by wyświetlić szczegóły aktualizacji</translation> <translation id="7768784765476638775">Przeczytaj na głos</translation> <translation id="7769299611924763557">Twój GIF będzie wkrótce gotowy</translation> +<translation id="7773536009433685931">W zamian włącz Wi-Fi</translation> <translation id="7780094051999721182">skróty</translation> <translation id="7780159184141939021">Obróć ekran</translation> <translation id="7796735576426975947">Nowe powiadomienie zostało ukryte</translation> @@ -1467,6 +1477,7 @@ <translation id="7893503627044934815">Nie chcę, żeby ten plik był pokazywany</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Naciśnięto skrót klawiszowy obrotu ekranu. Czy chcesz obrócić ekran?</translation> +<translation id="7901190436359881020">Zamień okna</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Dotknij czytnika linii papilarnych</translation> <translation id="7904094684485781019">Administrator tego konta zablokował możliwość wielokrotnego logowania.</translation> @@ -1742,6 +1753,7 @@ <translation id="9198992156681343238">Rozdzielczość ekranu <ph name="DISPLAY_NAME" /> została zmieniona na <ph name="RESOLUTION" />. Kliknij „Potwierdź”, by zachować zmiany. Poprzednie ustawienia zostaną przywrócone za <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Połącz urządzenie <ph name="NAME" /> z tym Chromebookiem</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, zarządzana przez administratora</translation> +<translation id="9207682216934703221">Ta funkcja sprawia, że <ph name="APP_NAME" /> i <ph name="APP2_NAME" /> oraz wszystkie aplikacje i strony, które mają dostęp do lokalizacji, a także ChromeOS, mogą korzystać z Wi-Fi i sieci komórkowych do geolokalizacji.</translation> <translation id="9210037371811586452">Wyłączam tryb ujednoliconego pulpitu</translation> <translation id="9211490828691860325">Wszystkie biurka</translation> <translation id="9211681782751733685">Czas pozostały do pełnego naładowania baterii: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index 43c56a6..cdd856c 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -1073,6 +1073,7 @@ <translation id="5976112937189445008">Pressione "Enter" para gravar janela</translation> <translation id="5978382165065462689">Compartilhando o controle de sua tela por meio da Assistência remota.</translation> <translation id="5980301590375426705">Sair sessão visit.</translation> +<translation id="5983567367406220847">Devido à inatividade, o ponto de acesso foi desativado.</translation> <translation id="598407983968395253">Usar modelo</translation> <translation id="598882571027504733">Para receber a atualização, reinicie seu Chromebook com o teclado conectado.</translation> <translation id="6002179289567220515">Você usou o interruptor físico para desligar 1 câmera. Também é possível desativar o acesso a todas as câmeras.</translation> @@ -1375,6 +1376,7 @@ <translation id="7452560014878697800">Um aplicativo está usando a câmera</translation> <translation id="7453330308669753048">O resultado do histórico de pesquisa foi removido</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | Tempo até a carga completa: <ph name="TIME" /></translation> +<translation id="7459485586006128091">Devido a um erro interno, o ponto de acesso foi desativado. Tente se reconectar em alguns minutos.</translation> <translation id="7461924472993315131">Fixar</translation> <translation id="746232733191930409">Modo de gravação de tela</translation> <translation id="7466449121337984263">Toque no sensor</translation> @@ -1448,6 +1450,7 @@ <translation id="776344839111254542">Clique para ver detalhes da atualização</translation> <translation id="7768784765476638775">Selecionar para ouvir</translation> <translation id="7769299611924763557">Seu GIF estará pronto em breve</translation> +<translation id="7773536009433685931">Ativar o Wi-Fi</translation> <translation id="7780094051999721182">atalhos</translation> <translation id="7780159184141939021">Girar tela</translation> <translation id="7796735576426975947">Nova notificação oculta</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index 5011485a..c297756 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Abrir a página Histórico</translation> <translation id="1654477262762802994">Iniciar uma consulta de voz</translation> <translation id="1668469839109562275">VPN incorporada</translation> +<translation id="1675844249244994876">Atualizar a janela do lado direito</translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> <translation id="1677507110654891115">A funcionalidade <ph name="FEATURE_NAME" /> não está ligada.</translation> <translation id="1677582821739292812">Alguém está a olhar para o seu ecrã</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">Diminuir o zoom do ecrã</translation> <translation id="4936329710968938986">Todos, desativados</translation> <translation id="4938176435186993759">Ocultar todas as sugestões</translation> +<translation id="4943007472417128747">A zona Wi-Fi foi desativada para usar o Wi-Fi. Para usar a zona Wi-Fi, desative o Wi-Fi.</translation> <translation id="4945196315133970626">Desativar notificações</translation> <translation id="4946376291507881335">Capturar</translation> <translation id="495046168593986294">Deslocar para cima</translation> @@ -1390,6 +1392,7 @@ Para encerrar o dispositivo, prima sem soltar o botão ligar/desligar novamente no dispositivo.</translation> <translation id="7526573455193969409">A rede pode ser monitorizada</translation> <translation id="7536035074519304529">Endereço IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Atualizar a janela do lado esquerdo</translation> <translation id="7543399541175347147">De momento, as apps para Linux e as janelas de navegação anónima não são suportadas. As outras apps serão guardadas.</translation> <translation id="7544300628205093162">A retroiluminação do teclado está ativada</translation> <translation id="7548434653388805669">Hora de dormir</translation> @@ -1471,6 +1474,7 @@ <translation id="7893503627044934815">Não quero que este ficheiro seja mostrado</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Premiu o atalho de teclado da rotação do ecrã. Pretende rodar o ecrã?</translation> +<translation id="7901190436359881020">Trocar as janelas</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Toque no sensor de impressões digitais.</translation> <translation id="7904094684485781019">O gestor desta conta removeu a permissão de início de sessão integrado.</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index 849d4c5..2b3d82f 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Deschide pagina Istoric</translation> <translation id="1654477262762802994">Începe o interogare vocală</translation> <translation id="1668469839109562275">Rețea VPN încorporată</translation> +<translation id="1675844249244994876">Actualizează fereastra corectă</translation> <translation id="1677472565718498478">Timp rămas: <ph name="TIME" /></translation> <translation id="1677507110654891115">Opțiunea <ph name="FEATURE_NAME" /> nu s-a conectat.</translation> <translation id="1677582821739292812">Cineva se uită la ecranul tău</translation> @@ -848,6 +849,7 @@ <translation id="493076006037866439">Micșorează ecranul</translation> <translation id="4936329710968938986">Toți, dezactivat</translation> <translation id="4938176435186993759">Ascunde toate sugestiile</translation> +<translation id="4943007472417128747">Hotspotul a fost dezactivat pentru a folosi conexiunea Wi-Fi. Pentru a folosi hotspotul, dezactivează conexiunea Wi-Fi.</translation> <translation id="4945196315133970626">Dezactivează notificările</translation> <translation id="4946376291507881335">Capturează</translation> <translation id="495046168593986294">Derulează în sus</translation> @@ -1392,6 +1394,7 @@ Pentru a închide dispozitivul, apasă lung pe butonul de pornire al dispozitivului din nou.</translation> <translation id="7526573455193969409">Este posibil ca rețeaua să fie monitorizată</translation> <translation id="7536035074519304529">Adresă IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Actualizează fereastra din stânga</translation> <translation id="7543399541175347147">Aplicațiile Linux și ferestrele incognito nu sunt acceptate. Alte aplicații se vor salva.</translation> <translation id="7544300628205093162">Retroiluminarea tastaturii este activată</translation> <translation id="7548434653388805669">Este timpul pentru culcare</translation> @@ -1472,6 +1475,7 @@ <translation id="7893503627044934815">Nu doresc să se afișeze acest fișier</translation> <translation id="7895348134893321514">Manager de clipboard</translation> <translation id="7897375687985782769">Ai apăsat comanda rapidă de la tastatură pentru rotirea ecranului. Vrei să rotești ecranul?</translation> +<translation id="7901190436359881020">Schimbă ferestrele</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Atinge senzorul de amprentă</translation> <translation id="7904094684485781019">Administratorul acestui cont a dezactivat conectarea multiplă.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index 1c6a24e..89648af 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Показать историю</translation> <translation id="1654477262762802994">Произнесите запрос</translation> <translation id="1668469839109562275">Встроенная VPN</translation> +<translation id="1675844249244994876">Обновить окно справа</translation> <translation id="1677472565718498478">Ещё <ph name="TIME" /></translation> <translation id="1677507110654891115">Функция "<ph name="FEATURE_NAME" />" не подключена.</translation> <translation id="1677582821739292812">На ваш экран смотрит другой человек</translation> @@ -848,6 +849,7 @@ <translation id="493076006037866439">Уменьшить масштаб</translation> <translation id="4936329710968938986">Доступно всем: отключено</translation> <translation id="4938176435186993759">Скрыть все подсказки</translation> +<translation id="4943007472417128747">Точка доступа отключена для использования Wi-Fi. Чтобы запустить ее снова, отключите Wi-Fi.</translation> <translation id="4945196315133970626">Отключить уведомления</translation> <translation id="4946376291507881335">Снимок</translation> <translation id="495046168593986294">Прокрутить вверх</translation> @@ -1071,6 +1073,7 @@ <translation id="5976112937189445008">Нажмите Ввод, чтобы записать контент в окне</translation> <translation id="5978382165065462689">Доступ к экрану с помощью удаленного помощника</translation> <translation id="5980301590375426705">Закрыть сеанс гостя</translation> +<translation id="5983567367406220847">Точка доступа отключена из-за бездействия.</translation> <translation id="598407983968395253">Использовать шаблон</translation> <translation id="598882571027504733">Чтобы выполнить обновление, перезагрузите устройство Chromebook, не отключая от него клавиатуру.</translation> <translation id="6002179289567220515">Вы отключили одну камеру при помощи физического переключателя. Можно также запретить доступ ко всем камерам.</translation> @@ -1373,6 +1376,7 @@ <translation id="7452560014878697800">Приложение использует вашу камеру</translation> <translation id="7453330308669753048">Результат удален из истории поиска</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" /> % | До полной зарядки: <ph name="TIME" /></translation> +<translation id="7459485586006128091">Точка доступа отключена из-за внутренней ошибки. Попробуйте подключиться через несколько минут.</translation> <translation id="7461924472993315131">Закрепить</translation> <translation id="746232733191930409">Режим записи видео с экрана</translation> <translation id="7466449121337984263">Приложите палец к сканеру.</translation> @@ -1392,6 +1396,7 @@ Чтобы выключить устройство, снова нажмите и удерживайте кнопку питания.</translation> <translation id="7526573455193969409">Сеть может отслеживаться</translation> <translation id="7536035074519304529">IP-адрес: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Обновить окно слева</translation> <translation id="7543399541175347147">Приложения для Linux и окна в режиме инкогнито пока не поддерживаются. Остальные приложения будут сохранены.</translation> <translation id="7544300628205093162">Подсветка клавиатуры включена.</translation> <translation id="7548434653388805669">Пора ложиться спать</translation> @@ -1445,6 +1450,7 @@ <translation id="776344839111254542">Нажмите, чтобы просмотреть информацию об обновлении</translation> <translation id="7768784765476638775">Озвучивание при нажатии</translation> <translation id="7769299611924763557">Файл GIF скоро будет готов</translation> +<translation id="7773536009433685931">Включить Wi-Fi</translation> <translation id="7780094051999721182">ярлыки</translation> <translation id="7780159184141939021">Поворот экрана</translation> <translation id="7796735576426975947">Новые уведомления скрыты</translation> @@ -1472,6 +1478,7 @@ <translation id="7893503627044934815">Скрыть файл</translation> <translation id="7895348134893321514">Быстрый доступ</translation> <translation id="7897375687985782769">Вы нажали сочетание клавиш для поворота экрана. Выполнить это действие?</translation> +<translation id="7901190436359881020">Поменять окна местами</translation> <translation id="7901405293566323524">Управление телефоном</translation> <translation id="7902625623987030061">Коснитесь сканера отпечатков.</translation> <translation id="7904094684485781019">Администратор этого аккаунта запретил множественный вход</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index aa1374c0..41a3db9 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">ඉතිහාස පිටුව විවෘත කරන්න</translation> <translation id="1654477262762802994">හඬ විමසුමක් අරඹන්න</translation> <translation id="1668469839109562275">තිළැලි VPN</translation> +<translation id="1675844249244994876">දකුණු කවුළුව යාවත්කාලීන කරන්න</translation> <translation id="1677472565718498478"><ph name="TIME" /> ඉතිරිය</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> සම්බන්ධ නැත.</translation> <translation id="1677582821739292812">යම් කෙනෙක් ඔබගේ තිරය දෙස බලා සිටී</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">තිරයෙන් විශාලනය අඩු කරන්න</translation> <translation id="4936329710968938986">සියලු දෙනා, ක්රියාවිරහිතයි</translation> <translation id="4938176435186993759">සියලු යෝජනා සඟවන්න</translation> +<translation id="4943007472417128747">WiFi භාවිතය සඳහා හොට්ස්පොට් ක්රියා විරහිත කර ඇත. හොට්ස්පොට් භාවිතය සඳහා, WiFi ක්රියාවිරහිත කරන්න.</translation> <translation id="4945196315133970626">දැනුම්දීම් ක්රියාවිරහිත කරන්න</translation> <translation id="4946376291507881335">ග්රහණය</translation> <translation id="495046168593986294">ඉහළට අනුචලනය කරන්න</translation> @@ -1388,6 +1390,7 @@ උපාංගය වසා දැමීම සඳහා, උපාංගයෙහි බල බොත්තම නැවත ඔබාගෙන සිටින්න.</translation> <translation id="7526573455193969409">ජාලය නිරීක්ෂණය විය හැක</translation> <translation id="7536035074519304529">IP ලිපිනය: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">වම් කවුළුව යාවත්කාලීන කරන්න</translation> <translation id="7543399541175347147">Linux යෙදුම් සහ අප්රසිද්ධ කවුළු දැනට සහාය නොදක්වයි. වෙනත් යෙදුම් සුරකිනු ඇත.</translation> <translation id="7544300628205093162">යතුරුපුවරු පසුආලෝකය ක්රියාත්මකයි</translation> <translation id="7548434653388805669">නිදා ගන්නා වේලාවයි</translation> @@ -1468,6 +1471,7 @@ <translation id="7893503627044934815">මෙම ගොනුව පෙන්වීමට අවශ්ය නැත</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">ඔබ තිරයේ කරකැවීම සඳහා යතුරුපුවරු කෙටිමඟ ඔබා ඇත. ඔබට එය සක්රීය කළ යුතුද?</translation> +<translation id="7901190436359881020">කවුළු මාරු කරන්න</translation> <translation id="7901405293566323524">දුරකථන මධ්යස්ථානය</translation> <translation id="7902625623987030061">ඇඟිලි සලකුණු සංවේදකය ස්පර්ශ කරන්න</translation> <translation id="7904094684485781019">මෙම ගිනුමේ පරිපාලක විසින් බහු පිවිසුම් වලට අවසර දී නොමැත.</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index f545c08..8742300 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Zariadenie USB-C (port vpredu)</translation> <translation id="1013598600051641573">Obrazovka <ph name="DISPLAY_NAME" /> bola zmenená na <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz). Zmeny ponecháte kliknutím na Potvrdiť. Predchádzajúce nastavenia budú obnovené o <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Zariadenie Bluetooth s názvom <ph name="DEVICE_NAME" /> žiada o povolenie párovania. Zadajte na danom zariadení toto číslo PIN: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Týmto povolíte aplikácii <ph name="APP_NAME" /> a všetkým aplikáciám a webom s povoleným prístupom k polohe, ako aj systému ChromeOS používať polohu v sieti Wi‑Fi a mobilných sieťach.</translation> <translation id="1017556409696559990">Minimalizácia horného okna, keď v Chrome nie je žiadna história</translation> <translation id="1024364763893396229">Uložte zariadenie <ph name="NAME" /></translation> <translation id="1032891413405719768">Batéria dotykového pera je takmer vybitá</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Zapnúť prístup k polohe</translation> <translation id="1830308660060964064">Položka <ph name="ITEM_TITLE" /> bola odopnutá</translation> <translation id="1838895407229022812">Nočný režim je vypnutý.</translation> <translation id="1854180393107901205">Zastaviť prenášanie</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Čo dokážeš?</translation> <translation id="3256109297135787951">Odstránenie zvýraznenia položky na poličke</translation> <translation id="3260969790895726815">Reč sa spracúva miestne a diktovanie funguje offline. Niektoré hlasové príkazy však nefungujú.</translation> +<translation id="3265032511221679826">Chcete zapnúť prístup k presnej polohe?</translation> <translation id="3269597722229482060">Kliknúť pravým tlačidlom</translation> <translation id="3289364673986435196">Ponuka vypínača</translation> <translation id="3289544412142055976">Aplikácie pre Linux nie sú momentálne podporované</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733">Spravovaný používateľ <ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">Plávajúce okno skryjete potiahnutím</translation> <translation id="367531336287639526">Výber prvej ikony naľavo od panela s adresou</translation> +<translation id="3677931086890821290">Týmto povolíte všetkým aplikáciám a webom s povoleným prístupom k polohe, ako aj systému ChromeOS používať polohu v sieti Wi‑Fi a mobilných sieťach.</translation> <translation id="3679827876008292680">Prechod na poslednú kartu v okne</translation> <translation id="36813544980941320">Siete Wi‑Fi sa budú zdieľať medzi vaším telefónom a zariadením <ph name="DEVICE_NAME" /></translation> <translation id="3694122362646626770">Webové stránky</translation> @@ -1067,6 +1071,7 @@ <translation id="5976112937189445008">Okno nahráte stlačením klávesa Enter</translation> <translation id="5978382165065462689">Ovládanie obrazovky sa zdieľa prostredníctvom Vzdialenej pomoci.</translation> <translation id="5980301590375426705">Ukončiť rel. hosťa</translation> +<translation id="5983567367406220847">Hotspot bol pre nečinnosť vypnutý.</translation> <translation id="598407983968395253">Použiť šablónu</translation> <translation id="598882571027504733">Ak chcete získať aktualizáciu, Chromebook s pripojenou klávesnicou reštartujte.</translation> <translation id="6002179289567220515">Fyzickým vypínačom ste vypli 1 kameru. Môžete vypnúť prístup aj pre všetky kamery.</translation> @@ -1369,6 +1374,7 @@ <translation id="7452560014878697800">Nejaká aplikácia používa fotoaparát</translation> <translation id="7453330308669753048">Výsledok histórie vyhľadávania bol odstránený</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" /> % | Do úplného nabitia: <ph name="TIME" /></translation> +<translation id="7459485586006128091">Hotspot bol pre internú chybu vypnutý. Skúste sa pripojiť o niekoľko minút.</translation> <translation id="7461924472993315131">Pripnúť</translation> <translation id="746232733191930409">Režim nahrávania obrazovky</translation> <translation id="7466449121337984263">Dotknite sa senzora</translation> @@ -1441,6 +1447,7 @@ <translation id="776344839111254542">Kliknutím zobrazíte podrobnosti o aktualizácii</translation> <translation id="7768784765476638775">Vyslovenie položky po vybratí</translation> <translation id="7769299611924763557">Váš gif bude čoskoro pripravený</translation> +<translation id="7773536009433685931">Zapnúť Wi‐Fi</translation> <translation id="7780094051999721182">skratky</translation> <translation id="7780159184141939021">Otáčanie obrazovky</translation> <translation id="7796735576426975947">Nové upozornenie bolo skryté</translation> @@ -1742,6 +1749,7 @@ <translation id="9198992156681343238">Rozlíšenie obrazovky <ph name="DISPLAY_NAME" /> bolo zmenené na <ph name="RESOLUTION" />. Zmeny ponecháte kliknutím na Potvrdiť. Predchádzajúce nastavenia budú obnovené o <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Pripojiť <ph name="NAME" /> k tomuto Chromebooku</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, ovládané správcom</translation> +<translation id="9207682216934703221">Týmto povolíte aplikáciám <ph name="APP_NAME" />, <ph name="APP2_NAME" /> a všetkým aplikáciám a webom s povoleným prístupom k polohe, ako aj systému ChromeOS používať polohu v sieti Wi‑Fi a mobilných sieťach.</translation> <translation id="9210037371811586452">Ukončuje sa režim jednotnej pracovnej plochy</translation> <translation id="9211490828691860325">Všetky plochy</translation> <translation id="9211681782751733685">Zostávajúci čas do úplného nabitia batérie: <ph name="TIME_REMAINING" /></translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 6134e84..89b473f 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Odpiranje strani z zgodovino</translation> <translation id="1654477262762802994">Začetek glasovne poizvedbe</translation> <translation id="1668469839109562275">Vgrajeno omrežje VPN</translation> +<translation id="1675844249244994876">Posodobitev desnega okna</translation> <translation id="1677472565718498478">Še <ph name="TIME" /></translation> <translation id="1677507110654891115">Povezava s funkcijo <ph name="FEATURE_NAME" /> ni vzpostavljena.</translation> <translation id="1677582821739292812">Nekdo gleda na vaš zaslon</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">Pomanjšava zaslona</translation> <translation id="4936329710968938986">Vsi, izklopljeno</translation> <translation id="4938176435186993759">Skrij vse predloge</translation> +<translation id="4943007472417128747">Dostopna točka je izklopljena zaradi uporabe Wi-Fi-ja. Če želite uporabljati dostopno točko, izklopite Wi-Fi.</translation> <translation id="4945196315133970626">Izklop obvestil</translation> <translation id="4946376291507881335">Zajemi</translation> <translation id="495046168593986294">Pomik navzgor</translation> @@ -1388,6 +1390,7 @@ Če želite napravo izklopiti, znova pridržite gumb za vklop v napravi.</translation> <translation id="7526573455193969409">Omrežje je morda nadzorovano</translation> <translation id="7536035074519304529">Naslov IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Posodobitev levega okna</translation> <translation id="7543399541175347147">Aplikacije za Linux in anonimna okna trenutno niso podprta. Druge aplikacije bodo shranjene.</translation> <translation id="7544300628205093162">Osvetlitev tipkovnice je vklopljena</translation> <translation id="7548434653388805669">Čas je za spanje</translation> @@ -1468,6 +1471,7 @@ <translation id="7893503627044934815">Ne želim, da se prikazuje ta datoteka</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Pritisnili ste bližnjično tipko za sukanje zaslona. Ali želite zasukati zaslon?</translation> +<translation id="7901190436359881020">Zamenjava oken</translation> <translation id="7901405293566323524">Središče za telefone</translation> <translation id="7902625623987030061">Dotaknite se tipala prstnih odtisov.</translation> <translation id="7904094684485781019">Skrbnik tega računa je onemogočil prijavo z več računi.</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 950195af..d34e19c 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Otvori stranicu Istorija</translation> <translation id="1654477262762802994">Započnite glasovnu pretragu</translation> <translation id="1668469839109562275">Ugrađeni VPN</translation> +<translation id="1675844249244994876">Ažuriraj desni prozor</translation> <translation id="1677472565718498478"><ph name="TIME" /> je preostalo</translation> <translation id="1677507110654891115">Funkcija <ph name="FEATURE_NAME" /> nije povezana.</translation> <translation id="1677582821739292812">Neko gleda vaš ekran</translation> @@ -849,6 +850,7 @@ <translation id="493076006037866439">Umanji prikaz na ekranu</translation> <translation id="4936329710968938986">Svi, isključeno</translation> <translation id="4938176435186993759">Sakrij sve predloge</translation> +<translation id="4943007472417128747">Hotspot je isključen da biste koristili WiFi. Da biste koristili hotspot, isključite WiFi.</translation> <translation id="4945196315133970626">Isključi obaveštenja</translation> <translation id="4946376291507881335">Snimi</translation> <translation id="495046168593986294">Pomeri nagore</translation> @@ -1072,6 +1074,7 @@ <translation id="5976112937189445008">Pritisnite Enter da biste snimili prozor</translation> <translation id="5978382165065462689">Delite kontrolu nad ekranom preko Daljinske pomoći.</translation> <translation id="5980301590375426705">Zatvori kao gost</translation> +<translation id="5983567367406220847">Hotspot je isključen zbog neaktivnosti.</translation> <translation id="598407983968395253">Koristi šablon</translation> <translation id="598882571027504733">Da biste preuzeli ažuriranje, restartujte Chromebook sa priključenom tastasturom.</translation> <translation id="6002179289567220515">Koristili ste fizički prekidač da biste isključili 1 kameru. Možete i da isključite pristup za sve kamere.</translation> @@ -1374,6 +1377,7 @@ <translation id="7452560014878697800">Aplikacija koristi kameru</translation> <translation id="7453330308669753048">Rezultat istorije pretrage je uklonjen</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> do kraja punjenja</translation> +<translation id="7459485586006128091">Hotspot je isključen zbog interne greške. Probajte ponovo da se povežete za par minuta.</translation> <translation id="7461924472993315131">Zakači</translation> <translation id="746232733191930409">Režim snimanja ekrana</translation> <translation id="7466449121337984263">Dodirnite senzor</translation> @@ -1393,6 +1397,7 @@ Da biste isključili uređaj, ponovo pritisnite i zadržite dugme za uključivanje na uređaju.</translation> <translation id="7526573455193969409">Mreža se možda nadgleda</translation> <translation id="7536035074519304529">IP adresa: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Ažuriraj levi prozor</translation> <translation id="7543399541175347147">Linux aplikacije i prozori bez arhiviranja trenutno nisu podržani. Druge aplikacije će biti sačuvane.</translation> <translation id="7544300628205093162">Pozadinsko osvetljenje tastature je uključeno</translation> <translation id="7548434653388805669">Vreme je za spavanje</translation> @@ -1446,6 +1451,7 @@ <translation id="776344839111254542">Kliknite za prikaz detalja ažuriranja</translation> <translation id="7768784765476638775">Izaberite za govor</translation> <translation id="7769299611924763557">GIF će uskoro biti spreman</translation> +<translation id="7773536009433685931">Uključi WiFi</translation> <translation id="7780094051999721182">prečice</translation> <translation id="7780159184141939021">Rotirajte ekran</translation> <translation id="7796735576426975947">Novo obaveštenje je skriveno</translation> @@ -1473,6 +1479,7 @@ <translation id="7893503627044934815">Ne želim da mi se prikazuje ovaj fajl</translation> <translation id="7895348134893321514">Držač</translation> <translation id="7897375687985782769">Pritisnuli ste tastersku prečicu za rotaciju ekrana. Želite li da rotirate ekran?</translation> +<translation id="7901190436359881020">Zameni prozor</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Dodirnite senzor za otisak prsta</translation> <translation id="7904094684485781019">Administrator za ovaj nalog je zabranio višestruko prijavljivanje.</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index 96c0f39..58b217b 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -148,6 +148,7 @@ <translation id="1651914502370159744">Отвори страницу Историја</translation> <translation id="1654477262762802994">Започните гласовну претрагу</translation> <translation id="1668469839109562275">Уграђени VPN</translation> +<translation id="1675844249244994876">Ажурирај десни прозор</translation> <translation id="1677472565718498478"><ph name="TIME" /> је преостало</translation> <translation id="1677507110654891115">Функција <ph name="FEATURE_NAME" /> није повезана.</translation> <translation id="1677582821739292812">Неко гледа ваш екран</translation> @@ -849,6 +850,7 @@ <translation id="493076006037866439">Умањи приказ на екрану</translation> <translation id="4936329710968938986">Сви, искључено</translation> <translation id="4938176435186993759">Сакриј све предлоге</translation> +<translation id="4943007472417128747">Хотспот је искључен да бисте користили WiFi. Да бисте користили хотспот, искључите WiFi.</translation> <translation id="4945196315133970626">Искључи обавештења</translation> <translation id="4946376291507881335">Сними</translation> <translation id="495046168593986294">Помери нагоре</translation> @@ -1072,6 +1074,7 @@ <translation id="5976112937189445008">Притисните Enter да бисте снимили прозор</translation> <translation id="5978382165065462689">Делите контролу над екраном преко Даљинске помоћи.</translation> <translation id="5980301590375426705">Затвори као гост</translation> +<translation id="5983567367406220847">Hотспот је искључен због неактивности.</translation> <translation id="598407983968395253">Користи шаблон</translation> <translation id="598882571027504733">Да бисте преузели ажурирање, рестартујте Chromebook са прикљученом тастастуром.</translation> <translation id="6002179289567220515">Користили сте физички прекидач да бисте искључили 1 камеру. Можете и да искључите приступ за све камере.</translation> @@ -1374,6 +1377,7 @@ <translation id="7452560014878697800">Апликација користи камеру</translation> <translation id="7453330308669753048">Резултат историје претраге је уклоњен</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> до краја пуњења</translation> +<translation id="7459485586006128091">Хотспот је искључен због интерне грешке. Пробајте поново да се повежете за пар минута.</translation> <translation id="7461924472993315131">Закачи</translation> <translation id="746232733191930409">Режим снимања екрана</translation> <translation id="7466449121337984263">Додирните сензор</translation> @@ -1393,6 +1397,7 @@ Да бисте искључили уређај, поново притисните и задржите дугме за укључивање на уређају.</translation> <translation id="7526573455193969409">Мрежа се можда надгледа</translation> <translation id="7536035074519304529">IP адреса: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Ажурирај леви прозор</translation> <translation id="7543399541175347147">Linux апликације и прозори без архивирања тренутно нису подржани. Друге апликације ће бити сачуване.</translation> <translation id="7544300628205093162">Позадинско осветљење тастатуре је укључено</translation> <translation id="7548434653388805669">Време је за спавање</translation> @@ -1446,6 +1451,7 @@ <translation id="776344839111254542">Кликните за приказ детаља ажурирања</translation> <translation id="7768784765476638775">Изаберите за говор</translation> <translation id="7769299611924763557">GIF ће ускоро бити спреман</translation> +<translation id="7773536009433685931">Укључи WiFi</translation> <translation id="7780094051999721182">пречице</translation> <translation id="7780159184141939021">Ротирајте екран</translation> <translation id="7796735576426975947">Ново обавештење је скривено</translation> @@ -1473,6 +1479,7 @@ <translation id="7893503627044934815">Не желим да ми се приказује овај фајл</translation> <translation id="7895348134893321514">Држач</translation> <translation id="7897375687985782769">Притиснули сте тастерску пречицу за ротацију екрана. Желите ли да ротирате екран?</translation> +<translation id="7901190436359881020">Замени прозор</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Додирните сензор за отисак прста</translation> <translation id="7904094684485781019">Администратор за овај налог је забранио вишеструко пријављивање.</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index d458da0..f09c0e5 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -147,6 +147,7 @@ <translation id="1651914502370159744">Fungua ukurasa wa Historia</translation> <translation id="1654477262762802994">Anza kutamka hoja ya utafutaji</translation> <translation id="1668469839109562275">VPN iliyojumuishwa ndani</translation> +<translation id="1675844249244994876">Sasisha dirisha la kulia</translation> <translation id="1677472565718498478">Zimesalia <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> haijaunganishwa.</translation> <translation id="1677582821739292812">Kuna mtu anaangalia skrini yako</translation> @@ -844,6 +845,7 @@ <translation id="493076006037866439">Sogeza mbali skrini</translation> <translation id="4936329710968938986">Kila mtu, kimezimwa</translation> <translation id="4938176435186993759">Ficha mapendekezo yote</translation> +<translation id="4943007472417128747">Mtandao pepe umezimwa ili utumie Wi-Fi. Ili utumie Mtandao pepe, zima Wi-Fi.</translation> <translation id="4945196315133970626">Zima arifa</translation> <translation id="4946376291507881335">Nasa</translation> <translation id="495046168593986294">Sogeza juu</translation> @@ -1388,6 +1390,7 @@ Ili uzime kifaa, bonyeza na ushikilie kitufe cha kuwasha/kuzima kwenye kifaa tena.</translation> <translation id="7526573455193969409">Huenda mtandao unafuatiliwa</translation> <translation id="7536035074519304529">Anwani ya IP: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Sasisha dirisha la kushoto</translation> <translation id="7543399541175347147">Programu za Linux pamoja na madirisha fiche hayawezi kutumika kwa sasa. Programu nyingine zitahifadhiwa.</translation> <translation id="7544300628205093162">Mwangaza wa kibodi umewashwa</translation> <translation id="7548434653388805669">Ni wakati wa kulala</translation> @@ -1469,6 +1472,7 @@ <translation id="7893503627044934815">Sitaki faili hii ionyeshwe</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Umebofya mikato ya kibodi ya kuzungusha skrini. Ungependa kuzungusha skrini?</translation> +<translation id="7901190436359881020">Badilisha madirisha</translation> <translation id="7901405293566323524">Kitovu cha Simu</translation> <translation id="7902625623987030061">Gusa kitambua alama ya kidole</translation> <translation id="7904094684485781019">Msimamizi wa akaunti hii ameondoa uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index c185ca5a..2935a02 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C சாதனம் (முன்பக்கப் போர்ட்)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> இன் தெளிவுத்திறன் <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) என்பதற்கு மாற்றப்பட்டது. மாற்றங்களை உறுதிசெய்ய 'உறுதிசெய்' என்பதைக் கிளிக் செய்யவும். இன்னும் <ph name="TIMEOUT_SECONDS" /> இல் முந்தைய அமைப்புகள் மீட்டெடுக்கப்படும்.</translation> <translation id="1013923882670373915">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />", இணைப்பதற்கான அனுமதியை விரும்புகிறது. அந்தச் சாதனத்தில் இந்த PIN குறியீட்டை உள்ளிடவும்: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285"><ph name="APP_NAME" />, ChromeOS மற்றும் இருப்பிட அனுமதி வழங்கப்பட்டுள்ள அனைத்து ஆப்ஸும் இணையதளங்களும் வைஃபை, மொபைல் நெட்வொர்க் ஆகியவற்றின் இருப்பிடத்தைப் பயன்படுத்த இது அனுமதிக்கும்.</translation> <translation id="1017556409696559990">Chromeமில் முந்தைய பதிவு இல்லையெனில் மேற்புறச் சாளரத்தைச் சிறிதாக்கு</translation> <translation id="1024364763893396229">உங்கள் <ph name="NAME" /> சாதனத்தைச் சேமித்திடுங்கள்</translation> <translation id="1032891413405719768">ஸ்டைலஸ் பேட்டரி குறைவாக உள்ளது</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">பதிவுப் பக்கத்தைத் திற</translation> <translation id="1654477262762802994">குரல் வினவலைத் தொடங்கு</translation> <translation id="1668469839109562275">உள்ளமைந்த VPN</translation> +<translation id="1675844249244994876">வலதுபுறச் சாளரத்தை ரெஃப்ரெஷ் செய்யும்</translation> <translation id="1677472565718498478"><ph name="TIME" /> மணி நேரம்</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> இணைக்கப்படவில்லை.</translation> <translation id="1677582821739292812">வேறொருவர் உங்கள் திரையைப் பார்த்துக்கொண்டிருக்கிறார்</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ஈதர்நெட்: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">இருப்பிட அணுகலை இயக்கு</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> ஷெல்ஃபிலிருந்து அகற்றப்பட்டது</translation> <translation id="1838895407229022812">நைட் லைட் ஆஃப் செய்யப்பட்டுள்ளது.</translation> <translation id="1854180393107901205">அனுப்புவதை நிறுத்து</translation> @@ -235,7 +238,7 @@ <translation id="2023558322300866873">எப்போது வேண்டுமானாலும் பேக்கெட் கேப்ச்சரை நிறுத்தலாம்</translation> <translation id="2034971124472263449">பரவாயில்லை, சேமி</translation> <translation id="2049240716062114887">டெஸ்க் பெயர் <ph name="DESK_NAME" /> என மாற்றப்பட்டது</translation> -<translation id="2050339315714019657">செங்குத்து நிலை</translation> +<translation id="2050339315714019657">போர்ட்ரெய்ட்</translation> <translation id="2064048859448024834">கேமரா மாதிரிக்காட்சி இயக்கத்தில் உள்ளது</translation> <translation id="2067602449040652523">கீபோர்டு ஒளிர்வு</translation> <translation id="2078034614700056995">அடுத்த டெஸ்க்கிற்கு மாற நான்கு விரல்களால் வலதுபுறமாக ஸ்வைப் செய்யவும்</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">உன்னால் என்னவெல்லாம் செய்ய முடியும்?</translation> <translation id="3256109297135787951">உங்கள் ஷெல்ஃபில் உருப்படியைத் தனிப்படுத்தியதை அகற்றும்</translation> <translation id="3260969790895726815">பேச்சு சாதனத்திற்குள்ளேயே செயலாக்கப்படும் மற்றும் சொல்வதை எழுதும் வசதி ஆஃப்லைனில் செயல்படும். ஆனால் சில குரல் கட்டளைகள் செயல்படாது.</translation> +<translation id="3265032511221679826">துல்லியமான இருப்பிட அணுகலை இயக்கவா?</translation> <translation id="3269597722229482060">வலது கிளிக்</translation> <translation id="3289364673986435196">பவர் மெனு</translation> <translation id="3289544412142055976">Linux ஆப்ஸைத் தற்போது பயன்படுத்த முடியாது</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> நிர்வகிக்கப்பட்ட பயனர்</translation> <translation id="3666266999138159418">மிதக்கும் சாளரத்தை மறைக்க ஸ்வைப் செய்யவும்</translation> <translation id="367531336287639526">முகவரிப் பட்டியின் இடப்புறத்தில் உள்ள முதல் ஐகானைத் தேர்ந்தெடு</translation> +<translation id="3677931086890821290">ChromeOS மற்றும் இருப்பிட அனுமதி வழங்கப்பட்டுள்ள அனைத்து ஆப்ஸும் இணையதளங்களும் வைஃபை, மொபைல் நெட்வொர்க் ஆகியவற்றின் இருப்பிடத்தைப் பயன்படுத்த இது அனுமதிக்கும்.</translation> <translation id="3679827876008292680">சாளரத்தில் உள்ள கடைசிப் பக்கத்திற்குச் செல்</translation> <translation id="36813544980941320">உங்கள் மொபைல், <ph name="DEVICE_NAME" /> சாதனம் ஆகியவற்றுக்கு இடையே வைஃபை நெட்வொர்க்குகள் பகிரப்படும்</translation> <translation id="3694122362646626770">இணையதளங்கள்</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">திரையைச் சிறிதாக்கு</translation> <translation id="4936329710968938986">அனைவருக்கும், முடக்கத்தில்</translation> <translation id="4938176435186993759">எல்லாப் பரிந்துரைகளையும் மறை</translation> +<translation id="4943007472417128747">வைஃபையைப் பயன்படுத்தும் வகையில் ஹாட்ஸ்பாட் முடக்கப்பட்டுள்ளது. ஹாட்ஸ்பாட்டைப் பயன்படுத்த வைஃபையை முடக்கவும்.</translation> <translation id="4945196315133970626">அறிவிப்புகளை முடக்கு</translation> <translation id="4946376291507881335">படமெடு</translation> <translation id="495046168593986294">மேலே நகர்த்து</translation> @@ -1388,6 +1394,7 @@ சாதனத்தை ஷட் டவுன் செய்ய சாதனத்தின் பவர் பட்டனை மீண்டும் அழுத்திப் பிடித்திருக்கவும்.</translation> <translation id="7526573455193969409">நெட்வொர்க் கண்காணிக்கப்படலாம்</translation> <translation id="7536035074519304529">IP முகவரி: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">இடதுபுறச் சாளரத்தை ரெஃப்ரெஷ் செய்யும்</translation> <translation id="7543399541175347147">Linux ஆப்ஸ், மறைநிலைச் சாளரங்களைத் தற்போது பயன்படுத்த முடியாது. பிற ஆப்ஸ் சேமிக்கப்படும்.</translation> <translation id="7544300628205093162">கீபோர்டின் பேக்லைட் ஆன் செய்யப்பட்டது</translation> <translation id="7548434653388805669">தூங்கும் நேரம்</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">இந்த ஃபைலைக் காட்டாதே</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">திரைச் சுழற்சிக்கான கீபோர்டு ஷார்ட்கட்டை அழுத்தியுள்ளீர்கள். திரையைச் சுழற்ற விரும்புகிறீர்களா?</translation> +<translation id="7901190436359881020">சாளரங்களை மாற்றும்</translation> <translation id="7901405293566323524">மொபைல் ஹப்</translation> <translation id="7902625623987030061">கைரேகை சென்சாரைத் தொடுக</translation> <translation id="7904094684485781019">இந்தக் கணக்கிற்கான நிர்வாகி பல உள்நுழைவுகளை அனுமதிக்கவில்லை.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> இன் தெளிவுத்திறன் <ph name="RESOLUTION" />க்கு மாறியது. மாற்றங்களை உறுதிசெய்ய 'உறுதிப்படுத்து' என்பதைக் கிளிக் செய்யவும். இன்னும் <ph name="TIMEOUT_SECONDS" /> இல் முந்தைய அமைப்புகளுக்கு மீட்டமைக்கப்படும்.</translation> <translation id="9201044636667689546"><ph name="NAME" /> ஐ இந்த Chromebookகுடன் இணைத்திடுங்கள்</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, உங்கள் நிர்வாகி நிர்வகிக்கிறார்</translation> +<translation id="9207682216934703221"><ph name="APP_NAME" />, <ph name="APP2_NAME" />, ChromeOS மற்றும் இருப்பிட அனுமதி வழங்கப்பட்டுள்ள அனைத்து ஆப்ஸும் இணையதளங்களும் வைஃபை, மொபைல் நெட்வொர்க் ஆகியவற்றின் இருப்பிடத்தைப் பயன்படுத்த இது அனுமதிக்கும்.</translation> <translation id="9210037371811586452">ஒன்றிணைந்த டெஸ்க்டாப் பயன்முறையிலிருந்து வெளியேறுகிறது</translation> <translation id="9211490828691860325">அனைத்து டெஸ்குகளும்</translation> <translation id="9211681782751733685">பேட்டரி முழுவதும் சார்ஜ் ஆவதற்கான நேரம்: <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 3671a9c..ce697284 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C పరికరం (ముందువైపు పోర్ట్)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz)కు మార్చబడింది. మార్పులను అలాగే ఉంచడానికి 'నిర్ధారించు'ను క్లిక్ చేయండి. మునుపటి సెట్టింగ్లు <ph name="TIMEOUT_SECONDS" />లో రీస్టోర్ చేయబడతాయి.</translation> <translation id="1013923882670373915">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత కావడానికి అనుమతి కోరుతోంది. దయచేసి ఆ పరికరంలో ఈ PIN కోడ్ను నమోదు చేయండి: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Wi-Fi, మొబైల్ నెట్వర్క్ల లొకేషన్ను ఉపయోగించడానికి ఇది <ph name="APP_NAME" />, అన్ని యాప్లు, వెబ్సైట్లను లొకేషన్ అనుమతి, ChromeOSతో అనుమతిస్తుంది.</translation> <translation id="1017556409696559990">Chromeలో బ్యాక్ హిస్టరీ లేనప్పుడు టాప్ విండోను కుదించండి</translation> <translation id="1024364763893396229">మీ <ph name="NAME" />ను సేవ్ చేయండి</translation> <translation id="1032891413405719768">స్టైలస్ బ్యాటరీ తక్కువగా ఉంది</translation> @@ -192,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ఈథర్నెట్: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">లొకేషన్ యాక్సెస్ను ఆన్ చేయండి</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> పిన్ తీసివేయబడింది</translation> <translation id="1838895407229022812">రాత్రి కాంతి ఆఫ్లో ఉంది.</translation> <translation id="1854180393107901205">ప్రసారాన్ని ఆపివేయి</translation> @@ -469,6 +471,7 @@ <translation id="3255483164551725916">నువ్వు ఏమి చేయగలవు?</translation> <translation id="3256109297135787951">మీ అరలోని ఒక అంశానికి ఉన్న హైలైట్ను తీసివేయండి</translation> <translation id="3260969790895726815">స్పీచ్ లోకల్గా ప్రాసెస్ చేయబడుతుంది, డిక్టేషన్ ఆఫ్లైన్లో పని చేస్తుంది, కానీ కొన్ని వాయిస్ కమాండ్లు పని చేయవు.</translation> +<translation id="3265032511221679826">ఖచ్చితమైన లొకేషన్ యాక్సెస్ను ఆన్ చేయాలా?</translation> <translation id="3269597722229482060">కుడి క్లిక్</translation> <translation id="3289364673986435196">పవర్ మెనూ</translation> <translation id="3289544412142055976">ప్రస్తుతం Linux యాప్లు సపోర్ట్ చేయవు</translation> @@ -579,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> మేనేజ్ చేయబడిన యూజర్</translation> <translation id="3666266999138159418">మీ ఫ్లోటింగ్ విండోను దాచడానికి స్వైప్ చేయండి</translation> <translation id="367531336287639526">అడ్రస్ బార్కు ఎడమ వైపున ఉన్న మొదటి చిహ్నాన్ని ఎంచుకోండి</translation> +<translation id="3677931086890821290">Wi-Fi, మొబైల్ నెట్వర్క్ల లొకేషన్ను ఉపయోగించడానికి ఇది అన్ని యాప్లు, వెబ్సైట్లను లొకేషన్ అనుమతి, ChromeOSతో అనుమతిస్తుంది.</translation> <translation id="3679827876008292680">విండోలో ఉన్న చివరి ట్యాబ్కు వెళ్లండి</translation> <translation id="36813544980941320">Wi-Fi నెట్వర్క్లు మీ ఫోన్, <ph name="DEVICE_NAME" /> మధ్య షేర్ చేయబడతాయి</translation> <translation id="3694122362646626770">వెబ్సైట్లు</translation> @@ -1748,6 +1752,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> రిజల్యూషన్ <ph name="RESOLUTION" />కు మార్చబడింది. మార్పులను అలాగే ఉంచడానికి 'ధృవీకరించు'ను క్లిక్ చేయండి. మునుపటి సెట్టింగ్లు <ph name="TIMEOUT_SECONDS" />లో రీస్టోర్ చేయబడతాయి.</translation> <translation id="9201044636667689546"><ph name="NAME" />ను ఈ Chromebookకు కనెక్ట్ చేయండి</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, మీ అడ్మినిస్ట్రేటర్ ద్వారా నిర్వహించబడుతోంది</translation> +<translation id="9207682216934703221">Wi-Fi, మొబైల్ నెట్వర్క్ల లొకేషన్ను ఉపయోగించడానికి ఇది <ph name="APP_NAME" />, <ph name="APP2_NAME" /> అన్ని యాప్లు, వెబ్సైట్లను లొకేషన్ అనుమతి, ChromeOSతో అనుమతిస్తుంది.</translation> <translation id="9210037371811586452">ఏకీకృత డెస్క్టాప్ మోడ్ నుండి ఎగ్జిట్ అవుతోంది</translation> <translation id="9211490828691860325">అన్ని డెస్క్లు</translation> <translation id="9211681782751733685">బ్యాటరీ పూర్తిగా ఛార్జ్ కావడానికి పట్టే సమయం, <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index fbac6873..0416c1a 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C cihaz (ön bağlantı noktası)</translation> <translation id="1013598600051641573">Çözünürlük <ph name="DISPLAY_NAME" /> için <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz) olarak değiştirildi. Değişiklikleri korumak için Onayla'yı tıklayın. Önceki ayarlar <ph name="TIMEOUT_SECONDS" /> saniye içinde geri yüklenecek.</translation> <translation id="1013923882670373915">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşleme izni istiyor. Lütfen söz konusu cihazda şu PIN kodunu girin: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Bu işlem, <ph name="APP_NAME" /> uygulaması, konum iznine sahip tüm uygulama ve web siteleri, ayrıca ChromeOS'in kablosuz ve mobil ağların konumunu kullanmasına izin verir.</translation> <translation id="1017556409696559990">Chrome'da geri geçmişi olmadığında üst pencereyi küçült</translation> <translation id="1024364763893396229"><ph name="NAME" /> cihazınızı kaydedin</translation> <translation id="1032891413405719768">Ekran kaleminin pili düşük</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">Geçmiş sayfasını aç</translation> <translation id="1654477262762802994">Sesli sorgu başlat</translation> <translation id="1668469839109562275">Yerleşik VPN</translation> +<translation id="1675844249244994876">Sağdaki pencereyi güncelleyin</translation> <translation id="1677472565718498478">Kalan süre: <ph name="TIME" /></translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> bağlı değil.</translation> <translation id="1677582821739292812">Ekranınıza bakan biri var</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Konum erişimini aç</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> sabitlemesi kaldırıldı</translation> <translation id="1838895407229022812">Gece Işığı kapalı.</translation> <translation id="1854180393107901205">Yayını durdur</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">Neler yapabilirsin?</translation> <translation id="3256109297135787951">Rafınızdaki bir öğenin vurgusunu kaldırır</translation> <translation id="3260969790895726815">Konuşma yerel olarak işlenir ve dikte özelliği çevrimdışı çalışır ancak bazı sesli komutlar kullanılamaz.</translation> +<translation id="3265032511221679826">Tam konum erişimi açılsın mı?</translation> <translation id="3269597722229482060">Sağ Tıkla</translation> <translation id="3289364673986435196">Güç menüsü</translation> <translation id="3289544412142055976">Linux uygulamaları şu anda desteklenmiyor</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> Yönetilen kullanıcı</translation> <translation id="3666266999138159418">Kayan pencerenizi gizlemek için kaydırın</translation> <translation id="367531336287639526">Adres çubuğunun solundaki ilk simgeyi seçin</translation> +<translation id="3677931086890821290">Bu işlem, konum iznine sahip tüm uygulama ve web siteleri, ayrıca ChromeOS'in kablosuz ve mobil ağların konumunu kullanmasına izin verir.</translation> <translation id="3679827876008292680">Penceredeki son sekmeye git</translation> <translation id="36813544980941320">Kablosuz ağlar; telefonunuz ve <ph name="DEVICE_NAME" /> arasında paylaşılacak</translation> <translation id="3694122362646626770">Web siteleri</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">Ekranı uzaklaştırın</translation> <translation id="4936329710968938986">Herkes, kapalı</translation> <translation id="4938176435186993759">Tüm önerileri gizle</translation> +<translation id="4943007472417128747">Kablosuz bağlantının kullanılması için hotspot kapatıldı. Hotspot'u kullanmak için kablosuz bağlantıyı kapatın.</translation> <translation id="4945196315133970626">Bildirimleri devre dışı bırak</translation> <translation id="4946376291507881335">Fotoğraf Çek</translation> <translation id="495046168593986294">Yukarı kaydır</translation> @@ -1388,6 +1394,7 @@ Cihazı kapatmak için cihazın güç düğmesini tekrar basılı tutun.</translation> <translation id="7526573455193969409">Ağ trafiği izleniyor olabilir</translation> <translation id="7536035074519304529">IP adresi: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">Soldaki pencereyi güncelleyin</translation> <translation id="7543399541175347147">Linux uygulamaları ve gizli pencereler şu anda desteklenmiyor. Diğer uygulamalar kaydedilecek.</translation> <translation id="7544300628205093162">Klavye arka ışığı açık</translation> <translation id="7548434653388805669">Uyku vakti geldi</translation> @@ -1468,6 +1475,7 @@ <translation id="7893503627044934815">Bu dosyanın gösterilmesini istemiyorum</translation> <translation id="7895348134893321514">Tote</translation> <translation id="7897375687985782769">Ekran döndürme klavye kısayoluna bastınız. Ekranı döndürmek istiyor musunuz?</translation> +<translation id="7901190436359881020">Pencereleri değiştirin</translation> <translation id="7901405293566323524">Phone Hub</translation> <translation id="7902625623987030061">Parmak izi sensörüne dokunun</translation> <translation id="7904094684485781019">Bu hesabın yöneticisi, çoklu oturum açmayı engelledi.</translation> @@ -1743,6 +1751,7 @@ <translation id="9198992156681343238">Çözünürlük <ph name="DISPLAY_NAME" /> için <ph name="RESOLUTION" /> olarak değiştirildi. Değişiklikleri korumak için Onayla'yı tıklayın. Önceki ayarlar <ph name="TIMEOUT_SECONDS" /> saniye içinde geri yüklenecek.</translation> <translation id="9201044636667689546"><ph name="NAME" /> cihazını bu Chromebook'a bağlayın</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />, Yöneticiniz tarafından yönetiliyor</translation> +<translation id="9207682216934703221">Bu işlem, <ph name="APP_NAME" /> ile <ph name="APP2_NAME" /> uygulaması, konum iznine sahip tüm uygulama ve web siteleri, ayrıca ChromeOS'in kablosuz ve mobil ağların konumunu kullanmasına izin verir.</translation> <translation id="9210037371811586452">Birleşik masaüstü modundan çıkılıyor</translation> <translation id="9211490828691860325">Tüm masalar</translation> <translation id="9211681782751733685">Pilin tam olarak şarj olmasına <ph name="TIME_REMAINING" /> kaldı.</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 7dcddc0..131a50c 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">Пристрій із портом USB типу C (на передній панелі)</translation> <translation id="1013598600051641573">Роздільну здатність дисплея "<ph name="DISPLAY_NAME" />" змінено на <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Гц). Щоб зберегти зміни, натисніть "Підтвердити". Попередні налаштування відновляться через <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="1013923882670373915">Пристрою Bluetooth "<ph name="DEVICE_NAME" />" потрібен дозвіл на підключення. Введіть на пристрої цей PIN-код: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">Додаток <ph name="APP_NAME" />, а також усі додатки й веб-сайти, які мають дозвіл на доступ до геоданих, і ChromeOS зможуть використовувати Wi-Fi і мобільні мережі для геолокації.</translation> <translation id="1017556409696559990">Згортати верхнє вікно, коли в Chrome немає історії для переходів назад</translation> <translation id="1024364763893396229">Збережіть пристрій "<ph name="NAME" />"</translation> <translation id="1032891413405719768">Низький заряд акумулятора стилуса</translation> @@ -191,6 +192,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">Увімкнути доступ до геоданих</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" />: відкріплено</translation> <translation id="1838895407229022812">Нічний екран вимкнено.</translation> <translation id="1854180393107901205">Зупинити трансляцію</translation> @@ -468,6 +470,7 @@ <translation id="3255483164551725916">Що ти можеш?</translation> <translation id="3256109297135787951">Скасувати виділення елемента на полиці</translation> <translation id="3260969790895726815">Ви можете використовувати функцію диктування в режимі офлайн, оскільки мовлення обробляється локально. Однак при цьому деякі голосові команди не працюватимуть.</translation> +<translation id="3265032511221679826">Увімкнути доступ до точного місцезнаходження?</translation> <translation id="3269597722229482060">Натиснути правою кнопкою миші</translation> <translation id="3289364673986435196">Меню кнопки живлення</translation> <translation id="3289544412142055976">Додатки Linux наразі не підтримуються</translation> @@ -578,6 +581,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> – керований користувач</translation> <translation id="3666266999138159418">Проведіть пальцем, щоб сховати плаваюче вікно</translation> <translation id="367531336287639526">Вибрати значок ліворуч від адресного рядка</translation> +<translation id="3677931086890821290">Усі додатки й веб-сайти, які мають дозвіл на доступ до геоданих, і ChromeOS зможуть використовувати Wi-Fi і мобільні мережі для геолокації.</translation> <translation id="3679827876008292680">Перейти на останню вкладку у вікні</translation> <translation id="36813544980941320">Ваш телефон і пристрій <ph name="DEVICE_NAME" /> підключатимуться до однакових мереж Wi-Fi</translation> <translation id="3694122362646626770">Веб-сайти</translation> @@ -1743,6 +1747,7 @@ <translation id="9198992156681343238">Роздільну здатність екрана <ph name="DISPLAY_NAME" /> змінено на <ph name="RESOLUTION" />. Щоб зберегти зміни, натисніть "Підтвердити". Попередні налаштування відновляться через <ph name="TIMEOUT_SECONDS" />.</translation> <translation id="9201044636667689546">Підключити пристрій <ph name="NAME" /> до цього комп’ютера Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />. Мережею керує адміністратор</translation> +<translation id="9207682216934703221">Додатки <ph name="APP_NAME" /> і <ph name="APP2_NAME" />, а також усі додатки й веб-сайти, які мають дозвіл на доступ до геоданих, і ChromeOS зможуть використовувати Wi-Fi і мобільні мережі для геолокації.</translation> <translation id="9210037371811586452">Вихід з уніфікованого режиму робочого стола</translation> <translation id="9211490828691860325">Усі робочі столи</translation> <translation id="9211681782751733685">До повного зарядження акумулятора залишилося <ph name="TIME_REMAINING" />.</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 8b33c79b6..5387438f8 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -4,6 +4,7 @@ <translation id="1012876632442809908">USB-C آلہ (سانے کا پورٹ)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> کو <ph name="RESOLUTION" /> (Hz<ph name="REFRESH_RATE" />) پر تبدیل کر دیا گیا ہے۔ تبدیلیاں باقی رکھنے کے لیے تصدیق کریں پر کلک کریں۔ گزشتہ ترتیبات کو <ph name="TIMEOUT_SECONDS" /> میں بحال کر دیا جائے گا۔</translation> <translation id="1013923882670373915">بلوٹوتھ آلہ "<ph name="DEVICE_NAME" />" جوڑا بنانے کی اجازت چاہتا ہے۔ براہ کرم اس PIN کوڈ کو اس آلہ پر درج کریں: <ph name="PINCODE" /></translation> +<translation id="1014722676793506285">اس سے <ph name="APP_NAME" /> اور سبھی ایپس اور ویب سائٹس کو مقام کی اجازت اور ChromeOS کے ساتھ Wi-Fi اور موبائل نیٹ ورکس کا مقام استعمال کرنے کی اجازت ملتی ہے۔</translation> <translation id="1017556409696559990">Chrome میں کوئی گزشتہ سرگزشت موجود نہ ہونے پر سرفہرست ونڈو کو چھوٹا کریں</translation> <translation id="1024364763893396229">اپنا <ph name="NAME" /> محفوظ کریں</translation> <translation id="1032891413405719768">اسٹائلس کی بیٹری کم ہے</translation> @@ -147,6 +148,7 @@ <translation id="1651914502370159744">سرگزشت کا صفحہ کھولیں</translation> <translation id="1654477262762802994">صوتی استفسار شروع کریں</translation> <translation id="1668469839109562275">پہلے سے موجود VPN</translation> +<translation id="1675844249244994876">دائیں ونڈو کو اپ ڈیٹ کریں</translation> <translation id="1677472565718498478"><ph name="TIME" /> باقی</translation> <translation id="1677507110654891115"><ph name="FEATURE_NAME" /> منسلک نہیں ہے۔</translation> <translation id="1677582821739292812">کوئی آپ کی اسکرین پر دیکھ رہا ہے</translation> @@ -191,6 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">ایتھرنیٹ: <ph name="ADDRESS" /></translation> +<translation id="1824922790784036530">مقام تک رسائی آن کریں</translation> <translation id="1830308660060964064"><ph name="ITEM_TITLE" /> سے پن کو ختم کر دیا گیا</translation> <translation id="1838895407229022812">نائٹ لائٹ آف ہے۔</translation> <translation id="1854180393107901205">کاسٹ کرنا بند کریں</translation> @@ -468,6 +471,7 @@ <translation id="3255483164551725916">آپ کیا کر سکتی ہیں؟</translation> <translation id="3256109297135787951">اپنی شیلف پر ایک آئٹم سے ہائی لائٹ ہٹائیں</translation> <translation id="3260969790895726815">اسپیچ پر مقامی طور پر کارروائی کی جاتی ہے اور ڈکٹیشن آف لائن کام کرتی ہے، لیکن کچھ صوتی کمانڈز کام نہیں کریں گے۔</translation> +<translation id="3265032511221679826">قطعی مقام تک رسائی کو آن کریں؟</translation> <translation id="3269597722229482060">دائیں طرف کلک کریں</translation> <translation id="3289364673986435196">پاور مینیو</translation> <translation id="3289544412142055976">Linux ایپس فی الحال تعاون یافتہ نہیں ہیں</translation> @@ -578,6 +582,7 @@ <translation id="366222428570480733"><ph name="USER_EMAIL_ADDRESS" /> نظم کردہ صارف</translation> <translation id="3666266999138159418">فلوٹنگ ونڈو کو چھپانے کے لیے سوائپ کریں</translation> <translation id="367531336287639526">ایڈریس بار کے بائیں جانب موجود پہلے آئیکن کو منتخب کریں</translation> +<translation id="3677931086890821290">اس سے سبھی ایپس اور ویب سائٹس کو مقام کی اجازت اور ChromeOS کے ساتھ Wi-Fi اور موبائل نیٹ ورکس کا مقام استعمال کرنے کی اجازت ملتی ہے۔</translation> <translation id="3679827876008292680">ونڈو میں آخری ٹیب پر جائیں</translation> <translation id="36813544980941320">آپ کے فون اور <ph name="DEVICE_NAME" /> کے درمیان Wi-Fi نیٹ ورکس کا اشتراک کیا جائے گا</translation> <translation id="3694122362646626770">ویب سائٹس</translation> @@ -844,6 +849,7 @@ <translation id="493076006037866439">اسکرین کو زوم آؤٹ کریں</translation> <translation id="4936329710968938986">ہر کوئی، آف</translation> <translation id="4938176435186993759">سبھی تجاویز چھپائیں</translation> +<translation id="4943007472417128747">WiFi استعمال کرنے کے لیے ہاٹ اسپاٹ کو آف کر دیا گیا ہے۔ ہاٹ اسپاٹ استعمال کرنے کے لیے، WiFi آف کریں۔</translation> <translation id="4945196315133970626">اطلاعات آف کریں</translation> <translation id="4946376291507881335">کیپچر کریں</translation> <translation id="495046168593986294">اوپر اسکرول کریں</translation> @@ -1387,6 +1393,7 @@ آلہ کو شٹ ڈاؤن کرنے کے لیے پاور بٹن کو آلہ پر دوبارہ چھوئیں اور دبائے رکھیں۔</translation> <translation id="7526573455193969409">ممکن ہے نیٹ ورک کو مانیٹر کیا جا رہا ہو</translation> <translation id="7536035074519304529">IP پتہ: <ph name="ADDRESS" /></translation> +<translation id="7536832381700852123">بائیں ونڈو کو اپ ڈیٹ کریں</translation> <translation id="7543399541175347147">Linux ایپس اور پوشیدگی ونڈوز فی الحال تعاون یافتہ نہیں ہیں۔ دیگر ایپس کو محفوظ کیا جائے گا۔</translation> <translation id="7544300628205093162">کی بورڈ عقبی لائٹ آن ہے</translation> <translation id="7548434653388805669">سونے کا وقت ہو گیا</translation> @@ -1467,6 +1474,7 @@ <translation id="7893503627044934815">نہیں چاہتے کہ یہ فائل دکھائی جائے</translation> <translation id="7895348134893321514">ٹوٹ</translation> <translation id="7897375687985782769">آپ نے اسکرین کو گھمانے کیلئے کی بورڈ شارٹ کٹ دبایا ہے۔ کیا آپ اسکرین کو گھمانا چاہتے ہیں؟</translation> +<translation id="7901190436359881020">ونڈوز تبدیل کریں</translation> <translation id="7901405293566323524">فون کا ہب</translation> <translation id="7902625623987030061">فنگر پرنٹ سینسر کو ٹچ کریں</translation> <translation id="7904094684485781019">اس اکاؤنٹ کے منتظم نے متعدد سائن ان کی اجازت ختم کر دی ہے۔</translation> @@ -1742,6 +1750,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> ریزولیوشن کو <ph name="RESOLUTION" /> پر تبدیل کر دیا گیا ہے۔ تبدیلیاں باقی رکھنے کے لیے تصدیق کریں پر کلک کریں۔ گزشتہ تبدیلیوں کو <ph name="TIMEOUT_SECONDS" /> میں بحال کر دیا جائے گا۔</translation> <translation id="9201044636667689546">اس Chromebook سے <ph name="NAME" /> کو منسلک کریں</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />، آپ کے منتظم کے زیر انتظام ہے</translation> +<translation id="9207682216934703221">اس سے <ph name="APP_NAME" />، <ph name="APP2_NAME" /> اور سبھی ایپس اور ویب سائٹس کو مقام کی اجازت اور ChromeOS کے ساتھ Wi-Fi اور موبائل نیٹ ورکس کا مقام استعمال کرنے کی اجازت ملتی ہے۔</translation> <translation id="9210037371811586452">یونیفائیڈ ڈیسک ٹاپ وضع سے باہر نکل رہے ہیں</translation> <translation id="9211490828691860325">تمام ڈیسکس</translation> <translation id="9211681782751733685">بیٹری کے مکمل طور پر چارج ہونے میں <ph name="TIME_REMAINING" /> باقی ہے۔</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index de27da9f..07fb7cc9 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -1067,6 +1067,7 @@ <translation id="5976112937189445008">Oynani yozib olish uchun Enter tugmasini bosing</translation> <translation id="5978382165065462689">Ekraningiz boshqaruvini masofaviy yordamchi orqali ulashish.</translation> <translation id="5980301590375426705">Chiqish (mehmon)</translation> +<translation id="5983567367406220847">Faolsizlik tufayli hotspot faolsizlantirildi.</translation> <translation id="598407983968395253">Andozadan foydalanish</translation> <translation id="598882571027504733">Yangilanishni o‘rnatish uchun Chromebook qurilmangizni tashqi klavuatura orqali o‘chirib yoqing.</translation> <translation id="6002179289567220515">1 ta kamerani oʻchirish uchun jismoniy kalitdan foydalangansiz. Shuningdek, barcha kameralar uchun ruxsatni ham faolsizlantirishingiz mumkin.</translation> @@ -1369,6 +1370,7 @@ <translation id="7452560014878697800">Ilova kamerangizni ishlatmoqda</translation> <translation id="7453330308669753048">Qidiruv tarixidagi natija olib tashlandi</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | <ph name="TIME" /> da toʻladi</translation> +<translation id="7459485586006128091">Ichki xatolik tufayli hotspot oʻchirildi. Bir-ikki daqiqadan keyin qayta ulaning.</translation> <translation id="7461924472993315131">Qadab qo‘yish</translation> <translation id="746232733191930409">Ekranni yozib olish rejimi</translation> <translation id="7466449121337984263">Sensorga tegining</translation> @@ -1441,6 +1443,7 @@ <translation id="776344839111254542">Yangilanish tafsilotlarini ko‘rish uchun bosing</translation> <translation id="7768784765476638775">Teginib tinglash</translation> <translation id="7769299611924763557">GIF faylingiz tezda tayyor boʻladi</translation> +<translation id="7773536009433685931">Wi-Fi funksiyasini yoqish</translation> <translation id="7780094051999721182">Yorliqlar</translation> <translation id="7780159184141939021">Ekranni burish</translation> <translation id="7796735576426975947">Yangi bildirishnoma yashirildi</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index c09efc4..b3cd56b 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -1067,6 +1067,7 @@ <translation id="5976112937189445008">Nhấn phím Enter để ghi màn hình trong cửa sổ</translation> <translation id="5978382165065462689">Chia sẻ quyền kiểm soát màn hình của bạn qua Trợ giúp từ xa.</translation> <translation id="5980301590375426705">Thoát phiên khách</translation> +<translation id="5983567367406220847">Điểm phát sóng đã tắt do không hoạt động.</translation> <translation id="598407983968395253">Sử dụng mẫu</translation> <translation id="598882571027504733">Để cập nhật, hãy khởi động lại Chromebook bằng bàn phím đã kết nối.</translation> <translation id="6002179289567220515">Bạn đã dùng công tắc vật lý để tắt 1 máy ảnh. Bạn cũng có thể tắt quyền truy cập vào mọi máy ảnh.</translation> @@ -1369,6 +1370,7 @@ <translation id="7452560014878697800">Một ứng dụng đang sử dụng máy ảnh của bạn</translation> <translation id="7453330308669753048">Đã xoá kết quả khỏi nhật ký tìm kiếm</translation> <translation id="7455047553373871740"><ph name="BATTERY_PERCENTAGE" />% | còn <ph name="TIME" /> cho đến khi pin đầy</translation> +<translation id="7459485586006128091">Điểm phát sóng đã tắt do lỗi nội bộ. Hãy thử kết nối lại sau vài phút.</translation> <translation id="7461924472993315131">Ghim</translation> <translation id="746232733191930409">Chế độ ghi màn hình</translation> <translation id="7466449121337984263">Vui lòng chạm vào cảm biến</translation> @@ -1441,6 +1443,7 @@ <translation id="776344839111254542">Nhấp để xem chi tiết cập nhật</translation> <translation id="7768784765476638775">Chọn để nói</translation> <translation id="7769299611924763557">Ảnh GIF của bạn sẽ sớm sẵn sàng</translation> +<translation id="7773536009433685931">Bật Wi-Fi</translation> <translation id="7780094051999721182">lối tắt</translation> <translation id="7780159184141939021">Xoay màn hình</translation> <translation id="7796735576426975947">Đã ẩn thông báo mới</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index 8a10f1a..63d5e41 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -4,7 +4,7 @@ <translation id="1012876632442809908">USB-C 裝置 (前方連接埠)</translation> <translation id="1013598600051641573"><ph name="DISPLAY_NAME" /> 已變更為 <ph name="RESOLUTION" /> (<ph name="REFRESH_RATE" /> Hz)。請按一下 [確認] 以保留變更。系統會在 <ph name="TIMEOUT_SECONDS" />後還原先前的設定。</translation> <translation id="1013923882670373915">藍牙裝置「<ph name="DEVICE_NAME" />」要求配對權限,請在裝置上輸入以下 PIN:<ph name="PINCODE" /></translation> -<translation id="1014722676793506285">這項操作會允許「<ph name="APP_NAME" />」、具有位置存取權的所有應用程式/網站和 ChromeOS 使用 Wi-Fi 和行動網路的位置資訊。</translation> +<translation id="1014722676793506285">此操作會允許「<ph name="APP_NAME" />」和所有獲得位置權限的應用程式和網站和 ChromeOS 使用 Wi-Fi 和流動網絡位置。</translation> <translation id="1017556409696559990">當 Chrome 沒有返回記錄時,就將頂層視窗縮到最小</translation> <translation id="1024364763893396229">儲存 <ph name="NAME" /></translation> <translation id="1032891413405719768">觸控筆電量偏低</translation> @@ -193,7 +193,7 @@ <ph name="IME" /> <ph name="LOCALE" /></translation> <translation id="1823873187264960516">以太網:<ph name="ADDRESS" /></translation> -<translation id="1824922790784036530">開啟位置存取權</translation> +<translation id="1824922790784036530">開啟位置資料存取權</translation> <translation id="1830308660060964064">已經將<ph name="ITEM_TITLE" />取消置頂</translation> <translation id="1838895407229022812">「夜燈模式」已關閉。</translation> <translation id="1854180393107901205">停止投放</translation> @@ -471,7 +471,7 @@ <translation id="3255483164551725916">你可以做咩嘢?</translation> <translation id="3256109297135787951">取消捷徑列上項目的突顯狀態</translation> <translation id="3260969790895726815">語音會在本機處理,而語音聽寫可離線運作,但部分語音指令無法使用。</translation> -<translation id="3265032511221679826">要開啟精確位置存取權嗎?</translation> +<translation id="3265032511221679826">要開啟精確位置的存取權嗎?</translation> <translation id="3269597722229482060">按滑鼠右鍵</translation> <translation id="3289364673986435196">電源選單</translation> <translation id="3289544412142055976">目前不支援 Linux 應用程式</translation> @@ -582,7 +582,7 @@ <translation id="366222428570480733">受管理嘅使用者:<ph name="USER_EMAIL_ADDRESS" /></translation> <translation id="3666266999138159418">滑動即可隱藏浮動視窗</translation> <translation id="367531336287639526">選取網址列左方的第一個圖示</translation> -<translation id="3677931086890821290">這項操作會允許具有位置存取權的所有應用程式/網站和 ChromeOS 使用 Wi-Fi 和行動網路的位置資訊。</translation> +<translation id="3677931086890821290">此操作會允許所有獲得位置權限的應用程式和網站和 ChromeOS 使用 Wi-Fi 和流動網絡位置。</translation> <translation id="3679827876008292680">前往視窗中的最後一個分頁</translation> <translation id="36813544980941320">您的手機和 <ph name="DEVICE_NAME" /> 將共用 Wi-Fi 網絡</translation> <translation id="3694122362646626770">網站</translation> @@ -1752,7 +1752,7 @@ <translation id="9198992156681343238"><ph name="DISPLAY_NAME" /> 的解像度已變更為 <ph name="RESOLUTION" />。請按一下 [確認] 以保留變更。系統會在 <ph name="TIMEOUT_SECONDS" />後還原先前的設定。</translation> <translation id="9201044636667689546">請將 <ph name="NAME" /> 連結至 Chromebook</translation> <translation id="9201374708878217446"><ph name="CONNECTION_STATUS" />,由管理員管理</translation> -<translation id="9207682216934703221">這項操作會允許「<ph name="APP_NAME" />」、「<ph name="APP2_NAME" />」、具有位置存取權的所有應用程式/網站和 ChromeOS 使用 Wi-Fi 和行動網路的位置資訊。</translation> +<translation id="9207682216934703221">此操作會允許「<ph name="APP_NAME" />」、「<ph name="APP2_NAME" />」和所有獲得位置權限的應用程式和網站和 ChromeOS 使用 Wi-Fi 和流動網絡位置。</translation> <translation id="9210037371811586452">正在退出統一桌面模式</translation> <translation id="9211490828691860325">所有桌面</translation> <translation id="9211681782751733685">電池仲有 <ph name="TIME_REMAINING" />就差滿電。</translation>
diff --git a/ash/system/holding_space/holding_space_tray.cc b/ash/system/holding_space/holding_space_tray.cc index b187c346..7d8269f 100644 --- a/ash/system/holding_space/holding_space_tray.cc +++ b/ash/system/holding_space/holding_space_tray.cc
@@ -506,12 +506,21 @@ void HoldingSpaceTray::UpdateVisibility() { // The holding space tray should not be visible if the `model` is not attached // or if the user session is blocked. - HoldingSpaceModel* const model = HoldingSpaceController::Get()->model(); + HoldingSpaceController* const controller = HoldingSpaceController::Get(); + HoldingSpaceModel* const model = controller->model(); if (!model || Shell::Get()->session_controller()->IsUserSessionBlocked()) { SetVisiblePreferred(false); return; } + // Always show the holding space tray if there are clients forcing it to show + // in shelf. Note that this is intentionally respected only while the holding + // space model is attached and the user session is unblocked. + if (controller->force_show_in_shelf()) { + SetVisiblePreferred(true); + return; + } + // If the predictability flag is enabled, always show the holding space tray. if (features::IsHoldingSpacePredictabilityEnabled()) { SetVisiblePreferred(true); @@ -601,6 +610,16 @@ UpdatePreviewsState(); } +void HoldingSpaceTray::OnHoldingSpaceForceShowInShelfChanged() { + // Animations are distracting when forcibly toggling holding space visibility + // in the shelf. Disable them temporarily. Note that animations will be + // re-enabled when items are added/removed from the holding space model. + SetShouldAnimate(false); + + UpdateVisibility(); + UpdatePreviewsState(); +} + void HoldingSpaceTray::OnHoldingSpaceItemsAdded( const std::vector<const HoldingSpaceItem*>& items) { // If an initialized holding space item is added to the model mid-session, the
diff --git a/ash/system/holding_space/holding_space_tray.h b/ash/system/holding_space/holding_space_tray.h index ead2cde..c6a337b 100644 --- a/ash/system/holding_space/holding_space_tray.h +++ b/ash/system/holding_space/holding_space_tray.h
@@ -119,6 +119,7 @@ // HoldingSpaceControllerObserver: void OnHoldingSpaceModelAttached(HoldingSpaceModel* model) override; void OnHoldingSpaceModelDetached(HoldingSpaceModel* model) override; + void OnHoldingSpaceForceShowInShelfChanged() override; // HoldingSpaceModelObserver: void OnHoldingSpaceItemsAdded(
diff --git a/ash/system/holding_space/holding_space_tray_unittest.cc b/ash/system/holding_space/holding_space_tray_unittest.cc index 4d76e5c..76c189e 100644 --- a/ash/system/holding_space/holding_space_tray_unittest.cc +++ b/ash/system/holding_space/holding_space_tray_unittest.cc
@@ -23,6 +23,7 @@ #include "ash/public/cpp/holding_space/mock_holding_space_client.h" #include "ash/public/cpp/test/shell_test_api.h" #include "ash/resources/vector_icons/vector_icons.h" +#include "ash/session/session_controller_impl.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_widget.h" #include "ash/shell.h" @@ -643,6 +644,40 @@ // Tests ----------------------------------------------------------------------- +TEST_F(HoldingSpaceTrayTest, ShowTrayButtonWhenForced) { + // Case: Force show in shelf prior to session start. + auto force_show_in_shelf = + std::make_unique<HoldingSpaceController::ScopedForceShowInShelf>(); + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + // Case: Force show in shelf after session start with empty model. + StartSession(/*pre_mark_time_of_first_add=*/false); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + + // Case: Force show in shelf with blocked user session. + auto* session_ctrlr = ash_test_helper()->test_session_controller_client(); + session_ctrlr->SetSessionState(session_manager::SessionState::LOCKED); + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + // Case: Force show in shelf with unblocked user session. + session_ctrlr->UnlockScreen(); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + + // Case: Force show in shelf with detached model. + auto account_id = Shell::Get()->session_controller()->GetActiveAccountId(); + auto* controller = HoldingSpaceController::Get(); + controller->RegisterClientAndModelForUser(account_id, client(), nullptr); + EXPECT_FALSE(test_api()->IsShowingInShelf()); + + // Case: Force show in shelf with attached model. + controller->RegisterClientAndModelForUser(account_id, client(), model()); + EXPECT_TRUE(test_api()->IsShowingInShelf()); + + // Case: Stop forcing show in shelf with empty model. + force_show_in_shelf.reset(); + EXPECT_FALSE(test_api()->IsShowingInShelf()); +} + TEST_F(HoldingSpaceTrayTest, ShowTrayButtonOnFirstUse) { StartSession(/*pre_mark_time_of_first_add=*/false); GetTray()->FirePreviewsUpdateTimerIfRunningForTesting();
diff --git a/ash/system/input_device_settings/input_device_key_alias_manager.cc b/ash/system/input_device_settings/input_device_key_alias_manager.cc new file mode 100644 index 0000000..82e4051 --- /dev/null +++ b/ash/system/input_device_settings/input_device_key_alias_manager.cc
@@ -0,0 +1,12 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/input_device_settings/input_device_key_alias_manager.h" + +namespace ash { + +InputDeviceKeyAliasManager::InputDeviceKeyAliasManager() = default; +InputDeviceKeyAliasManager::~InputDeviceKeyAliasManager() = default; + +} // namespace ash
diff --git a/ash/system/input_device_settings/input_device_key_alias_manager.h b/ash/system/input_device_settings/input_device_key_alias_manager.h new file mode 100644 index 0000000..5a082b3 --- /dev/null +++ b/ash/system/input_device_settings/input_device_key_alias_manager.h
@@ -0,0 +1,23 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_KEY_ALIAS_MANAGER_H_ +#define ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_KEY_ALIAS_MANAGER_H_ + +#include "ash/ash_export.h" + +namespace ash { + +class ASH_EXPORT InputDeviceKeyAliasManager { + public: + InputDeviceKeyAliasManager(); + InputDeviceKeyAliasManager(const InputDeviceKeyAliasManager&) = delete; + InputDeviceKeyAliasManager& operator=(const InputDeviceKeyAliasManager&) = + delete; + ~InputDeviceKeyAliasManager(); +}; + +} // namespace ash + +#endif // ASH_SYSTEM_INPUT_DEVICE_SETTINGS_INPUT_DEVICE_KEY_ALIAS_MANAGER_H_
diff --git a/ash/system/input_device_settings/input_device_key_alias_manager_unittest.cc b/ash/system/input_device_settings/input_device_key_alias_manager_unittest.cc new file mode 100644 index 0000000..36c69e19 --- /dev/null +++ b/ash/system/input_device_settings/input_device_key_alias_manager_unittest.cc
@@ -0,0 +1,39 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/input_device_settings/input_device_key_alias_manager.h" + +#include "ash/test/ash_test_base.h" + +namespace ash { + +class InputDeviceKeyAliasManagerTest : public AshTestBase { + public: + InputDeviceKeyAliasManagerTest() = default; + InputDeviceKeyAliasManagerTest(const InputDeviceKeyAliasManagerTest&) = + delete; + InputDeviceKeyAliasManagerTest& operator=( + const InputDeviceKeyAliasManagerTest&) = delete; + ~InputDeviceKeyAliasManagerTest() override = default; + + // testing::Test: + void SetUp() override { + AshTestBase::SetUp(); + manager_ = std::make_unique<InputDeviceKeyAliasManager>(); + } + + void TearDown() override { + manager_.reset(); + AshTestBase::TearDown(); + } + + protected: + std::unique_ptr<InputDeviceKeyAliasManager> manager_; +}; + +TEST_F(InputDeviceKeyAliasManagerTest, InitializationTest) { + EXPECT_NE(manager_.get(), nullptr); +} + +} // namespace ash
diff --git a/ash/system/input_device_settings/pref_handlers/mouse_pref_handler_impl.cc b/ash/system/input_device_settings/pref_handlers/mouse_pref_handler_impl.cc index a42f49f..3121b78e 100644 --- a/ash/system/input_device_settings/pref_handlers/mouse_pref_handler_impl.cc +++ b/ash/system/input_device_settings/pref_handlers/mouse_pref_handler_impl.cc
@@ -307,8 +307,8 @@ const auto* settings_dict = GetLoginScreenSettingsDict( local_state, account_id, - mouse->is_external ? prefs::kKeyboardLoginScreenExternalSettingsPref - : prefs::kKeyboardLoginScreenInternalSettingsPref); + mouse->is_external ? prefs::kMouseLoginScreenExternalSettingsPref + : prefs::kMouseLoginScreenInternalSettingsPref); if (settings_dict) { mouse->settings = RetrieveMouseSettings(mouse_policies, *mouse, *settings_dict);
diff --git a/ash/system/message_center/message_center_style.h b/ash/system/message_center/message_center_style.h index 86e14b5..c330d91 100644 --- a/ash/system/message_center/message_center_style.h +++ b/ash/system/message_center/message_center_style.h
@@ -34,16 +34,7 @@ constexpr int kScrollShadowBlur = 2; // Layout parameters for swipe control of notifications in message center. -constexpr int kSwipeControlButtonImageSize = 20; -constexpr int kSwipeControlButtonSize = 36; -constexpr int kSwipeControlButtonVerticalMargin = 24; constexpr int kSwipeControlButtonHorizontalMargin = 8; -constexpr SkColor kSwipeControlBackgroundColor = - SkColorSetRGB(0xee, 0xee, 0xee); - -// The ratio to multiply with the swipe control width to get the width to -// display at full opacity when swiping. -constexpr float kSwipeControlFullOpacityRatio = 1.5f; constexpr int kMaxGroupedNotificationsInCollapsedState = 3; constexpr auto kGroupedCollapsedCountViewInsets =
diff --git a/ash/system/message_center/notification_swipe_control_view.cc b/ash/system/message_center/notification_swipe_control_view.cc index b0f091c..14e6078 100644 --- a/ash/system/message_center/notification_swipe_control_view.cc +++ b/ash/system/message_center/notification_swipe_control_view.cc
@@ -5,7 +5,6 @@ #include "ash/system/message_center/notification_swipe_control_view.h" #include <memory> -#include "ash/constants/ash_features.h" #include "ash/style/icon_button.h" #include "ash/system/message_center/message_center_constants.h" #include "ash/system/message_center/message_center_style.h" @@ -17,14 +16,9 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/compositor/layer.h" #include "ui/events/event.h" -#include "ui/gfx/color_palette.h" -#include "ui/gfx/paint_vector_icon.h" -#include "ui/message_center/vector_icons.h" #include "ui/message_center/views/message_view.h" -#include "ui/message_center/views/notification_background_painter.h" #include "ui/message_center/views/notification_control_buttons_view.h" #include "ui/strings/grit/ui_strings.h" -#include "ui/views/background.h" #include "ui/views/layout/box_layout.h" namespace ash { @@ -35,50 +29,20 @@ NotificationSwipeControlView::NotificationSwipeControlView( message_center::MessageView* message_view) : message_view_(message_view) { - gfx::Insets padding = - features::IsNotificationsRefreshEnabled() - ? kNotificationSwipeControlPadding - : gfx::Insets::VH( - message_center_style::kSwipeControlButtonVerticalMargin, - message_center_style::kSwipeControlButtonHorizontalMargin); - auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, padding, + views::BoxLayout::Orientation::kHorizontal, + kNotificationSwipeControlPadding, message_center_style::kSwipeControlButtonHorizontalMargin)); layout->set_cross_axis_alignment( - features::IsNotificationsRefreshEnabled() - ? views::BoxLayout::CrossAxisAlignment::kCenter - : views::BoxLayout::CrossAxisAlignment::kStart); + views::BoxLayout::CrossAxisAlignment::kCenter); layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kEnd); std::unique_ptr<views::ImageButton> settings_button; - if (features::IsNotificationsRefreshEnabled()) { - settings_button = std::make_unique<IconButton>( - base::BindRepeating(&NotificationSwipeControlView::ButtonPressed, - base::Unretained(this), ButtonId::kSettings), - IconButton::Type::kMedium, &vector_icons::kSettingsOutlineIcon, - IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME); - } else { - settings_button = std::make_unique<views::ImageButton>( - base::BindRepeating(&NotificationSwipeControlView::ButtonPressed, - base::Unretained(this), ButtonId::kSettings)); - settings_button->SetImageModel( - views::Button::STATE_NORMAL, - ui::ImageModel::FromVectorIcon( - message_center::kNotificationSettingsButtonIcon, ui::kColorIcon, - message_center_style::kSwipeControlButtonImageSize)); - settings_button->SetPreferredSize( - gfx::Size(message_center_style::kSwipeControlButtonSize, - message_center_style::kSwipeControlButtonSize)); - - settings_button->SetAccessibleName(l10n_util::GetStringUTF16( - IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); - settings_button->SetTooltipText(l10n_util::GetStringUTF16( - IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); - settings_button->SetBackground( - views::CreateSolidBackground(SK_ColorTRANSPARENT)); - settings_button->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); - } + settings_button = std::make_unique<IconButton>( + base::BindRepeating(&NotificationSwipeControlView::ButtonPressed, + base::Unretained(this)), + IconButton::Type::kMedium, &vector_icons::kSettingsOutlineIcon, + IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME); settings_button->SetImageHorizontalAlignment( views::ImageButton::ALIGN_CENTER); @@ -97,8 +61,7 @@ NotificationSwipeControlView::~NotificationSwipeControlView() = default; void NotificationSwipeControlView::ShowButtons(ButtonPosition button_position, - bool show_settings, - bool show_snooze) { + bool show_settings) { views::BoxLayout* layout = static_cast<views::BoxLayout*>(GetLayoutManager()); if ((button_position == ButtonPosition::RIGHT) != base::i18n::IsRTL()) { layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kEnd); @@ -107,13 +70,11 @@ views::BoxLayout::MainAxisAlignment::kStart); } ShowSettingsButton(show_settings); - ShowSnoozeButton(show_snooze); Layout(); } void NotificationSwipeControlView::HideButtons() { ShowSettingsButton(false); - ShowSnoozeButton(false); Layout(); } @@ -134,65 +95,23 @@ } bool has_settings_button = buttons->settings_button(); - if (features::IsNotificationsRefreshEnabled()) { - if (!has_settings_button) { - return; - } - - int extra_padding = button_position == ButtonPosition::RIGHT - ? kNotificationSwipeControlPadding.left() - : kNotificationSwipeControlPadding.right(); - int settings_button_width = settings_button_->GetPreferredSize().width(); - - // We only show the settings button if we have enough space for display. - bool enough_space_to_show_button = - abs(gesture_amount) >= settings_button_width + extra_padding; - ShowButtons(button_position, - has_settings_button && enough_space_to_show_button, - /*show_snooze=*/false); - - message_view_->SetSlideButtonWidth( - settings_button_ ? settings_button_width + settings_button_->width() - : 0); + if (!has_settings_button) { return; } - bool has_snooze_button = buttons->snooze_button(); - ShowButtons(button_position, has_settings_button, has_snooze_button); + int extra_padding = button_position == ButtonPosition::RIGHT + ? kNotificationSwipeControlPadding.left() + : kNotificationSwipeControlPadding.right(); + int settings_button_width = settings_button_->GetPreferredSize().width(); - int control_button_count = - (has_settings_button ? 1 : 0) + (has_snooze_button ? 1 : 0); - int control_button_width = - message_center_style::kSwipeControlButtonSize * control_button_count + - message_center_style::kSwipeControlButtonHorizontalMargin * - (control_button_count ? control_button_count + 1 : 0); - message_view_->SetSlideButtonWidth(control_button_width); + // We only show the settings button if we have enough space for display. + bool enough_space_to_show_button = + abs(gesture_amount) >= settings_button_width + extra_padding; + ShowButtons(button_position, + has_settings_button && enough_space_to_show_button); - // Update opacity based on the swipe progress. The swipe controls should - // gradually disappear as the user swipes the notification away. - float full_opacity_width = - message_center_style::kSwipeControlFullOpacityRatio * - control_button_width; - float fade_out_width = message_view_->width() - full_opacity_width; - DCHECK(fade_out_width > 0); - float swipe_progress = std::max( - 0.0f, (fabs(gesture_amount) - full_opacity_width) / fade_out_width); - float opacity = std::max(0.0f, 1.0f - swipe_progress); - - layer()->SetOpacity(opacity); -} - -void NotificationSwipeControlView::UpdateCornerRadius(int top_radius, - int bottom_radius) { - // In the new notification UI, there will be no swipe control background. - if (features::IsNotificationsRefreshEnabled()) { - return; - } - SetBackground(views::CreateBackgroundFromPainter( - std::make_unique<message_center::NotificationBackgroundPainter>( - top_radius, bottom_radius, - message_center_style::kSwipeControlBackgroundColor))); - SchedulePaint(); + message_view_->SetSlideButtonWidth( + settings_button_ ? settings_button_width + settings_button_->width() : 0); } void NotificationSwipeControlView::ShowSettingsButton(bool show) { @@ -208,65 +127,18 @@ } } -void NotificationSwipeControlView::ShowSnoozeButton(bool show) { - // We don't show the snooze button in the new feature. - if (features::IsNotificationsRefreshEnabled()) { - return; - } - - if (show && !snooze_button_) { - snooze_button_ = new views::ImageButton( - base::BindRepeating(&NotificationSwipeControlView::ButtonPressed, - base::Unretained(this), ButtonId::kSnooze)); - snooze_button_->SetImageModel( - views::Button::STATE_NORMAL, - ui::ImageModel::FromVectorIcon( - message_center::kNotificationSnoozeButtonIcon, ui::kColorIcon, - message_center_style::kSwipeControlButtonImageSize)); - snooze_button_->SetImageHorizontalAlignment( - views::ImageButton::ALIGN_CENTER); - snooze_button_->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - snooze_button_->SetPreferredSize( - gfx::Size(message_center_style::kSwipeControlButtonSize, - message_center_style::kSwipeControlButtonSize)); - - snooze_button_->SetAccessibleName(l10n_util::GetStringUTF16( - IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); - snooze_button_->SetTooltipText(l10n_util::GetStringUTF16( - IDS_MESSAGE_NOTIFICATION_SETTINGS_BUTTON_ACCESSIBLE_NAME)); - snooze_button_->SetBackground( - views::CreateSolidBackground(SK_ColorTRANSPARENT)); - snooze_button_->SetFocusBehavior(FocusBehavior::ACCESSIBLE_ONLY); - - AddChildViewAt(snooze_button_, 0); - Layout(); - } else if (!show && snooze_button_) { - DCHECK(Contains(snooze_button_)); - delete snooze_button_; - snooze_button_ = nullptr; - } -} - const char* NotificationSwipeControlView::GetClassName() const { return kViewClassName; } -void NotificationSwipeControlView::ButtonPressed(ButtonId button, - const ui::Event& event) { +void NotificationSwipeControlView::ButtonPressed(const ui::Event& event) { auto weak_this = weak_factory_.GetWeakPtr(); const std::string notification_id = message_view_->notification_id(); - if (button == ButtonId::kSettings) { - message_view_->OnSettingsButtonPressed(event); - metrics_utils::LogSettingsShown(notification_id, - /*is_slide_controls=*/true, - /*is_popup=*/false); - } else { - message_view_->OnSnoozeButtonPressed(event); - metrics_utils::LogSnoozed(notification_id, - /*is_slide_controls=*/true, - /*is_popup=*/false); - } + message_view_->OnSettingsButtonPressed(event); + metrics_utils::LogSettingsShown(notification_id, + /*is_slide_controls=*/true, + /*is_popup=*/false); // Button handlers of |message_view_| may have closed |this|. if (!weak_this) {
diff --git a/ash/system/message_center/notification_swipe_control_view.h b/ash/system/message_center/notification_swipe_control_view.h index 437c65f7..be7bb6e 100644 --- a/ash/system/message_center/notification_swipe_control_view.h +++ b/ash/system/message_center/notification_swipe_control_view.h
@@ -8,7 +8,6 @@ #include "ash/ash_export.h" #include "base/gtest_prod_util.h" #include "base/memory/weak_ptr.h" -#include "base/observer_list_types.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/animation/animation_delegate.h" #include "ui/views/controls/button/image_button.h" @@ -20,7 +19,8 @@ namespace ash { -// View containing 2 buttons that appears behind notification by swiping. +// View containing the settings button that appears behind notification by +// swiping. class ASH_EXPORT NotificationSwipeControlView : public views::View { public: // Physical positions to show buttons in the swipe control. This is invariant @@ -44,40 +44,25 @@ // Update the visibility of control buttons. void UpdateButtonsVisibility(); - // Update the radii of background corners. - void UpdateCornerRadius(int top_radius, int bottom_radius); - private: FRIEND_TEST_ALL_PREFIXES(NotificationSwipeControlViewTest, DeleteOnSettingsButtonPressed); FRIEND_TEST_ALL_PREFIXES(NotificationSwipeControlViewTest, - DeleteOnSnoozeButtonPressed); - FRIEND_TEST_ALL_PREFIXES(NotificationSwipeControlViewTest, SettingsButtonVisibility); - enum class ButtonId { - kSettings, - kSnooze, - }; - // Change the visibility of the settings and snooze button. - void ShowButtons(ButtonPosition button_position, - bool show_settings, - bool show_snooze); + // Change the visibility of the settings button. + void ShowButtons(ButtonPosition button_position, bool show_settings); void HideButtons(); // Change the visibility of the settings button. True to show, false to hide. void ShowSettingsButton(bool show); - // Change the visibility of the snooze button. True to show, false to hide. - void ShowSnoozeButton(bool show); - - void ButtonPressed(ButtonId button, const ui::Event& event); + void ButtonPressed(const ui::Event& event); message_center::MessageView* const message_view_; // Owned by views hierarchy. views::ImageButton* settings_button_ = nullptr; - views::ImageButton* snooze_button_ = nullptr; base::WeakPtrFactory<NotificationSwipeControlView> weak_factory_{this}; };
diff --git a/ash/system/message_center/notification_swipe_control_view_unittest.cc b/ash/system/message_center/notification_swipe_control_view_unittest.cc index 4a569a9..a79d309 100644 --- a/ash/system/message_center/notification_swipe_control_view_unittest.cc +++ b/ash/system/message_center/notification_swipe_control_view_unittest.cc
@@ -7,10 +7,8 @@ #include <memory> #include <string> -#include "ash/constants/ash_features.h" #include "ash/system/message_center/message_center_constants.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/scoped_feature_list.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/base_event_utils.h" @@ -57,10 +55,6 @@ OnSettingsButtonPressed, (const ui::Event& event), (override)); - MOCK_METHOD(void, - OnSnoozeButtonPressed, - (const ui::Event& event), - (override)); private: std::unique_ptr<message_center::NotificationControlButtonsView> buttons_view_; @@ -71,18 +65,12 @@ namespace ash { -class NotificationSwipeControlViewTest - : public testing::Test, - public testing::WithParamInterface<bool> { +class NotificationSwipeControlViewTest : public testing::Test { public: NotificationSwipeControlViewTest() = default; ~NotificationSwipeControlViewTest() override = default; void SetUp() override { - scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list_->InitWithFeatureState(features::kNotificationsRefresh, - IsNotificationsRefreshEnabled()); - message_center::MessageCenter::Initialize( std::make_unique<message_center::FakeLockScreenController>()); @@ -100,8 +88,6 @@ message_view_ = std::make_unique<MockMessageView>(notification); } - bool IsNotificationsRefreshEnabled() const { return GetParam(); } - void TearDown() override { message_center::MessageCenter::Shutdown(); } protected: @@ -109,14 +95,9 @@ private: std::unique_ptr<MockMessageView> message_view_; - std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; }; -INSTANTIATE_TEST_SUITE_P(All, - NotificationSwipeControlViewTest, - testing::Bool() /* IsNotificationsRefreshEnabled() */); - -TEST_P(NotificationSwipeControlViewTest, DeleteOnSettingsButtonPressed) { +TEST_F(NotificationSwipeControlViewTest, DeleteOnSettingsButtonPressed) { auto swipe_control_view = std::make_unique<NotificationSwipeControlView>(message_view()); @@ -132,9 +113,8 @@ // First click will do nothing, expect that to work. swipe_control_view->ShowButtons( NotificationSwipeControlView::ButtonPosition::LEFT, - /*show_settings=*/true, /*show_snooze=*/true); - if (features::IsNotificationsRefreshEnabled()) - swipe_control_view->settings_button_->SetHasInkDropActionOnClick(false); + /*show_settings=*/true); + swipe_control_view->settings_button_->SetHasInkDropActionOnClick(false); views::test::ButtonTestApi(swipe_control_view->settings_button_) .NotifyClick(press); @@ -143,54 +123,15 @@ // Second click deletes |swipe_control_view| in the handler. swipe_control_view->ShowButtons( NotificationSwipeControlView::ButtonPosition::LEFT, - /*show_settings=*/true, /*show_snooze=*/true); - if (features::IsNotificationsRefreshEnabled()) - swipe_control_view->settings_button_->SetHasInkDropActionOnClick(false); + /*show_settings=*/true); + swipe_control_view->settings_button_->SetHasInkDropActionOnClick(false); views::test::ButtonTestApi(swipe_control_view->settings_button_) .NotifyClick(press); EXPECT_FALSE(swipe_control_view); } -TEST_P(NotificationSwipeControlViewTest, DeleteOnSnoozeButtonPressed) { - // There's no snooze button in the new feature, return early. - if (features::IsNotificationsRefreshEnabled()) - return; - - auto swipe_control_view = - std::make_unique<NotificationSwipeControlView>(message_view()); - - EXPECT_CALL(*message_view(), OnSnoozeButtonPressed(testing::_)) - .WillOnce(testing::DoDefault()) - .WillOnce( - testing::InvokeWithoutArgs([&]() { swipe_control_view.reset(); })); - - ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::PointF(), gfx::PointF(), - ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, - ui::EF_NONE); - - // First click will do nothing, expect that to work. - swipe_control_view->ShowButtons( - NotificationSwipeControlView::ButtonPosition::LEFT, - /*show_settings=*/true, /*show_snooze=*/true); - views::test::ButtonTestApi(swipe_control_view->snooze_button_) - .NotifyClick(press); - EXPECT_TRUE(swipe_control_view); - - // Second click deletes |swipe_control_view| in the handler. - swipe_control_view->ShowButtons( - NotificationSwipeControlView::ButtonPosition::LEFT, - /*show_settings=*/true, /*show_snooze=*/true); - views::test::ButtonTestApi(swipe_control_view->snooze_button_) - .NotifyClick(press); - EXPECT_FALSE(swipe_control_view); -} - -TEST_P(NotificationSwipeControlViewTest, SettingsButtonVisibility) { - // We only test this case in the new feature. - if (!features::IsNotificationsRefreshEnabled()) - return; - +TEST_F(NotificationSwipeControlViewTest, SettingsButtonVisibility) { auto swipe_control_view = std::make_unique<NotificationSwipeControlView>(message_view()); int available_space =
diff --git a/ash/system/message_center/unified_message_center_bubble.cc b/ash/system/message_center/unified_message_center_bubble.cc index 3167a11..0921b569 100644 --- a/ash/system/message_center/unified_message_center_bubble.cc +++ b/ash/system/message_center/unified_message_center_bubble.cc
@@ -81,8 +81,7 @@ init_params.preferred_width = kTrayMenuWidth; init_params.has_shadow = false; init_params.close_on_deactivate = false; - if (features::IsNotificationsRefreshEnabled()) - init_params.translucent = true; + init_params.translucent = true; bubble_view_ = new TrayBubbleView(init_params); @@ -107,14 +106,6 @@ tray_->bubble()->GetBubbleWidget()->GetNativeWindow(), bubble_widget_->GetNativeWindow()); - if (!features::IsNotificationsRefreshEnabled()) { - ui::Layer* content_layer = bubble_view_->layer(); - float radius = kBubbleCornerRadius; - content_layer->SetRoundedCornerRadius({radius, radius, radius, radius}); - content_layer->SetIsFastRoundedCorner(true); - content_layer->Add(border_->layer()); - } - if (features::IsSystemTrayShadowEnabled()) { // Create a shadow for bubble widget. shadow_ = SystemShadow::CreateShadowOnNinePatchLayerForWindow( @@ -210,11 +201,6 @@ notification_center_view_->UpdateNotificationBar(); - if (!features::IsNotificationsRefreshEnabled()) { - bubble_view_->layer()->StackAtTop(border_->layer()); - border_->layer()->SetBounds(notification_center_view_->GetContentsBounds()); - } - if (shadow_) { // When the last notification is removed, the content bounds of message // center may become too small such which makes the shadow's bounds smaller
diff --git a/ash/system/message_center/unified_message_center_bubble_unittest.cc b/ash/system/message_center/unified_message_center_bubble_unittest.cc index 3ec023f..2d125f5 100644 --- a/ash/system/message_center/unified_message_center_bubble_unittest.cc +++ b/ash/system/message_center/unified_message_center_bubble_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" @@ -19,7 +18,6 @@ #include "ash/test/ash_test_base.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/strings/stringprintf.h" -#include "base/test/scoped_feature_list.h" #include "components/prefs/pref_service.h" #include "ui/events/keycodes/keyboard_codes_posix.h" #include "ui/message_center/message_center.h" @@ -27,13 +25,9 @@ using message_center::MessageCenter; using message_center::Notification; -#include <iostream> - namespace ash { -class UnifiedMessageCenterBubbleTest - : public AshTestBase, - public testing::WithParamInterface<bool> { +class UnifiedMessageCenterBubbleTest : public AshTestBase { public: UnifiedMessageCenterBubbleTest() = default; @@ -44,17 +38,6 @@ ~UnifiedMessageCenterBubbleTest() override = default; - // AshTestBase: - void SetUp() override { - scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list_->InitWithFeatureState(features::kNotificationsRefresh, - IsNotificationsRefreshEnabled()); - - AshTestBase::SetUp(); - } - - bool IsNotificationsRefreshEnabled() const { return GetParam(); } - protected: std::string AddWebNotification() { std::string id = base::NumberToString(id_++); @@ -166,14 +149,9 @@ private: int id_ = 0; - std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; }; -INSTANTIATE_TEST_SUITE_P(All, - UnifiedMessageCenterBubbleTest, - testing::Bool() /* IsNotificationsRefreshEnabled() */); - -TEST_P(UnifiedMessageCenterBubbleTest, PositionedAboveSystemTray) { +TEST_F(UnifiedMessageCenterBubbleTest, PositionedAboveSystemTray) { const int total_notifications = 5; GetPrimaryUnifiedSystemTray()->ShowBubble(); AddNotification(); @@ -202,7 +180,7 @@ } } -TEST_P(UnifiedMessageCenterBubbleTest, FocusCycle) { +TEST_F(UnifiedMessageCenterBubbleTest, FocusCycle) { GetPrimaryUnifiedSystemTray()->ShowBubble(); AddNotification(); AddNotification(); @@ -250,7 +228,7 @@ GetFirstQuickSettingsFocusable()); } -TEST_P(UnifiedMessageCenterBubbleTest, CollapseState) { +TEST_F(UnifiedMessageCenterBubbleTest, CollapseState) { AddNotification(); AddNotification(); @@ -301,7 +279,7 @@ EXPECT_FALSE(IsMessageCenterCollapsed()); } -TEST_P(UnifiedMessageCenterBubbleTest, FocusCycleWithNoNotifications) { +TEST_F(UnifiedMessageCenterBubbleTest, FocusCycleWithNoNotifications) { GetPrimaryUnifiedSystemTray()->ShowBubble(); views::Widget* quick_settings_widget = @@ -332,7 +310,7 @@ GetFirstQuickSettingsFocusable()); } -TEST_P(UnifiedMessageCenterBubbleTest, BubbleBounds) { +TEST_F(UnifiedMessageCenterBubbleTest, BubbleBounds) { std::vector<std::string> displays = {"0+0-1200x800", "0+0-1280x1080", "0+0-1600x1440"}; @@ -381,7 +359,7 @@ } } -TEST_P(UnifiedMessageCenterBubbleTest, HandleAccelerators) { +TEST_F(UnifiedMessageCenterBubbleTest, HandleAccelerators) { auto id = AddWebNotification(); WaitForAnimation();
diff --git a/ash/system/notification_center/notification_list_view.cc b/ash/system/notification_center/notification_list_view.cc index 7d46967..001cb50 100644 --- a/ash/system/notification_center/notification_list_view.cc +++ b/ash/system/notification_center/notification_list_view.cc
@@ -37,8 +37,6 @@ #include "ui/message_center/public/cpp/notification_types.h" #include "ui/message_center/views/message_view.h" #include "ui/views/animation/animation_delegate_views.h" -#include "ui/views/background.h" -#include "ui/views/border.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/widget/widget.h" @@ -141,39 +139,23 @@ is_top_ = is_top; is_bottom_ = is_bottom; - // We do not need to have a separate border with rounded corners with the - // new UI. This is because the entire scroll view has rounded corners now. - if (!features::IsNotificationsRefreshEnabled()) { - message_view_->SetBorder( - is_bottom ? views::NullBorder() - : views::CreateSolidSidedBorder( - gfx::Insets::TLBR( - 0, 0, kUnifiedNotificationSeparatorThickness, 0), - message_center_style::kSeparatorColor)); - } - - const int message_center_notification_corner_radius = - features::IsNotificationsRefreshEnabled() - ? kMessageCenterNotificationInnerCornerRadius - : 0; + // The entire scroll view has rounded corners. const int top_radius = is_top ? kMessageCenterNotificationTopBottomCornerRadius - : message_center_notification_corner_radius; + : kMessageCenterNotificationInnerCornerRadius; const int bottom_radius = is_bottom ? kMessageCenterNotificationTopBottomCornerRadius - : message_center_notification_corner_radius; + : kMessageCenterNotificationInnerCornerRadius; message_view_->UpdateCornerRadius(top_radius, bottom_radius); - control_view_->UpdateCornerRadius(top_radius, bottom_radius); } // Reset rounding the corner of the view. This is called when we end a slide. void ResetCornerRadius() { need_update_corner_radius_ = true; - int corner_radius = features::IsNotificationsRefreshEnabled() - ? kMessageCenterNotificationInnerCornerRadius - : 0; - message_view_->UpdateCornerRadius(corner_radius, corner_radius); + message_view_->UpdateCornerRadius( + kMessageCenterNotificationInnerCornerRadius, + kMessageCenterNotificationInnerCornerRadius); } // Collapses the notification if its state haven't changed manually by a user. @@ -259,10 +241,6 @@ base::ScopedClosureRunner defer_preferred_size_changed(base::BindOnce( &MessageViewContainer::PreferredSizeChanged, base::Unretained(this))); - if (!features::IsNotificationsRefreshEnabled()) { - return; - } - // Ignore non user triggered expand/collapses. if (loading_expanded_state_) { return; @@ -296,8 +274,7 @@ void OnSlideChanged(const std::string& notification_id) override { control_view_->UpdateButtonsVisibility(); - if (!features::IsNotificationsRefreshEnabled() || - notification_id != GetNotificationId() || + if (notification_id != GetNotificationId() || message_view_->GetSlideAmount() == 0 || !need_update_corner_radius_) { return; } @@ -331,8 +308,7 @@ } void OnSlideEnded(const std::string& notification_id) override { - if (!features::IsNotificationsRefreshEnabled() || - notification_id != GetNotificationId()) { + if (notification_id != GetNotificationId()) { return; } @@ -445,18 +421,9 @@ message_center_view_(message_center_view), model_(model), animation_(std::make_unique<gfx::LinearAnimation>(this)), - is_notifications_refresh_enabled_( - features::IsNotificationsRefreshEnabled()), - message_view_width_(is_notifications_refresh_enabled_ - ? kTrayMenuWidth - (2 * kMessageCenterPadding) - : kTrayMenuWidth) { + message_view_width_(kTrayMenuWidth - (2 * kMessageCenterPadding)) { message_center_observation_.Observe(MessageCenter::Get()); animation_->SetCurrentValue(1.0); - - if (!is_notifications_refresh_enabled_) { - SetBackground(views::CreateSolidBackground( - message_center_style::kSwipeControlBackgroundColor)); - } } NotificationListView::~NotificationListView() { @@ -491,10 +458,8 @@ view->message_view()->IsAutoExpandingAllowed()); } - // The insertion order for notifications will be reversed when - // is_notifications_refresh_enabled_. - AddChildViewAt(view, - is_notifications_refresh_enabled_ ? children().size() : 0); + // The insertion order for notifications is reversed. + AddChildViewAt(view, children().size()); MessageCenter::Get()->DisplayedNotification( notification->id(), message_center::DISPLAY_SOURCE_MESSAGE_CENTER); is_latest = false; @@ -655,12 +620,6 @@ return; } - // No State::EXPAND_OR_COLLAPSE animation in the old UI. - if (!features::IsNotificationsRefreshEnabled()) { - ResetBounds(); - return; - } - auto* message_view_container = AsMVC(child); // Immediately complete the old expand/collapse animation. It will be snapped // to the target bounds when UpdateBounds() is called. If the other animations @@ -778,7 +737,7 @@ } // A group child notification should be added to its parent's message view. - if (is_notifications_refresh_enabled_ && notification->group_child()) { + if (notification->group_child()) { return; } @@ -791,7 +750,7 @@ // the notification. This happens when we convert a single notification to a // group notification, ConvertNotificationViewToGroupedNotificationView() // changes the id of the single notification to the parent's. - if (is_notifications_refresh_enabled_ && GetNotificationById(id)) { + if (GetNotificationById(id)) { OnNotificationUpdated(id); return; } @@ -810,14 +769,9 @@ break; } - // The insertion order for notifications will be reversed when - // is_notifications_refresh_enabled_. - if ((is_notifications_refresh_enabled_ && - !message_center_utils::CompareNotifications(child_notification, - notification)) || - (!is_notifications_refresh_enabled_ && - !message_center_utils::CompareNotifications(notification, - child_notification))) { + // The insertion order for notifications is reversed. + if (!message_center_utils::CompareNotifications(child_notification, + notification)) { index_to_insert = i; break; } @@ -1040,16 +994,10 @@ NotificationListView::MessageViewContainer* NotificationListView::GetNextRemovableNotification() { - if (is_notifications_refresh_enabled_) { - const auto i = base::ranges::find_if_not( - base::Reversed(children()), - [](const auto* v) { return AsMVC(v)->IsPinned(); }); - return (i == children().rend()) ? nullptr : AsMVC(*i); - } - const auto i = base::ranges::find_if_not( - children(), [](const auto* v) { return AsMVC(v)->IsPinned(); }); - return (i == children().cend()) ? nullptr : AsMVC(*i); + base::Reversed(children()), + [](const auto* v) { return AsMVC(v)->IsPinned(); }); + return (i == children().rend()) ? nullptr : AsMVC(*i); } void NotificationListView::CollapseAllNotifications() { @@ -1063,10 +1011,6 @@ // The top notification is drawn with rounded corners when the stacking bar // is not shown. bool is_top = state_ != State::MOVE_DOWN; - if (!is_notifications_refresh_enabled_) { - is_top = is_top && children().size() == 1; - } - for (auto* child : children()) { AsMVC(child)->UpdateBorder(is_top, child == children().back(), force_update); @@ -1084,7 +1028,7 @@ const int height = view->GetHeightForWidth(message_view_width_); const int direction = view->GetSlideDirection(); - if (y > 0 && is_notifications_refresh_enabled_) { + if (y > 0) { y += kMessageListNotificationSpacing; }
diff --git a/ash/system/notification_center/notification_list_view.h b/ash/system/notification_center/notification_list_view.h index d870d82..30c85cc 100644 --- a/ash/system/notification_center/notification_list_view.h +++ b/ash/system/notification_center/notification_list_view.h
@@ -288,7 +288,6 @@ // (e.g. crbug.com/933327) caused by the View destructor. bool is_deleting_removed_notifications_ = false; - const bool is_notifications_refresh_enabled_; const int message_view_width_; base::ScopedObservation<message_center::MessageCenter,
diff --git a/ash/system/notification_center/notification_list_view_unittest.cc b/ash/system/notification_center/notification_list_view_unittest.cc index e1310ab0..f8a6706e 100644 --- a/ash/system/notification_center/notification_list_view_unittest.cc +++ b/ash/system/notification_center/notification_list_view_unittest.cc
@@ -210,6 +210,13 @@ return message_list_view()->children()[index]->bounds(); } + // Start sliding the message view at the given index in the list. + void StartSliding(size_t index) { + auto* message_view = GetMessageViewAt(index); + message_view->set_slide_amount(1); + message_view->OnSlideChanged(/*in_progress=*/true); + } + void FinishSlideOutAnimation() { base::RunLoop().RunUntilIdle(); } void AnimateToMiddle() { @@ -725,34 +732,8 @@ EXPECT_EQ(id3, GetMessageViewAt(0)->notification_id()); } -// Tests only with NotificationsRefresh enabled. -class RefreshedNotificationListView : public NotificationListViewTest { - public: - RefreshedNotificationListView() = default; - RefreshedNotificationListView(const RefreshedNotificationListView&) = delete; - RefreshedNotificationListView& operator=( - const RefreshedNotificationListView&) = delete; - ~RefreshedNotificationListView() override = default; - - void SetUp() override { - scoped_feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); - scoped_feature_list_->InitAndEnableFeature(features::kNotificationsRefresh); - NotificationListViewTest::SetUp(); - } - - // Start sliding the message view at the given index in the list. - void StartSliding(size_t index) { - auto* message_view = GetMessageViewAt(index); - message_view->set_slide_amount(1); - message_view->OnSlideChanged(/*in_progress=*/true); - } - - private: - std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; -}; - // Tests that preferred size changes upon toggle of expand/collapse. -TEST_F(RefreshedNotificationListView, PreferredSizeChangesOnToggle) { +TEST_F(NotificationListViewTest, PreferredSizeChangesOnToggle) { AddNotification(/*pinned=*/false, /*expandable=*/true); AddNotification(/*pinned=*/false, /*expandable=*/true); CreateMessageListView(); @@ -786,7 +767,7 @@ // Tests that expanding a notification while a different notification is // expanding is handled gracefully. -TEST_F(RefreshedNotificationListView, TwoExpandsInARow) { +TEST_F(NotificationListViewTest, TwoExpandsInARow) { AddNotification(/*pinned=*/false, /*expandable=*/true); AddNotification(/*pinned=*/false, /*expandable=*/true); CreateMessageListView(); @@ -826,7 +807,7 @@ } // Tests that collapsing/expanding is reversible. -TEST_F(RefreshedNotificationListView, ReverseExpand) { +TEST_F(NotificationListViewTest, ReverseExpand) { AddNotification(/*pinned=*/false, /*expandable=*/true); AddNotification(/*pinned=*/false, /*expandable=*/true); CreateMessageListView(); @@ -853,7 +834,7 @@ } // Tests that destroying during a collapse animation does not crash. -TEST_F(RefreshedNotificationListView, DestroyMessageListViewDuringCollapse) { +TEST_F(NotificationListViewTest, DestroyMessageListViewDuringCollapse) { AddNotification(/*pinned=*/false, /*expandable=*/true); AddNotification(/*pinned=*/false, /*expandable=*/true); CreateMessageListView(); @@ -866,7 +847,7 @@ // Tests that closing a notification while its collapse animation is ongoing // works properly. -TEST_F(RefreshedNotificationListView, RemoveNotificationDuringCollapse) { +TEST_F(NotificationListViewTest, RemoveNotificationDuringCollapse) { auto id1 = AddNotification(/*pinned=*/false, /*expandable=*/true); CreateMessageListView(); auto* message_view = GetMessageViewAt(0); @@ -892,7 +873,7 @@ // Tests that expanding a notification at various stages while it is being // closed does not result in an animation. // TODO(crbug.com/1292775): Test is flaky. -TEST_F(RefreshedNotificationListView, +TEST_F(NotificationListViewTest, DISABLED_CollapseDuringCloseResultsInNoCollapseAnimation) { auto id1 = AddNotification(/*pinned=*/false, /*expandable=*/true); AddNotification(/*pinned=*/false, /*expandable=*/true); @@ -930,7 +911,7 @@ // Tests that collapsing a notification while it is being moved automatically // completes both animations. // TODO(crbug.com/1292816): Test is flaky. -TEST_F(RefreshedNotificationListView, DISABLED_CollapseDuringMoveNoAnimation) { +TEST_F(NotificationListViewTest, DISABLED_CollapseDuringMoveNoAnimation) { auto to_be_removed_notification = AddNotification(/*pinned=*/false, /*expandable=*/true); auto to_be_collapsed_notification = @@ -966,7 +947,7 @@ // Tests that moving a notification while it is already collapsing completes // both animations. -TEST_F(RefreshedNotificationListView, MoveDuringCollapseNoAnimation) { +TEST_F(NotificationListViewTest, MoveDuringCollapseNoAnimation) { auto to_be_removed_notification = AddNotification(/*pinned=*/false, /*expandable=*/true); auto to_be_collapsed_notification = @@ -996,7 +977,7 @@ to_be_collapsed_message_view_container->GetPreferredSize().height()); } -TEST_F(RefreshedNotificationListView, SlideNotification) { +TEST_F(NotificationListViewTest, SlideNotification) { // Show message list with four notifications. auto id0 = AddNotification(); auto id1 = AddNotification();
diff --git a/ash/system/phonehub/app_stream_connection_error_dialog.cc b/ash/system/phonehub/app_stream_connection_error_dialog.cc index 6ce4641..76c6727 100644 --- a/ash/system/phonehub/app_stream_connection_error_dialog.cc +++ b/ash/system/phonehub/app_stream_connection_error_dialog.cc
@@ -62,7 +62,9 @@ class ConnectionErrorDialogDelegateView : public views::WidgetDelegateView { public: explicit ConnectionErrorDialogDelegateView( - StartTetheringCallback start_tethering_callback) + StartTetheringCallback start_tethering_callback, + bool is_on_different_network, + bool is_phone_on_cellular) : start_tethering_callback_(std::move(start_tethering_callback)) { SetModalType(ui::MODAL_TYPE_WINDOW); @@ -104,14 +106,27 @@ title_->layer()->SetFillsBoundsOpaquely(false); // Add dialog body. - const std::u16string learn_more_link = - l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE); - size_t offset; - const std::u16string body_text = l10n_util::GetStringFUTF16( - IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_MAIN_TEXT, learn_more_link, - &offset); body_ = AddChildView(std::make_unique<views::StyledLabel>()); + + std::u16string body_text; + const std::u16string learn_more_link = + l10n_util::GetStringUTF16(IDS_ASH_LEARN_MORE); + // To record where "Learn more" text begin in the dialog body. + size_t offset; + if (is_phone_on_cellular) { + body_text = l10n_util::GetStringFUTF16( + IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_PHONE_ON_CELLULAR_TEXT, + learn_more_link, &offset); + } else if (is_on_different_network) { + body_text = l10n_util::GetStringFUTF16( + IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DIFFERENT_NETWORK_TEXT, + learn_more_link, &offset); + } else { + body_text = l10n_util::GetStringFUTF16( + IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_UNSUPPORTED_NETWORK_TEXT, + learn_more_link, &offset); + } body_->SetText(body_text); views::StyledLabel::RangeStyleInfo style; @@ -155,19 +170,33 @@ kMarginBetweenButtons)) ->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kEnd); - cancel_button_ = button_row->AddChildView(std::make_unique<ash::PillButton>( - views::Button::PressedCallback(base::BindRepeating( - &ConnectionErrorDialogDelegateView::OnCancelClicked, - base::Unretained(this))), - l10n_util::GetStringUTF16(IDS_APP_CANCEL), - PillButton::Type::kDefaultWithoutIcon, nullptr)); - accept_button_ = button_row->AddChildView(std::make_unique<ash::PillButton>( - views::Button::PressedCallback(base::BindRepeating( - &ConnectionErrorDialogDelegateView::OnStartTetheringClicked, - base::Unretained(this))), - l10n_util::GetStringUTF16( - IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TURN_ON_HOTSPOT), - PillButton::Type::kPrimaryWithoutIcon, nullptr)); + if (!is_on_different_network && !is_phone_on_cellular) { + cancel_button_ = + button_row->AddChildView(std::make_unique<ash::PillButton>( + views::Button::PressedCallback(base::BindRepeating( + &ConnectionErrorDialogDelegateView::OnCancelClicked, + base::Unretained(this))), + l10n_util::GetStringUTF16( + IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT), + PillButton::Type::kDefaultWithoutIcon, nullptr)); + accept_button_ = + button_row->AddChildView(std::make_unique<ash::PillButton>( + views::Button::PressedCallback(base::BindRepeating( + &ConnectionErrorDialogDelegateView::OnStartTetheringClicked, + base::Unretained(this))), + l10n_util::GetStringUTF16( + IDS_ASH_ECHE_APP_STREMING_ERROR_DIALOG_TURN_ON_HOTSPOT), + PillButton::Type::kPrimaryWithoutIcon, nullptr)); + } else { + cancel_button_ = + button_row->AddChildView(std::make_unique<ash::PillButton>( + views::Button::PressedCallback(base::BindRepeating( + &ConnectionErrorDialogDelegateView::OnCancelClicked, + base::Unretained(this))), + l10n_util::GetStringUTF16( + IDS_ASH_ECHE_APP_STREAMING_ERROR_DIALOG_DISMISS_TEXT), + PillButton::Type::kPrimaryWithoutIcon, nullptr)); + } } ConnectionErrorDialogDelegateView(const ConnectionErrorDialogDelegateView&) = @@ -235,10 +264,12 @@ AppStreamConnectionErrorDialog::AppStreamConnectionErrorDialog( views::View* host_view, base::OnceClosure on_close_callback, - StartTetheringCallback button_callback) + StartTetheringCallback button_callback, + bool is_different_network, + bool is_phone_one_cellular) : host_view_(host_view), on_close_callback_(std::move(on_close_callback)) { auto dialog = std::make_unique<ConnectionErrorDialogDelegateView>( - std::move(button_callback)); + std::move(button_callback), is_different_network, is_phone_one_cellular); views::Widget* const parent = host_view_->GetWidget(); widget_ = new views::Widget();
diff --git a/ash/system/phonehub/app_stream_connection_error_dialog.h b/ash/system/phonehub/app_stream_connection_error_dialog.h index cc06d2b..25f53536 100644 --- a/ash/system/phonehub/app_stream_connection_error_dialog.h +++ b/ash/system/phonehub/app_stream_connection_error_dialog.h
@@ -30,7 +30,9 @@ AppStreamConnectionErrorDialog( views::View* host_view, base::OnceClosure on_close_callback, - StartTetheringCallback start_tethering_callback); + StartTetheringCallback start_tethering_callback, + bool is_different_network, + bool is_phone_on_cellular); AppStreamConnectionErrorDialog(const AppStreamConnectionErrorDialog& other) = delete; AppStreamConnectionErrorDialog& operator=(
diff --git a/ash/system/phonehub/phone_connected_view.cc b/ash/system/phonehub/phone_connected_view.cc index 07152d92..4c598f9 100644 --- a/ash/system/phonehub/phone_connected_view.cc +++ b/ash/system/phonehub/phone_connected_view.cc
@@ -139,7 +139,8 @@ return phone_hub_metrics::Screen::kPhoneConnected; } -void PhoneConnectedView::ShowAppStreamErrorDialog() { +void PhoneConnectedView::ShowAppStreamErrorDialog(bool is_different_network, + bool is_phone_on_cellular) { if (!features::IsEcheNetworkConnectionStateEnabled()) { return; } @@ -148,7 +149,8 @@ base::BindOnce(&PhoneConnectedView::OnAppStreamErrorDialogClosed, base::Unretained(this)), base::BindOnce(&PhoneConnectedView::OnAppStreamErrorDialogButtonClicked, - base::Unretained(this))); + base::Unretained(this)), + is_different_network, is_phone_on_cellular); app_stream_error_dialog_->UpdateBounds(); app_stream_error_dialog_->widget()->Show(); }
diff --git a/ash/system/phonehub/phone_connected_view.h b/ash/system/phonehub/phone_connected_view.h index c93b1787..f2adc8a 100644 --- a/ash/system/phonehub/phone_connected_view.h +++ b/ash/system/phonehub/phone_connected_view.h
@@ -35,7 +35,8 @@ // PhoneHubContentView: phone_hub_metrics::Screen GetScreenForMetrics() const override; - void ShowAppStreamErrorDialog(); + void ShowAppStreamErrorDialog(bool is_different_network, + bool is_phone_on_cellular); private: void OnAppStreamErrorDialogClosed();
diff --git a/ash/system/phonehub/phone_hub_recent_apps_view.cc b/ash/system/phonehub/phone_hub_recent_apps_view.cc index 9f3019a..94f748a 100644 --- a/ash/system/phonehub/phone_hub_recent_apps_view.cc +++ b/ash/system/phonehub/phone_hub_recent_apps_view.cc
@@ -22,6 +22,7 @@ #include "ash/system/phonehub/ui_constants.h" #include "ash/system/tray/tray_constants.h" #include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h" +#include "ash/webui/eche_app_ui/system_info_provider.h" #include "base/cxx17_backports.h" #include "base/metrics/histogram_functions.h" #include "base/ranges/algorithm.h" @@ -516,7 +517,15 @@ void PhoneHubRecentAppsView::ShowConnectionErrorDialog() { if (features::IsEcheNetworkConnectionStateEnabled()) { - connected_view_->ShowAppStreamErrorDialog(); + connected_view_->ShowAppStreamErrorDialog( + phone_hub_manager_->GetSystemInfoProvider() + ? phone_hub_manager_->GetSystemInfoProvider() + ->is_different_network() + : false, + phone_hub_manager_->GetSystemInfoProvider() + ? phone_hub_manager_->GetSystemInfoProvider() + ->android_device_on_cellular() + : false); } }
diff --git a/ash/system/unified/unified_system_tray.cc b/ash/system/unified/unified_system_tray.cc index 9fa5370..b0cf0bc 100644 --- a/ash/system/unified/unified_system_tray.cc +++ b/ash/system/unified/unified_system_tray.cc
@@ -124,15 +124,12 @@ : ui_controller_(std::make_unique<MessageCenterUiController>(this)), message_popup_collection_( std::make_unique<AshMessagePopupCollection>(owner->shelf())), - owner_(owner) { - if (features::IsNotificationsRefreshEnabled()) { - grouping_controller_ = std::make_unique<NotificationGroupingController>( - /*unified_system_tray=*/owner, - /*notification_center_tray=*/owner->shelf() - ->status_area_widget() - ->notification_center_tray()); - } - + owner_(owner), + grouping_controller_(std::make_unique<NotificationGroupingController>( + /*unified_system_tray=*/owner, + /*notification_center_tray=*/owner->shelf() + ->status_area_widget() + ->notification_center_tray())) { ui_controller_->set_hide_on_last_notification(false); display::Screen* screen = display::Screen::GetScreen();
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb index b2f4550..07cdc507 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -122,7 +122,7 @@ <translation id="6888362557094394345">Pomjeranje nadolje</translation> <translation id="695140971690006676">Vrati sve na zadano</translation> <translation id="6965382102122355670">Uredu</translation> -<translation id="6965830616442491568">Portret</translation> +<translation id="6965830616442491568">Uspravno</translation> <translation id="698156982839284926">3 sekunde</translation> <translation id="7134221860976209830">Tajmer za 10 sekundi</translation> <translation id="7191890674911603392">Vrsta snimanja</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb index 3246f86..af1c9c7e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_el.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Μετακινείται με κατεύθυνση προς τα κάτω</translation> <translation id="695140971690006676">Επαναφορά όλων</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Πορτρέτο</translation> <translation id="698156982839284926">3 δευτερόλεπτα</translation> <translation id="7134221860976209830">Χρονόμετρο 10 δευτερολέπτων</translation> <translation id="7191890674911603392">Τύπος εγγραφής</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb index 820ea09..c0de73d 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_en-GB.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Moving in bottom direction</translation> <translation id="695140971690006676">Reset all</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Portrait</translation> <translation id="698156982839284926">3 seconds</translation> <translation id="7134221860976209830">10 seconds timer</translation> <translation id="7191890674911603392">Record type</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb index cb2e5bb..fdf305de 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_kk.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Төмен қарай жылжыту</translation> <translation id="695140971690006676">Барлығын бастапқы күйге қайтару</translation> <translation id="6965382102122355670">Жарайды</translation> +<translation id="6965830616442491568">Портреттік</translation> <translation id="698156982839284926">3 секунд</translation> <translation id="7134221860976209830">10 секундтық таймер</translation> <translation id="7191890674911603392">Жазу түрі</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb index 4313b09..6c5f3ae 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">កំពុងផ្លាស់ទីក្នុងទិសដៅខាងក្រោម</translation> <translation id="695140971690006676">កំណត់ឡើងវិញទាំងអស់</translation> <translation id="6965382102122355670">យល់ព្រម</translation> +<translation id="6965830616442491568">ព្រាលផ្ទៃខាងក្រោយ</translation> <translation id="698156982839284926">3 វិនាទី</translation> <translation id="7134221860976209830">កម្មវិធីកំណត់ម៉ោងរាប់ថយក្រោយ 10 វិនាទី</translation> <translation id="7191890674911603392">ប្រភេទនៃការថត</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb index f57653f..2779139f 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ml.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">താഴേക്കുള്ള ദിശയിൽ നീങ്ങുന്നു</translation> <translation id="695140971690006676">എല്ലാം റീസെറ്റ് ചെയ്യുക</translation> <translation id="6965382102122355670">ശരി</translation> +<translation id="6965830616442491568">പോർട്രെയ്റ്റ്</translation> <translation id="698156982839284926">3 സെക്കൻഡ്</translation> <translation id="7134221860976209830">10 സെക്കൻഡ് ടൈമർ</translation> <translation id="7191890674911603392">റെക്കോർഡ് തരം</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb index 63acda9..0e25693 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_my.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">အောက်ခြေ ဦးတည်ချက်အတိုင်း ရွေ့နေသည်</translation> <translation id="695140971690006676">အားလုံး ပြင်ဆင်သတ်မှတ်ရန်</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">အလှပုံ</translation> <translation id="698156982839284926">၃ စက္ကန့်</translation> <translation id="7134221860976209830">၁၀ စက္ကန့် အချိန်တိုင်းစက်</translation> <translation id="7191890674911603392">ဖမ်းယူမှုပုံစံ</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index ce01e1d..405fdc5 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Beweegt naar beneden</translation> <translation id="695140971690006676">Alles resetten</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Portret</translation> <translation id="698156982839284926">3 seconden</translation> <translation id="7134221860976209830">Timer van 10 seconden</translation> <translation id="7191890674911603392">Opnametype</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb index 4bf4518a..f69ae01 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Beveger seg nedover</translation> <translation id="695140971690006676">Tilbakestill alle</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Portrett</translation> <translation id="698156982839284926">3 sekunder</translation> <translation id="7134221860976209830">Ti sekunders nedtelling</translation> <translation id="7191890674911603392">Posttype</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb index 4330e9f..ffeb025 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pl.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Przesuwam w dół</translation> <translation id="695140971690006676">Zresetuj wszystko</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Pionowo</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="7134221860976209830">10-sekundowy samowyzwalacz</translation> <translation id="7191890674911603392">Typ rekordu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index 921b4fdd..b7438e7e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Movendo para baixo</translation> <translation id="695140971690006676">Redefinir tudo</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Retrato</translation> <translation id="698156982839284926">3 segundos</translation> <translation id="7134221860976209830">Timer de 10 segundos</translation> <translation id="7191890674911603392">Tipo de registro</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb index fb7b147..4a7fb82 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ru.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Перемещение вниз</translation> <translation id="695140971690006676">Сбросить все</translation> <translation id="6965382102122355670">ОК</translation> +<translation id="6965830616442491568">Портрет</translation> <translation id="698156982839284926">3 секунды</translation> <translation id="7134221860976209830">Таймер на 10 сек.</translation> <translation id="7191890674911603392">Тип записи</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb index 3fc0f39..fc7c6fc0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sk.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Presúvate nadol</translation> <translation id="695140971690006676">Resetovať všetko</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Na výšku</translation> <translation id="698156982839284926">3 sekundy</translation> <translation id="7134221860976209830">Desaťsekundový časovač</translation> <translation id="7191890674911603392">Typ záznamu</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb index a1193ed..1220ba7 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr-Latn.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Kreće se nadole</translation> <translation id="695140971690006676">Resetuj sve</translation> <translation id="6965382102122355670">Potvrdi</translation> +<translation id="6965830616442491568">Portret</translation> <translation id="698156982839284926">3 sekunde</translation> <translation id="7134221860976209830">Tajmer za 10 sekundi</translation> <translation id="7191890674911603392">Tip zapisa</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb index 740bba8..091fd3b0 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sr.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Креће се надоле</translation> <translation id="695140971690006676">Ресетуј све</translation> <translation id="6965382102122355670">Потврди</translation> +<translation id="6965830616442491568">Портрет</translation> <translation id="698156982839284926">3 секунде</translation> <translation id="7134221860976209830">Тајмер за 10 секунди</translation> <translation id="7191890674911603392">Тип записа</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb index 3449ce0..44e4daa 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_uz.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Pastga surish</translation> <translation id="695140971690006676">Hammasini tiklash</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Portret</translation> <translation id="698156982839284926">3 soniya</translation> <translation id="7134221860976209830">10 soniyalik taymer</translation> <translation id="7191890674911603392">Yozib olish turi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb index ae0c5b9..ddf62f3 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_vi.xtb
@@ -122,6 +122,7 @@ <translation id="6888362557094394345">Đang di chuyển theo hướng xuống dưới</translation> <translation id="695140971690006676">Đặt lại tất cả</translation> <translation id="6965382102122355670">OK</translation> +<translation id="6965830616442491568">Dọc</translation> <translation id="698156982839284926">3 giây</translation> <translation id="7134221860976209830">Đồng hồ hẹn giờ 10 giây</translation> <translation id="7191890674911603392">Loại bản ghi</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb index 276e182..0b1b7b99 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_zh-TW.xtb
@@ -47,7 +47,7 @@ <translation id="2879583609344924966">已連接「<ph name="CAMERA" />」。</translation> <translation id="3067436040345934772">向右平移</translation> <translation id="3081586908890909590">切換為錄影模式</translation> -<translation id="313467653172006084">每秒畫格數:30</translation> +<translation id="313467653172006084">每秒影格數:30</translation> <translation id="3227137524299004712">麥克風</translation> <translation id="3240426699337459095">連結已複製</translation> <translation id="3354465018370944241">相片設定</translation> @@ -136,7 +136,7 @@ <translation id="761421184377987513">向左下移動</translation> <translation id="7649070708921625228">說明</translation> <translation id="7658239707568436148">取消</translation> -<translation id="7670511624014457267">每秒畫格數:60</translation> +<translation id="7670511624014457267">每秒影格數:60</translation> <translation id="7671804233658741790">文件右下角</translation> <translation id="7692090236657809299">啟用平移、傾斜和縮放功能</translation> <translation id="7726641833034062494">錄製一般影片</translation>
diff --git a/ash/webui/common/resources/keyboard_key.html b/ash/webui/common/resources/keyboard_key.html index 0ad7e4d..611c1587 100644 --- a/ash/webui/common/resources/keyboard_key.html +++ b/ash/webui/common/resources/keyboard_key.html
@@ -59,6 +59,18 @@ position: relative; } + /* TODO(276493287): Remove host-context and replace default colors with jelly + colors once experiment launches. */ + :host-context(body.jelly-enabled) { + --background-color-pressed: var(--cros-button-background-color-primary); + --background-color-unpressed: var(--cros-sys-highlight_shape); + --background-color-tested: var(--cros-sys-highlight_text); + --border-color: var(--cros-icon-color-prominent); + --text-color-unpressed: var(--cros-icon-color-prominent); + --text-color-pressed: var(--cros-button-icon-color-primary); + --text-color-tested: var(--cros-icon-color-prominent); + } + @media (prefers-color-scheme: dark) { :host { --background-color-disabled: var(--cros-bg-color-elevation-4); @@ -67,6 +79,12 @@ --background-color-tested: rgba(var(--cros-icon-color-selection-rgb), .65); } + + /* TODO(276493287): Remove host-context and replace default colors with + jelly colors once experiment launches. */ + :host-context(body.jelly-enabled) { + --background-color-tested: var(--cros-sys-highlight_text); + } } #key {
diff --git a/ash/webui/common/resources/network/apn_list.html b/ash/webui/common/resources/network/apn_list.html index 70bd839..11f106a6 100644 --- a/ash/webui/common/resources/network/apn_list.html +++ b/ash/webui/common/resources/network/apn_list.html
@@ -26,6 +26,19 @@ padding: 0 20px 0 0; } + #errorMessage { + display: flex; + margin: 30px; + margin-inline-end: 80px; + } + + iron-icon[icon='cr20:warning'] { + --iron-icon-width: 1rem; + --iron-icon-height: 1rem; + --iron-icon-fill-color: var(--cros-text-color-warning); + margin-inline-end: 18px; + } + #zeroStateText { border-top: var(--cr-separator-line); display: flex; @@ -52,6 +65,17 @@ [[i18n('apnSettingsDescriptionNoLink')]] </div> </template> + <template is="dom-if" + if="[[shouldShowErrorMessage_(managedCellularProperties, + errorState)]]" restamp> + <div id="errorMessage"> + <span><iron-icon icon="cr20:warning"></iron-icon></span> + <localized-link + localized-string="[[getErrorMessage_(managedCellularProperties, + errorState)]]"> + </localized-link> + </div> + </template> </div> <template is="dom-if"
diff --git a/ash/webui/common/resources/network/apn_list.js b/ash/webui/common/resources/network/apn_list.js index d844f8bd..4f246f2 100644 --- a/ash/webui/common/resources/network/apn_list.js +++ b/ash/webui/common/resources/network/apn_list.js
@@ -106,6 +106,33 @@ } /** + * @return {boolean} + * @private + */ + shouldShowErrorMessage_() { + return this.errorState === SHILL_INVALID_APN_ERROR; + } + + /** + * @return {string} + * @private + */ + getErrorMessage_() { + if (!this.managedCellularProperties || !this.errorState) { + return ''; + } + + const customApnList = this.managedCellularProperties.customApnList; + if (customApnList && + customApnList.some(apn => apn.state === ApnState.kEnabled)) { + return this.i18n('apnSettingsCustomApnsErrorMessage'); + } + + // TODO(b/162365553): Use real string when finalized. + return 'Can\'t connect to network.'; + } + + /** * Returns an array with all the APN properties that need to be displayed. * TODO(b/162365553): Handle managedCellularProperties.apnList.policyValue * when policies are included.
diff --git a/ash/webui/eche_app_ui/BUILD.gn b/ash/webui/eche_app_ui/BUILD.gn index 3bd749e..e8621c76 100644 --- a/ash/webui/eche_app_ui/BUILD.gn +++ b/ash/webui/eche_app_ui/BUILD.gn
@@ -44,6 +44,24 @@ ] } +static_library("system_info_provider") { + sources = [ + "system_info.cc", + "system_info.h", + "system_info_provider.cc", + "system_info_provider.h", + ] + + deps = [ + "//ash/constants", + "//ash/public/cpp", + "//ash/webui/eche_app_ui/mojom", + "//base:base", + "//chromeos/ash/components/multidevice/logging", + "//chromeos/services/network_config/public/cpp", + ] +} + static_library("eche_app_ui") { sources = [ "accessibility_tree_converter.cc", @@ -98,8 +116,6 @@ "launch_app_helper.h", "system_info.cc", "system_info.h", - "system_info_provider.cc", - "system_info_provider.h", "untrusted_eche_app_ui.cc", "untrusted_eche_app_ui.h", "url_constants.cc", @@ -110,6 +126,7 @@ ":eche_app_ui_pref", ":eche_connection_status", ":feature_status", + ":system_info_provider", "//ash", "//ash/constants", "//ash/public/cpp", @@ -189,6 +206,7 @@ ":eche_app_ui_pref", ":eche_connection_status", ":feature_status", + ":system_info_provider", ":test_support", "//ash:test_support", "//ash/public/cpp",
diff --git a/ash/webui/eche_app_ui/eche_app_manager.cc b/ash/webui/eche_app_ui/eche_app_manager.cc index 25f2a55..17aaac4 100644 --- a/ash/webui/eche_app_ui/eche_app_manager.cc +++ b/ash/webui/eche_app_ui/eche_app_manager.cc
@@ -135,6 +135,7 @@ if (features::IsEcheNetworkConnectionStateEnabled()) { phone_hub_manager_->SetEcheConnectionStatusHandler( eche_connection_status_handler_.get()); + phone_hub_manager_->SetSystemInfoProvider(system_info_provider_.get()); } } @@ -196,6 +197,7 @@ void EcheAppManager::Shutdown() { if (features::IsEcheNetworkConnectionStateEnabled() && phone_hub_manager_) { phone_hub_manager_->SetEcheConnectionStatusHandler(nullptr); + phone_hub_manager_->SetSystemInfoProvider(nullptr); } eche_stream_orientation_observer_.reset();
diff --git a/ash/webui/eche_app_ui/system_info_provider.cc b/ash/webui/eche_app_ui/system_info_provider.cc index 518a6e6..09a6ec4 100644 --- a/ash/webui/eche_app_ui/system_info_provider.cc +++ b/ash/webui/eche_app_ui/system_info_provider.cc
@@ -142,7 +142,6 @@ if (!observer_remote_.is_bound()) { return; } - PA_LOG(VERBOSE) << "OnReceivedTabletModeChanged:" << enabled; observer_remote_->OnReceivedTabletModeChanged(enabled); } @@ -157,6 +156,10 @@ << "echeapi SystemInfoProvider " "SetAndroidDeviceNetworkInfoChanged android_device_on_cellular:" << android_device_on_cellular; + + is_different_network_ = is_different_network; + android_device_on_cellular_ = android_device_on_cellular; + if (!observer_remote_.is_bound()) { return; }
diff --git a/ash/webui/eche_app_ui/system_info_provider.h b/ash/webui/eche_app_ui/system_info_provider.h index 07b33e9..64a9479 100644 --- a/ash/webui/eche_app_ui/system_info_provider.h +++ b/ash/webui/eche_app_ui/system_info_provider.h
@@ -41,6 +41,7 @@ explicit SystemInfoProvider( std::unique_ptr<SystemInfo> system_info, chromeos::network_config::mojom::CrosNetworkConfig* cros_network_config); + SystemInfoProvider(); ~SystemInfoProvider() override; SystemInfoProvider(const SystemInfoProvider&) = delete; @@ -64,8 +65,10 @@ void SetAndroidDeviceNetworkInfoChanged(bool is_different_network, bool android_device_on_cellular); + bool is_different_network() { return is_different_network_; } + bool android_device_on_cellular() { return android_device_on_cellular_; } + protected: - SystemInfoProvider(); std::string hashed_wifi_ssid_; private: @@ -89,6 +92,8 @@ std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr> networks); + bool is_different_network_ = false; + bool android_device_on_cellular_ = false; mojo::Receiver<mojom::SystemInfoProvider> info_receiver_{this}; mojo::Remote<mojom::SystemInfoObserver> observer_remote_; mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver>
diff --git a/ash/webui/personalization_app/resources/BUILD.gn b/ash/webui/personalization_app/resources/BUILD.gn index bba2d32..f52d10a 100644 --- a/ash/webui/personalization_app/resources/BUILD.gn +++ b/ash/webui/personalization_app/resources/BUILD.gn
@@ -49,6 +49,7 @@ "js/ambient/ambient_weather_element.ts", "js/ambient/animation_theme_item_element.ts", "js/ambient/animation_theme_list_element.ts", + "js/ambient/duration_list_element.ts", "js/ambient/toggle_row_element.ts", "js/ambient/topic_source_item_element.ts", "js/ambient/topic_source_list_element.ts",
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.html b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.html index 2f26956..c069801f 100644 --- a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.html +++ b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.html
@@ -179,6 +179,9 @@ <ambient-weather-unit selected-temperature-unit="[[temperatureUnitToString_(temperatureUnit_)]]"> </ambient-weather-unit> + <template is="dom-if" if="[[isScreenSaverDurationEnabled_]]"> + <duration-list></duration-list> + </template> </template> </template> </div>
diff --git a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts index 2361940..ebfd324 100644 --- a/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts +++ b/ash/webui/personalization_app/resources/js/ambient/ambient_subpage_element.ts
@@ -19,7 +19,7 @@ import {afterNextRender} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {AmbientModeAlbum, AnimationTheme, TemperatureUnit, TopicSource} from '../../personalization_app.mojom-webui.js'; -import {isAmbientModeAllowed, isPersonalizationJellyEnabled} from '../load_time_booleans.js'; +import {isAmbientModeAllowed, isPersonalizationJellyEnabled, isScreenSaverDurationEnabled} from '../load_time_booleans.js'; import {Paths, ScrollableTarget} from '../personalization_router_element.js'; import {WithPersonalizationStore} from '../personalization_store.js'; @@ -76,6 +76,13 @@ return isPersonalizationJellyEnabled(); }, }, + isScreenSaverDurationEnabled_: { + readOnly: true, + type: Boolean, + value() { + return isScreenSaverDurationEnabled(); + }, + }, }; }
diff --git a/ash/webui/personalization_app/resources/js/ambient/duration_list_element.html b/ash/webui/personalization_app/resources/js/ambient/duration_list_element.html new file mode 100644 index 0000000..c7ea7be --- /dev/null +++ b/ash/webui/personalization_app/resources/js/ambient/duration_list_element.html
@@ -0,0 +1,41 @@ +<style include="common"> + cr-radio-group { + width: 100%; + } + cr-radio-button { + height: 48px; + padding: 0 var(--cr-section-padding); + } + cr-radio-button + cr-radio-button { + border-top: var(--cr-separator-line); + } +</style> +<div> + <h3 class="ambient-subpage-element-title"> + Show screen saver[temp] + </h3> + <div> + <cr-radio-group selected="{{selectedDuration_}}"> + <cr-radio-button + name="[[durations_.kFiveMinutes]]" + label="for 5 minutes[temp]"> + </cr-radio-button> + <cr-radio-button + name="[[durations_.kTenMinutes]]" + label="for 10 minutes[temp]"> + </cr-radio-button> + <cr-radio-button + name="[[durations_.kThirtyMinutes]]" + label="for 30 minutes[temp]"> + </cr-radio-button> + <cr-radio-button + name="[[durations_.kOneHour]]" + label="for 1 hour[temp]"> + </cr-radio-button> + <cr-radio-button + name="[[durations_.kForever]]" + label="forever[temp]"> + </cr-radio-button> + </cr-radio-group> + </div> +</div>
diff --git a/ash/webui/personalization_app/resources/js/ambient/duration_list_element.ts b/ash/webui/personalization_app/resources/js/ambient/duration_list_element.ts new file mode 100644 index 0000000..ba2b0e8 --- /dev/null +++ b/ash/webui/personalization_app/resources/js/ambient/duration_list_element.ts
@@ -0,0 +1,70 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview This component is temporarily added to test the screen saver + * duration settings. + */ + +import '../../css/common.css.js'; +import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js'; +import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js'; +import 'chrome://resources/cr_elements/cr_shared_style.css.js'; + +import {ScreenSaverDuration} from '../../personalization_app.mojom-webui.js'; +import {WithPersonalizationStore} from '../personalization_store.js'; +import {inBetween} from '../utils.js'; + +import {getTemplate} from './duration_list_element.html.js'; + +export class DurationList extends WithPersonalizationStore { + static get is() { + return 'duration-list'; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + /** + * Used to refer to the enum values in HTML file. + */ + durations_: { + type: Object, + value: ScreenSaverDuration, + }, + + selectedDuration_: { + type: String, + value: ScreenSaverDuration.kForever, + observer: 'onSelectedDurationChanged_', + }, + }; + } + + private durations_: ScreenSaverDuration; + private selectedDuration_: string; + + private onSelectedDurationChanged_(value: string) { + const num = parseInt(value, 10); + if (isNaN(num) || + !inBetween( + num, ScreenSaverDuration.MIN_VALUE, + ScreenSaverDuration.MAX_VALUE)) { + console.warn('Unexpected duration value received', value); + return; + } + // TODO(b/274175512): call setScreenSaverDuration(num) + } +} + +declare global { + interface HTMLElementTagNameMap { + 'duration-list': DurationList; + } +} + +customElements.define(DurationList.is, DurationList);
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts index 7b49699..3cd0d17 100644 --- a/ash/webui/personalization_app/resources/js/personalization_app.ts +++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -18,6 +18,7 @@ import './ambient/ambient_preview_small_element.js'; import './ambient/ambient_subpage_element.js'; import './ambient/ambient_weather_element.js'; +import './ambient/duration_list_element.js'; import './ambient/toggle_row_element.js'; import './ambient/topic_source_item_element.js'; import './ambient/topic_source_list_element.js';
diff --git a/ash/webui/projector_app/mojom/untrusted_projector.mojom b/ash/webui/projector_app/mojom/untrusted_projector.mojom index 07e8b3a..4ff5d70 100644 --- a/ash/webui/projector_app/mojom/untrusted_projector.mojom +++ b/ash/webui/projector_app/mojom/untrusted_projector.mojom
@@ -11,6 +11,16 @@ // Requested by the Projector SWA to check the new screencast precondition // state. GetNewScreencastPrecondition() => (NewScreencastPrecondition precondition); + + // Requested by the Projector SWA to check if SODA is not available and should + // be downloaded. Returns false if the device doesn't support SODA. + ShouldDownloadSoda() => (bool should_download); + + // Requested by the Projector SWA to trigger SODA installation. + // Returns true if installation was triggered. The installation progress + // is returned via the OnSoda* methods defined in UntrustedProjectorPage + // below. + InstallSoda() => (bool triggered); }; // Implemented in Javascript to handle requests from the browser process. @@ -18,6 +28,13 @@ // Called by the browser process when the precondition for starting a new // projector session changes. OnNewScreencastPreconditionChanged(NewScreencastPrecondition precondition); + // Called by the browser process when SODA installation is making progress. + OnSodaInstallProgressUpdated(int32 progress); + // Called by the browser process when SODA has been installed. + OnSodaInstalled(); + // Called by the browser process when SODA installation has + // encountered an error. + OnSodaInstallError(); }; // Implemented in C++ in the browser process to set up the communication between
diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc index d3b989c..7dd7f02 100644 --- a/ash/webui/projector_app/projector_message_handler.cc +++ b/ash/webui/projector_app/projector_message_handler.cc
@@ -196,14 +196,6 @@ web_ui()->RegisterMessageCallback( "sendXhr", base::BindRepeating(&ProjectorMessageHandler::SendXhr, base::Unretained(this))); - - web_ui()->RegisterMessageCallback( - "shouldDownloadSoda", - base::BindRepeating(&ProjectorMessageHandler::ShouldDownloadSoda, - base::Unretained(this))); - web_ui()->RegisterMessageCallback( - "installSoda", base::BindRepeating(&ProjectorMessageHandler::InstallSoda, - base::Unretained(this))); web_ui()->RegisterMessageCallback( "getPendingScreencasts", base::BindRepeating(&ProjectorMessageHandler::GetPendingScreencasts, @@ -230,22 +222,6 @@ ScreencastListToValue(pending_screencast)); } -void ProjectorMessageHandler::OnSodaProgress(int combined_progress) { - AllowJavascript(); - FireWebUIListener("onSodaInstallProgressUpdated", - base::Value(combined_progress)); -} - -void ProjectorMessageHandler::OnSodaError() { - AllowJavascript(); - FireWebUIListener("onSodaInstallError"); -} - -void ProjectorMessageHandler::OnSodaInstalled() { - AllowJavascript(); - FireWebUIListener("onSodaInstalled"); -} - void ProjectorMessageHandler::GetAccounts(const base::Value::List& args) { AllowJavascript(); @@ -361,22 +337,6 @@ account_email); } -void ProjectorMessageHandler::ShouldDownloadSoda( - const base::Value::List& args) { - AllowJavascript(); - - // The device should be eligible to download SODA and SODA should not have - // already been downloaded on the device. - ResolveJavascriptCallback( - args[0], base::Value(ProjectorAppClient::Get()->ShouldDownloadSoda())); -} - -void ProjectorMessageHandler::InstallSoda(const base::Value::List& args) { - AllowJavascript(); - ProjectorAppClient::Get()->InstallSoda(); - ResolveJavascriptCallback(args[0], base::Value(true)); -} - void ProjectorMessageHandler::OnError(const base::Value::List& args) { // TODO(b/195113693): Get the SWA dialog associated with this WebUI and close // it.
diff --git a/ash/webui/projector_app/projector_message_handler.h b/ash/webui/projector_app/projector_message_handler.h index 2d0f69bc..d42a1e2 100644 --- a/ash/webui/projector_app/projector_message_handler.h +++ b/ash/webui/projector_app/projector_message_handler.h
@@ -53,9 +53,6 @@ // updates the pending list in Projector SWA. void OnScreencastsPendingStatusChanged( const PendingScreencastSet& pending_screencast) override; - void OnSodaProgress(int percentage) override; - void OnSodaError() override; - void OnSodaInstalled() override; void set_web_ui_for_test(content::WebUI* web_ui) { set_web_ui(web_ui); } @@ -84,13 +81,6 @@ // Requested by the Projector SWA to send XHR request. void SendXhr(const base::Value::List& args); - // Requested by the Projector SWA to check if SODA is not available and should - // be downloaded. Returns false if the device doesn't support SODA. - void ShouldDownloadSoda(const base::Value::List& args); - - // Requested by the Projector SWA to trigger SODA installation. - void InstallSoda(const base::Value::List& args); - // Called by the Projector SWA when an error occurred. void OnError(const base::Value::List& args);
diff --git a/ash/webui/projector_app/resources/app/trusted/embedder.js b/ash/webui/projector_app/resources/app/trusted/embedder.js index 961c810..5e355c6 100644 --- a/ash/webui/projector_app/resources/app/trusted/embedder.js +++ b/ash/webui/projector_app/resources/app/trusted/embedder.js
@@ -37,24 +37,6 @@ const client = AppTrustedCommFactory.getPostMessageAPIClient(); - this.addWebUIListener('onSodaInstallProgressUpdated', (progress) => { - if (isNaN(progress)) { - console.error( - 'Invalid argument to onSodaInstallProgressUpdated', progress); - return; - } - - client.onSodaInstallProgressUpdated(progress); - }); - - this.addWebUIListener('onSodaInstalled', (args) => { - client.onSodaInstalled(); - }); - - this.addWebUIListener('onSodaInstallError', (args) => { - client.onSodaInstallError(); - }); - // TODO(b/204372280): Rename onScreencastsStateChange to // OnPendingScreencastsStateChanged. this.addWebUIListener('onScreencastsStateChange', (pendingScreencasts) => {
diff --git a/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js b/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js index 692fe7b..18a2f06 100644 --- a/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js +++ b/ash/webui/projector_app/resources/app/trusted/projector_browser_proxy.js
@@ -60,21 +60,6 @@ accountEmail) {} /** - * Returns true if the "install speech recognition" button should be shown to - * the user. - * @return {!Promise<boolean>} - */ - shouldDownloadSoda() {} - - /** - * Triggers the installation of on device speech recognition binary and - * language packs for the user's locale. Returns true if download and - * installation started. - * @return {!Promise<boolean>} - */ - installSoda() {} - - /** * Gets the list of pending screencasts that are uploading to drive. * @return {Promise<Array<projectorApp.PendingScreencast>>} */ @@ -172,16 +157,6 @@ } /** @override */ - shouldDownloadSoda() { - return sendWithPromise('shouldDownloadSoda'); - } - - /** @override */ - installSoda() { - return sendWithPromise('installSoda'); - } - - /** @override */ getPendingScreencasts() { return sendWithPromise('getPendingScreencasts'); }
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 cafe5a4..cd9a7e8 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
@@ -20,30 +20,6 @@ } /** - * Notifies the Projector App the download and installation progress of the - * SODA binary and language packs. - * @param {number} progress A number in range 0 -100 indicating installation - * progress. - */ - onSodaInstallProgressUpdated(progress) { - return this.callApiFn('onSodaInstallProgressUpdated', [progress]); - } - - /** - * Notifies the Projector App when SODA download and installation is complete. - */ - onSodaInstalled() { - return this.callApiFn('onSodaInstalled', []); - } - - /** - * Notifies the Projector App when there is a SODA installation error. - */ - onSodaInstallError() { - return this.callApiFn('onSodaInstallError', []); - } - - /** * Notfies the app when screencasts' pending state have changed. * @param {!Array<!projectorApp.PendingScreencast>} pendingScreencasts */ @@ -106,12 +82,6 @@ values[0], values[1], values[2], values[3], values[4], values[5], values[6]); }); - this.registerMethod('shouldDownloadSoda', (args) => { - return this.browserProxy_.shouldDownloadSoda(); - }); - this.registerMethod('installSoda', (args) => { - return this.browserProxy_.installSoda(); - }); this.registerMethod('getPendingScreencasts', (args) => { return this.browserProxy_.getPendingScreencasts(); });
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 347aa9f9..fbd9443 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
@@ -151,8 +151,7 @@ * @return {!Promise<boolean>} */ shouldDownloadSoda() { - return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( - 'shouldDownloadSoda', []); + return browserProxy.shouldDownloadSoda(); }, /** @@ -162,8 +161,7 @@ * @return {!Promise<boolean>} */ installSoda() { - return AppUntrustedCommFactory.getPostMessageAPIClient().callApiFn( - 'installSoda', []); + return browserProxy.installSoda(); }, /** @@ -252,20 +250,17 @@ error); } }); - - this.registerMethod('onSodaInstallProgressUpdated', (args) => { - if (args.length !== 1 || isNaN(args[0])) { - return; - } - - getAppElement().onSodaInstallProgressUpdated(args[0]); - }); - this.registerMethod('onSodaInstalled', (args) => { - getAppElement().onSodaInstalled(); - }); - this.registerMethod('onSodaInstallError', (args) => { + this.callbackRouter_.onSodaInstallProgressUpdated.addListener( + (progress) => { + getAppElement().onSodaInstallProgressUpdated(progress); + }); + this.callbackRouter_.onSodaInstallError.addListener(() => { getAppElement().onSodaInstallError(); }); + this.callbackRouter_.onSodaInstalled.addListener(() => { + getAppElement().onSodaInstalled(); + }); + this.registerMethod('onScreencastsStateChange', (pendingScreencasts) => { getAppElement().onScreencastsStateChange(pendingScreencasts); });
diff --git a/ash/webui/projector_app/resources/app/untrusted/untrusted_projector_browser_proxy.js b/ash/webui/projector_app/resources/app/untrusted/untrusted_projector_browser_proxy.js index 43f263c..fd8bc26 100644 --- a/ash/webui/projector_app/resources/app/untrusted/untrusted_projector_browser_proxy.js +++ b/ash/webui/projector_app/resources/app/untrusted/untrusted_projector_browser_proxy.js
@@ -23,6 +23,16 @@ await this.pageHandlerRemote.getNewScreencastPrecondition(); return precondition; } + + async shouldDownloadSoda() { + const {shouldDownload} = await this.pageHandlerRemote.shouldDownloadSoda(); + return shouldDownload; + } + + async installSoda() { + const {triggered} = await this.pageHandlerRemote.installSoda(); + return triggered; + } } /**
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 f0264847..1b99af7 100644 --- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc +++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -46,13 +46,8 @@ const char kStartProjectorSessionCallback[] = "startProjectorSessionCallback"; const char kGetOAuthTokenCallback[] = "getOAuthTokenCallback"; const char kSendXhrCallback[] = "sendXhrCallback"; -const char kOnSodaInstallProgressUpdated[] = "onSodaInstallProgressUpdated"; -const char kOnSodaInstalled[] = "onSodaInstalled"; -const char kOnSodaInstallError[] = "onSodaInstallError"; const char kGetVideoCallback[] = "getVideoCallback"; -const char kShouldDownloadSodaCallback[] = "shouldDownloadSodaCallbck"; -const char kInstallSodaCallback[] = "installSodaCallback"; const char kGetPendingScreencastsCallback[] = "getPendingScreencastsCallback"; const char kOpenFeedbackDialogCallback[] = "openFeedbackDialog"; @@ -408,61 +403,6 @@ EXPECT_EQ("UNSUPPORTED_URL", *error); } -TEST_F(ProjectorMessageHandlerUnitTest, OnSodaProgress) { - static_cast<ProjectorAppClient::Observer*>(message_handler()) - ->OnSodaProgress(50); - const content::TestWebUI::CallData& call_data = FetchCallData(0); - EXPECT_EQ(call_data.function_name(), kWebUIListenerCall); - EXPECT_EQ(call_data.arg1()->GetString(), kOnSodaInstallProgressUpdated); - EXPECT_EQ(call_data.arg2()->GetInt(), 50); -} - -TEST_F(ProjectorMessageHandlerUnitTest, OnSodaInstalled) { - static_cast<ProjectorAppClient::Observer*>(message_handler()) - ->OnSodaInstalled(); - const content::TestWebUI::CallData& call_data = FetchCallData(0); - EXPECT_EQ(call_data.function_name(), kWebUIListenerCall); - EXPECT_EQ(call_data.arg1()->GetString(), kOnSodaInstalled); -} - -TEST_F(ProjectorMessageHandlerUnitTest, OnSodaError) { - static_cast<ProjectorAppClient::Observer*>(message_handler())->OnSodaError(); - const content::TestWebUI::CallData& call_data = FetchCallData(0); - EXPECT_EQ(call_data.function_name(), kWebUIListenerCall); - EXPECT_EQ(call_data.arg1()->GetString(), kOnSodaInstallError); -} - -TEST_F(ProjectorMessageHandlerUnitTest, ShouldDownloadSoda) { - ON_CALL(mock_app_client(), ShouldDownloadSoda()) - .WillByDefault(testing::Return(true)); - - base::Value::List list_args; - list_args.Append(base::Value(kShouldDownloadSodaCallback)); - - web_ui().HandleReceivedMessage("shouldDownloadSoda", list_args); - - const content::TestWebUI::CallData& call_data = FetchCallData(0); - EXPECT_EQ(call_data.function_name(), kWebUIResponse); - EXPECT_EQ(call_data.arg1()->GetString(), kShouldDownloadSodaCallback); - EXPECT_EQ(call_data.arg2()->GetBool(), true); - EXPECT_EQ(call_data.arg3()->GetBool(), true); -} - -TEST_F(ProjectorMessageHandlerUnitTest, InstallSoda) { - ON_CALL(mock_app_client(), InstallSoda()).WillByDefault(testing::Return()); - - base::Value::List list_args; - list_args.Append(base::Value(kInstallSodaCallback)); - - web_ui().HandleReceivedMessage("installSoda", list_args); - - const content::TestWebUI::CallData& call_data = FetchCallData(0); - EXPECT_EQ(call_data.function_name(), kWebUIResponse); - EXPECT_EQ(call_data.arg1()->GetString(), kInstallSodaCallback); - EXPECT_EQ(call_data.arg2()->GetBool(), true); - EXPECT_EQ(call_data.arg3()->GetBool(), true); -} - TEST_F(ProjectorMessageHandlerUnitTest, GetPendingScreencasts) { const std::string name = "test_pending_screecast"; const std::string path = "/root/projector_data/test_pending_screecast";
diff --git a/ash/webui/projector_app/test/untrusted_projector_page_handler_impl_unittest.cc b/ash/webui/projector_app/test/untrusted_projector_page_handler_impl_unittest.cc index 4a75e93..b36c1a3 100644 --- a/ash/webui/projector_app/test/untrusted_projector_page_handler_impl_unittest.cc +++ b/ash/webui/projector_app/test/untrusted_projector_page_handler_impl_unittest.cc
@@ -11,6 +11,7 @@ #include "ash/webui/projector_app/test/mock_app_client.h" #include "base/test/bind.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "testing/gmock/include/gmock/gmock.h" @@ -33,6 +34,9 @@ MOCK_METHOD1( OnNewScreencastPreconditionChanged, void(ash::projector::mojom::NewScreencastPreconditionPtr precondition)); + MOCK_METHOD1(OnSodaInstallProgressUpdated, void(int32_t)); + MOCK_METHOD0(OnSodaInstalled, void()); + MOCK_METHOD0(OnSodaInstallError, void()); void FlushReceiverForTesting() { receiver_.FlushForTesting(); } @@ -77,6 +81,7 @@ MockProjectorController& controller() { return mock_controller_; } MockUntrustedProjectorPageJs& page() { return *page_; } UntrustedProjectorPageHandlerImpl& handler() { return *handler_impl_; } + MockAppClient& mock_app_client() { return mock_app_client_; } private: base::test::SingleThreadTaskEnvironment task_environment_; @@ -95,21 +100,19 @@ ON_CALL(controller(), GetNewScreencastPrecondition) .WillByDefault(testing::Return(precondition)); - base::RunLoop runloop; - page().page_handler()->GetNewScreencastPrecondition( - base::BindLambdaForTesting( - [&](projector::mojom::NewScreencastPreconditionPtr precondition) { - EXPECT_EQ( - precondition->state, - projector::mojom::NewScreencastPreconditionState::kEnabled); - EXPECT_EQ(precondition->reasons.size(), 1u); - EXPECT_EQ(precondition->reasons[0], - projector::mojom::NewScreencastPreconditionReason:: - kEnabledBySoda); - runloop.Quit(); - })); + base::test::TestFuture<projector::mojom::NewScreencastPreconditionPtr> + new_screencast_precondition_future; - runloop.Run(); + page().page_handler()->GetNewScreencastPrecondition( + new_screencast_precondition_future.GetCallback()); + + const projector::mojom::NewScreencastPreconditionPtr& result = + new_screencast_precondition_future.Get(); + EXPECT_EQ(result->state, + projector::mojom::NewScreencastPreconditionState::kEnabled); + EXPECT_EQ(result->reasons.size(), 1u); + EXPECT_EQ(result->reasons[0], + projector::mojom::NewScreencastPreconditionReason::kEnabledBySoda); } TEST_F(UntrustedProjectorPageHandlerImplUnitTest, @@ -122,4 +125,38 @@ page().FlushReceiverForTesting(); } +TEST_F(UntrustedProjectorPageHandlerImplUnitTest, OnSodaProgress) { + EXPECT_CALL(page(), OnSodaInstallProgressUpdated(50)).Times(1); + handler().OnSodaProgress(50); + page().FlushReceiverForTesting(); +} + +TEST_F(UntrustedProjectorPageHandlerImplUnitTest, OnSodaInstalled) { + EXPECT_CALL(page(), OnSodaInstalled()).Times(1); + handler().OnSodaInstalled(); + page().FlushReceiverForTesting(); +} + +TEST_F(UntrustedProjectorPageHandlerImplUnitTest, OnSodaError) { + EXPECT_CALL(page(), OnSodaInstallError()).Times(1); + handler().OnSodaError(); + page().FlushReceiverForTesting(); +} + +TEST_F(UntrustedProjectorPageHandlerImplUnitTest, ShouldDownloadSoda) { + ON_CALL(mock_app_client(), ShouldDownloadSoda()) + .WillByDefault(testing::Return(true)); + base::test::TestFuture<bool> should_download_soda_future; + page().page_handler()->ShouldDownloadSoda( + should_download_soda_future.GetCallback()); + EXPECT_TRUE(should_download_soda_future.Get()); +} + +TEST_F(UntrustedProjectorPageHandlerImplUnitTest, InstallSoda) { + ON_CALL(mock_app_client(), InstallSoda()).WillByDefault(testing::Return()); + base::test::TestFuture<bool> install_triggered_future; + page().page_handler()->InstallSoda(install_triggered_future.GetCallback()); + EXPECT_TRUE(install_triggered_future.Get()); +} + } // namespace ash
diff --git a/ash/webui/projector_app/untrusted_projector_page_handler_impl.cc b/ash/webui/projector_app/untrusted_projector_page_handler_impl.cc index 357b152..9b6eb7f 100644 --- a/ash/webui/projector_app/untrusted_projector_page_handler_impl.cc +++ b/ash/webui/projector_app/untrusted_projector_page_handler_impl.cc
@@ -48,6 +48,18 @@ projector_remote_->OnNewScreencastPreconditionChanged(ToMojom(precondition)); } +void UntrustedProjectorPageHandlerImpl::OnSodaProgress(int progress) { + projector_remote_->OnSodaInstallProgressUpdated(progress); +} + +void UntrustedProjectorPageHandlerImpl::OnSodaError() { + projector_remote_->OnSodaInstallError(); +} + +void UntrustedProjectorPageHandlerImpl::OnSodaInstalled() { + projector_remote_->OnSodaInstalled(); +} + void UntrustedProjectorPageHandlerImpl::GetNewScreencastPrecondition( projector::mojom::UntrustedProjectorPageHandler:: GetNewScreencastPreconditionCallback callback) { @@ -55,4 +67,18 @@ ToMojom(ProjectorController::Get()->GetNewScreencastPrecondition())); } +void UntrustedProjectorPageHandlerImpl::ShouldDownloadSoda( + projector::mojom::UntrustedProjectorPageHandler::ShouldDownloadSodaCallback + callback) { + bool should_download = ProjectorAppClient::Get()->ShouldDownloadSoda(); + std::move(callback).Run(should_download); +} +void UntrustedProjectorPageHandlerImpl::InstallSoda( + projector::mojom::UntrustedProjectorPageHandler::InstallSodaCallback + callback) { + ProjectorAppClient::Get()->InstallSoda(); + // We have successfully triggered the request. + std::move(callback).Run(/*triggered=*/true); +} + } // namespace ash
diff --git a/ash/webui/projector_app/untrusted_projector_page_handler_impl.h b/ash/webui/projector_app/untrusted_projector_page_handler_impl.h index a8063738..50aed42 100644 --- a/ash/webui/projector_app/untrusted_projector_page_handler_impl.h +++ b/ash/webui/projector_app/untrusted_projector_page_handler_impl.h
@@ -34,11 +34,19 @@ // ProjectorAppClient:Observer: void OnNewScreencastPreconditionChanged( const NewScreencastPrecondition& precondition) override; + void OnSodaProgress(int percentage) override; + void OnSodaError() override; + void OnSodaInstalled() override; // projector::mojom::UntrustedProjectorPageHandler: void GetNewScreencastPrecondition( projector::mojom::UntrustedProjectorPageHandler:: GetNewScreencastPreconditionCallback callback) override; + void ShouldDownloadSoda(projector::mojom::UntrustedProjectorPageHandler:: + ShouldDownloadSodaCallback callback) override; + void InstallSoda( + projector::mojom::UntrustedProjectorPageHandler::InstallSodaCallback + callback) override; private: mojo::Receiver<projector::mojom::UntrustedProjectorPageHandler> receiver_;
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc index 57cade3..016323c 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -333,7 +333,16 @@ EXPECT_EQ(0, observer_.num_times_notified()); non_configurable_actions_map_ = provider_->GetNonConfigurableAcceleratorsForTesting(); + fake_keyboard_manager_ = std::make_unique<FakeDeviceManager>(); + // Add a fake layout2 keyboard. + ui::InputDevice fake_keyboard( + /*id=*/1, /*type=*/ui::InputDeviceType::INPUT_DEVICE_BLUETOOTH, + /*name=*/"fake_Keyboard"); + fake_keyboard.sys_path = base::FilePath("path1"); + fake_keyboard_manager_->AddFakeKeyboard(fake_keyboard, + kKbdTopRowLayout2Tag); + provider_->ignore_layouts_for_testing_ = true; base::RunLoop().RunUntilIdle(); // After adding a fake keyboard, clear the observer call count. @@ -342,6 +351,7 @@ } void TearDown() override { + fake_keyboard_manager_->RemoveAllDevices(); provider_->RemoveObserver(&observer_); // `provider_` has a dependency on `input_method_manager_`. provider_.reset(); @@ -503,11 +513,16 @@ } TEST_F(AcceleratorConfigurationProviderTest, ConnectedKeyboardsUpdated) { + // Ensure there are no keyboards plugged in at first. + ui::DeviceDataManagerTestApi().SetKeyboardDevices({}); FakeAcceleratorsUpdatedMojoObserver mojo_observer; SetUpObserver(&mojo_observer); EXPECT_EQ(0, mojo_observer.num_times_notified()); + const std::vector<ui::InputDevice>& actual_devices = GetConnectedKeyboards(); + EXPECT_EQ(0u, actual_devices.size()); + ui::InputDevice expected_test_keyboard( 1, ui::InputDeviceType::INPUT_DEVICE_INTERNAL, "Keyboard"); @@ -516,8 +531,8 @@ ui::DeviceDataManagerTestApi().SetKeyboardDevices(keyboard_devices); - const std::vector<ui::InputDevice>& actual_devices = GetConnectedKeyboards(); - EXPECT_EQ(1u, actual_devices.size()); + const std::vector<ui::InputDevice>& actual_devices2 = GetConnectedKeyboards(); + EXPECT_EQ(1u, actual_devices2.size()); CompareInputDevices(expected_test_keyboard, actual_devices[0]); base::RunLoop().RunUntilIdle(); @@ -1007,7 +1022,7 @@ // Initialize with all custom accelerators. const AcceleratorData test_data[] = { {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, - TOGGLE_MIRROR_MODE}, + SWITCH_TO_NEXT_IME}, }; AshAcceleratorConfiguration* config = Shell::Get()->ash_accelerator_configuration(); @@ -1020,7 +1035,7 @@ // Remove the accelerator. provider_->RemoveAccelerator( - mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE, + mojom::AcceleratorSource::kAsh, SWITCH_TO_NEXT_IME, ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN), base::BindLambdaForTesting([&](AcceleratorResultDataPtr result) { EXPECT_EQ(AcceleratorConfigResult::kSuccess, result->result); @@ -1030,7 +1045,7 @@ config->GetAllAccelerators(); EXPECT_EQ(0u, updated_accelerators.size()); - // Now verify that removing the default for `TOGGLE_MIRROR_MODE` will + // Now verify that removing the default for `SWITCH_TO_NEXT_IME` will // only disable it from the config. base::RunLoop().RunUntilIdle(); AcceleratorConfigurationProvider::AcceleratorConfigurationMap @@ -1038,7 +1053,7 @@ ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data, actual_config); std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone( - actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE])); + actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME])); EXPECT_EQ(1u, actual_infos.size()); // A disabled default accelerator should be marked as `kDisabledByUser`. EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, @@ -1103,7 +1118,7 @@ // Initialize with all custom accelerators. const AcceleratorData test_data[] = { {/*trigger_on_press=*/true, ui::VKEY_SPACE, ui::EF_CONTROL_DOWN, - TOGGLE_MIRROR_MODE}, + SWITCH_TO_NEXT_IME}, }; AshAcceleratorConfiguration* config = Shell::Get()->ash_accelerator_configuration(); @@ -1120,7 +1135,7 @@ ash::shortcut_customization::mojom:: AcceleratorConfigurationProviderAsyncWaiter(provider_.get()) .RemoveAccelerator( - mojom::AcceleratorSource::kAsh, TOGGLE_MIRROR_MODE, + mojom::AcceleratorSource::kAsh, SWITCH_TO_NEXT_IME, ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN), &result); EXPECT_EQ(AcceleratorConfigResult::kSuccess, result->result); EXPECT_FALSE(result->shortcut_name.has_value()); @@ -1129,7 +1144,7 @@ config->GetAllAccelerators(); EXPECT_EQ(0u, updated_accelerators.size()); - // Now verify that removing the default for `TOGGLE_MIRROR_MODE` will + // Now verify that removing the default for `SWITCH_TO_NEXT_IME` will // only disable it from the config. base::RunLoop().RunUntilIdle(); AcceleratorConfigurationProvider::AcceleratorConfigurationMap actual_config = @@ -1137,7 +1152,7 @@ ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data, actual_config); std::vector<mojom::AcceleratorInfoPtr> actual_infos(mojo::Clone( - actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE])); + actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME])); EXPECT_EQ(1u, actual_infos.size()); // A disabled default accelerator should be marked as `kDisabledByUser`. EXPECT_EQ(mojom::AcceleratorState::kDisabledByUser, actual_infos[0]->state); @@ -1160,7 +1175,7 @@ ExpectMojomAcceleratorsEqual(mojom::AcceleratorSource::kAsh, test_data, actual_config); actual_infos = mojo::Clone( - actual_config[mojom::AcceleratorSource::kAsh][TOGGLE_MIRROR_MODE]); + actual_config[mojom::AcceleratorSource::kAsh][SWITCH_TO_NEXT_IME]); EXPECT_EQ(1u, actual_infos.size()); // Resetting to default will reset it back to `kEnabled`. EXPECT_EQ(mojom::AcceleratorState::kEnabled, actual_infos[0]->state);
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc index 238fed6..f6667929 100644 --- a/ash/wm/splitview/split_view_controller.cc +++ b/ash/wm/splitview/split_view_controller.cc
@@ -21,6 +21,7 @@ #include "ash/shell.h" #include "ash/style/ash_color_provider.h" #include "ash/wm/desks/desks_controller.h" +#include "ash/wm/float/float_controller.h" #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/delayed_animation_observer_impl.h" #include "ash/wm/overview/overview_controller.h" @@ -432,8 +433,10 @@ return; // Already un-minimized windows are not applicable for auto snapping. - if (!WindowState::Get(window) || !WindowState::Get(window)->IsMinimized()) + if (auto* window_state = WindowState::Get(window); + !window_state || !window_state->IsMinimized()) { return; + } // Visibility changes while restoring windows after dragged is transient // hide & show operations so not applicable for auto snapping. @@ -468,6 +471,14 @@ return; } + // If `window` is floated on top of 2 already snapped windows (this can + // happen after floating a window, starting split view, and activating + // an unfloated window from overview), don't snap. + if (WindowState::Get(window)->IsFloated() && + split_view_controller_->BothSnapped()) { + return; + } + if (DesksController::Get()->AreDesksBeingModified()) { // Activating a desk from its mini view will activate its most-recently // used window, but this should not result in snapping and ending overview @@ -3056,6 +3067,11 @@ if (GetOverviewSession() && GetOverviewSession()->IsWindowInOverview(window)) return; + if (WindowState::Get(window)->IsFloated()) { + // If a floated window was dragged from shelf and released, don't snap. + return; + } + DCHECK_EQ(root_window_, window->GetRootWindow()); const bool was_splitview_active = InSplitViewMode();
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc index 8cdd52b2..d197f481 100644 --- a/ash/wm/splitview/split_view_controller_unittest.cc +++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -36,6 +36,7 @@ #include "ash/wallpaper/wallpaper_widget_controller.h" #include "ash/wm/desks/desks_util.h" #include "ash/wm/drag_window_resizer.h" +#include "ash/wm/float/float_controller.h" #include "ash/wm/mru_window_tracker.h" #include "ash/wm/overview/overview_controller.h" #include "ash/wm/overview/overview_grid.h" @@ -61,6 +62,7 @@ #include "base/test/scoped_feature_list.h" #include "chromeos/ui/base/window_properties.h" #include "chromeos/ui/frame/caption_buttons/snap_controller.h" +#include "chromeos/ui/wm/features.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/test/test_windows.h" @@ -1490,6 +1492,52 @@ EXPECT_TRUE(wm::IsActiveWindow(window2.get())); } +// Tests that the floated window is not auto-snapped if it's on top of two +// snapped windows. It should only get snapped if it's activated from overview. +TEST_F(SplitViewControllerTest, DontAutosnapFloatedWindow) { + base::test::ScopedFeatureList scoped_feature_list( + chromeos::wm::features::kWindowLayoutMenu); + + // Create 2 normal windows and 1 floated window. + std::unique_ptr<aura::Window> window1(CreateAppWindow()); + std::unique_ptr<aura::Window> window2(CreateAppWindow()); + std::unique_ptr<aura::Window> floated_window(CreateAppWindow()); + Shell::Get()->float_controller()->ToggleFloat(floated_window.get()); + ASSERT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); + + // Snap `window1` so that Overview is open. + split_view_controller()->SnapWindow( + window1.get(), SplitViewController::SnapPosition::kPrimary); + auto* overview_controller = Shell::Get()->overview_controller(); + ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + auto* overview_session = overview_controller->overview_session(); + ASSERT_TRUE(overview_session->IsWindowInOverview(window2.get())); + ASSERT_TRUE(overview_session->IsWindowInOverview(floated_window.get())); + + // Activate `window2` from Overview. Test that it gets snapped in splitview, + // and `floated_window` remains floated. + wm::ActivateWindow(window2.get()); + EXPECT_TRUE(split_view_controller()->IsWindowInSplitView(window2.get())); + wm::ActivateWindow(floated_window.get()); + EXPECT_FALSE( + split_view_controller()->IsWindowInSplitView(floated_window.get())); + EXPECT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); + + // Snap `window1` again, then activate `floated_window` from Overview. Test + // that it gets snapped in splitview. + EndSplitView(); + EXPECT_TRUE(WindowState::Get(floated_window.get())->IsFloated()); + split_view_controller()->SnapWindow( + window1.get(), SplitViewController::SnapPosition::kPrimary); + EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); + overview_session = overview_controller->overview_session(); + EXPECT_TRUE(overview_session->IsWindowInOverview(floated_window.get())); + wm::ActivateWindow(floated_window.get()); + EXPECT_TRUE( + split_view_controller()->IsWindowInSplitView(floated_window.get())); + EXPECT_FALSE(WindowState::Get(floated_window.get())->IsFloated()); +} + // Verify that you cannot start dragging the divider during its snap animation. TEST_F(SplitViewControllerTest, StartDraggingDividerDuringSnapAnimation) { const gfx::Rect bounds(0, 0, 400, 400);
diff --git a/base/BUILD.gn b/base/BUILD.gn index de465c10..df71fc2 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -4547,6 +4547,7 @@ "test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java", "test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java", "test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java", + "test/android/javatests/src/org/chromium/base/test/util/TestThreadUtils.java", "test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java", "test/android/javatests/src/org/chromium/base/test/util/TimeoutTimer.java", "test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java",
diff --git a/base/allocator/partition_alloc_features.cc b/base/allocator/partition_alloc_features.cc index f8c7f91..a68a4bb3 100644 --- a/base/allocator/partition_alloc_features.cc +++ b/base/allocator/partition_alloc_features.cc
@@ -168,7 +168,6 @@ const base::FeatureParam<AlternateBucketDistributionMode>::Option kPartitionAllocAlternateDistributionOption[] = { {AlternateBucketDistributionMode::kDefault, "default"}, - {AlternateBucketDistributionMode::kCoarser, "coarser"}, {AlternateBucketDistributionMode::kDenser, "denser"}, }; const base::FeatureParam<AlternateBucketDistributionMode>
diff --git a/base/allocator/partition_alloc_features.h b/base/allocator/partition_alloc_features.h index 567348b..ebfd38e9 100644 --- a/base/allocator/partition_alloc_features.h +++ b/base/allocator/partition_alloc_features.h
@@ -110,7 +110,6 @@ enum class AlternateBucketDistributionMode : uint8_t { kDefault, - kCoarser, kDenser, };
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index 807ad848..010497b 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -240,9 +240,6 @@ BucketDistribution distribution) { switch (distribution) { case BucketDistribution::kDefault: - root->SwitchToDefaultBucketDistribution(); - break; - case BucketDistribution::kCoarser: root->ResetBucketDistributionForTesting(); break; case BucketDistribution::kDenser: @@ -298,12 +295,10 @@ const std::vector<PartitionAllocTestParam> GetPartitionAllocTestParams() { std::vector<PartitionAllocTestParam> params; params.emplace_back(BucketDistribution::kDefault, false); - params.emplace_back(BucketDistribution::kCoarser, false); params.emplace_back(BucketDistribution::kDenser, false); #if BUILDFLAG(ENABLE_PKEYS) if (CPUHasPkeySupport()) { params.emplace_back(BucketDistribution::kDefault, true); - params.emplace_back(BucketDistribution::kCoarser, true); params.emplace_back(BucketDistribution::kDenser, true); } #endif
diff --git a/base/allocator/partition_allocator/partition_bucket_lookup.h b/base/allocator/partition_allocator/partition_bucket_lookup.h index ff2b997..127ae31 100644 --- a/base/allocator/partition_allocator/partition_bucket_lookup.h +++ b/base/allocator/partition_allocator/partition_bucket_lookup.h
@@ -106,9 +106,10 @@ // The class used to generate the bucket lookup table at compile-time. class BucketIndexLookup final { public: + PA_ALWAYS_INLINE static constexpr uint16_t GetIndexForDefaultBuckets( + size_t size); PA_ALWAYS_INLINE static constexpr uint16_t GetIndexForDenserBuckets( size_t size); - PA_ALWAYS_INLINE static constexpr uint16_t GetIndexFor8Buckets(size_t size); PA_ALWAYS_INLINE static constexpr uint16_t GetIndex(size_t size); constexpr BucketIndexLookup() { @@ -229,7 +230,7 @@ } // static -PA_ALWAYS_INLINE constexpr uint16_t BucketIndexLookup::GetIndexFor8Buckets( +PA_ALWAYS_INLINE constexpr uint16_t BucketIndexLookup::GetIndexForDenserBuckets( size_t size) { // This forces the bucket table to be constant-initialized and immediately // materialized in the binary. @@ -251,9 +252,9 @@ } // static -PA_ALWAYS_INLINE constexpr uint16_t BucketIndexLookup::GetIndexForDenserBuckets( - size_t size) { - const auto index = GetIndexFor8Buckets(size); +PA_ALWAYS_INLINE constexpr uint16_t +BucketIndexLookup::GetIndexForDefaultBuckets(size_t size) { + const auto index = GetIndexForDenserBuckets(size); // Below the minimum size, 4 and 8 bucket distributions are the same, since we // can't fit any more buckets per order; this is due to alignment // requirements: each bucket must be a multiple of the alignment, which @@ -264,7 +265,7 @@ // // We also do not want to go about the index for the max bucketed size. if (size > kAlignment * kNumBucketsPerOrder && - index < GetIndexFor8Buckets(kMaxBucketed)) { + index < GetIndexForDenserBuckets(kMaxBucketed)) { return RoundUpToOdd(index); } else { return index; @@ -292,9 +293,9 @@ // So, an allocation of size 1.4*2^10 would go into the 1.5*2^10 bucket under // Distribution A, but to the 2^11 bucket under Distribution B. if (1 << 8 < size && size < kHighThresholdForAlternateDistribution) { - return BucketIndexLookup::GetIndexForDenserBuckets(RoundUpSize(size)); + return BucketIndexLookup::GetIndexForDefaultBuckets(RoundUpSize(size)); } - return BucketIndexLookup::GetIndexForDenserBuckets(size); + return BucketIndexLookup::GetIndexForDefaultBuckets(size); } } // namespace partition_alloc::internal
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index d4124a2..c52453fc 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -258,7 +258,7 @@ kEnabled, }; - enum class BucketDistribution : uint8_t { kDefault, kCoarser, kDenser }; + enum class BucketDistribution : uint8_t { kDefault, kDenser }; // Flags accessed on fast paths. // @@ -272,11 +272,11 @@ // Defines whether the root should be scanned. ScanMode scan_mode; - // It's important to default to the coarser distribution, otherwise a switch - // from dense -> coarse would leave some buckets with dirty memory forever, - // since no memory would be allocated from these, their freelist would - // typically not be empty, making these unreclaimable. - BucketDistribution bucket_distribution = BucketDistribution::kCoarser; + // It's important to default to the 'default' distribution, otherwise a + // switch from 'dense' -> 'default' would leave some buckets with dirty + // memory forever, since no memory would be allocated from these, their + // freelist would typically not be empty, making these unreclaimable. + BucketDistribution bucket_distribution = BucketDistribution::kDefault; bool with_thread_cache = false; @@ -608,10 +608,7 @@ // This is safe to do because we are switching to a bucket distribution with // more buckets, meaning any allocations we have done before the switch are // guaranteed to have a bucket under the new distribution when they are - // eventually deallocated. We do not need synchronization here or below. - void SwitchToDefaultBucketDistribution() { - flags.bucket_distribution = BucketDistribution::kDefault; - } + // eventually deallocated. We do not need synchronization here. void SwitchToDenserBucketDistribution() { flags.bucket_distribution = BucketDistribution::kDenser; } @@ -620,7 +617,7 @@ // cannot allocate from, which will not cause problems besides wasting // memory. void ResetBucketDistributionForTesting() { - flags.bucket_distribution = BucketDistribution::kCoarser; + flags.bucket_distribution = BucketDistribution::kDefault; } ThreadCache* thread_cache_for_testing() const { @@ -1808,11 +1805,9 @@ BucketDistribution bucket_distribution) { switch (bucket_distribution) { case BucketDistribution::kDefault: - return internal::BucketIndexLookup::GetIndexForDenserBuckets(size); - case BucketDistribution::kCoarser: - return internal::BucketIndexLookup::GetIndex(size); + return internal::BucketIndexLookup::GetIndexForDefaultBuckets(size); case BucketDistribution::kDenser: - return internal::BucketIndexLookup::GetIndexFor8Buckets(size); + return internal::BucketIndexLookup::GetIndexForDenserBuckets(size); } }
diff --git a/base/allocator/partition_allocator/shim/allocator_shim.h b/base/allocator/partition_allocator/shim/allocator_shim.h index 1d5a6e8..6d946c7f 100644 --- a/base/allocator/partition_allocator/shim/allocator_shim.h +++ b/base/allocator/partition_allocator/shim/allocator_shim.h
@@ -167,14 +167,6 @@ BASE_EXPORT void TryFreeDefaultFallbackToFindZoneAndFree(void* ptr); #endif // BUILDFLAG(IS_APPLE) -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && BUILDFLAG(IS_WIN) -// Configures the allocator for the caller's allocation domain. Allocations that -// take place prior to this configuration step will succeed, but will not -// benefit from its one-time mitigations. As such, this function must be called -// as early as possible during startup. -BASE_EXPORT void ConfigurePartitionAlloc(); -#endif // BUILDFLAG(IS_WIN) - #if BUILDFLAG(IS_APPLE) #if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) BASE_EXPORT void InitializeDefaultAllocatorPartitionRoot();
diff --git a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc index 9804fff3..4f7a87d 100644 --- a/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/partition_allocator/shim/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -35,10 +35,6 @@ #include <malloc.h> #endif -#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) -#include <windows.h> -#endif - using allocator_shim::AllocatorDispatch; namespace { @@ -202,42 +198,6 @@ return g_aligned_root.Get(); } -#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) -#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) -bool IsRunning32bitEmulatedOnArm64() { - using IsWow64Process2Function = decltype(&IsWow64Process2); - - IsWow64Process2Function is_wow64_process2 = - reinterpret_cast<IsWow64Process2Function>(::GetProcAddress( - ::GetModuleHandleA("kernel32.dll"), "IsWow64Process2")); - if (!is_wow64_process2) - return false; - USHORT process_machine; - USHORT native_machine; - bool retval = is_wow64_process2(::GetCurrentProcess(), &process_machine, - &native_machine); - if (!retval) - return false; - if (native_machine == IMAGE_FILE_MACHINE_ARM64) - return true; - return false; -} -#endif // BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - -// The number of bytes to add to every allocation. Ordinarily zero, but set to 8 -// when emulating an x86 on ARM64 to avoid a bug in the Windows x86 emulator. -size_t g_extra_bytes; -#endif // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) - -// TODO(brucedawson): Remove this when https://crbug.com/1151455 is fixed. -PA_ALWAYS_INLINE size_t MaybeAdjustSize(size_t size) { -#if BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) - return base::CheckAdd(size, g_extra_bytes).ValueOrDie(); -#else // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) - return size; -#endif // BUILDFLAG(IS_WIN) && defined(ARCH_CPU_X86) -} - void* AllocateAlignedMemory(size_t alignment, size_t size) { // Memory returned by the regular allocator *always* respects |kAlignment|, // which is a power of two, and any valid alignment is also a power of two. So @@ -300,8 +260,7 @@ void* PartitionMalloc(const AllocatorDispatch*, size_t size, void* context) { partition_alloc::ScopedDisallowAllocations guard{}; return Allocator()->AllocWithFlagsNoHooks( - g_alloc_flags, MaybeAdjustSize(size), - partition_alloc::PartitionPageSize()); + g_alloc_flags, size, partition_alloc::PartitionPageSize()); } void* PartitionMallocUnchecked(const AllocatorDispatch*, @@ -309,8 +268,8 @@ void* context) { partition_alloc::ScopedDisallowAllocations guard{}; return Allocator()->AllocWithFlagsNoHooks( - partition_alloc::AllocFlags::kReturnNull | g_alloc_flags, - MaybeAdjustSize(size), partition_alloc::PartitionPageSize()); + partition_alloc::AllocFlags::kReturnNull | g_alloc_flags, size, + partition_alloc::PartitionPageSize()); } void* PartitionCalloc(const AllocatorDispatch*, @@ -319,8 +278,7 @@ void* context) { partition_alloc::ScopedDisallowAllocations guard{}; const size_t total = - partition_alloc::internal::base::CheckMul(n, MaybeAdjustSize(size)) - .ValueOrDie(); + partition_alloc::internal::base::CheckMul(n, size).ValueOrDie(); return Allocator()->AllocWithFlagsNoHooks( partition_alloc::AllocFlags::kZeroFill | g_alloc_flags, total, partition_alloc::PartitionPageSize()); @@ -357,7 +315,6 @@ partition_alloc::ScopedDisallowAllocations guard{}; void* new_ptr = nullptr; if (size > 0) { - size = MaybeAdjustSize(size); new_ptr = AllocateAlignedMemory(alignment, size); } else { // size == 0 and address != null means just "free(address)". @@ -397,8 +354,7 @@ #endif // BUILDFLAG(IS_APPLE) return Allocator()->ReallocWithFlags( - partition_alloc::AllocFlags::kNoHooks | g_alloc_flags, address, - MaybeAdjustSize(size), ""); + partition_alloc::AllocFlags::kNoHooks | g_alloc_flags, address, size, ""); } #if BUILDFLAG(IS_CAST_ANDROID) @@ -612,11 +568,7 @@ if (!split_main_partition) { switch (use_alternate_bucket_distribution) { case AlternateBucketDistribution::kDefault: - current_root->SwitchToDefaultBucketDistribution(); - current_aligned_root->SwitchToDefaultBucketDistribution(); - break; - case AlternateBucketDistribution::kCoarser: - // We are already using the coarse distribution when we create a root. + // We start in the 'default' case. break; case AlternateBucketDistribution::kDenser: current_root->SwitchToDenserBucketDistribution(); @@ -708,11 +660,7 @@ switch (use_alternate_bucket_distribution) { case AlternateBucketDistribution::kDefault: - g_root.Get()->SwitchToDefaultBucketDistribution(); - g_aligned_root.Get()->SwitchToDefaultBucketDistribution(); - break; - case AlternateBucketDistribution::kCoarser: - // We are already using the coarse distribution when we create a root. + // We start in the 'default' case. break; case AlternateBucketDistribution::kDenser: g_root.Get()->SwitchToDenserBucketDistribution(); @@ -739,16 +687,6 @@ base::internal::NonQuarantinableAllocator::Instance().NotifyPCScanEnabled(); } #endif // BUILDFLAG(USE_STARSCAN) - -#if BUILDFLAG(IS_WIN) -// Call this as soon as possible during startup. -void ConfigurePartitionAlloc() { -#if defined(ARCH_CPU_X86) - if (IsRunning32bitEmulatedOnArm64()) - g_extra_bytes = 8; -#endif // defined(ARCH_CPU_X86) -} -#endif // BUILDFLAG(IS_WIN) } // namespace allocator_shim const AllocatorDispatch AllocatorDispatch::default_dispatch = {
diff --git a/base/allocator/partition_allocator/thread_cache.cc b/base/allocator/partition_allocator/thread_cache.cc index 0655176f..d34578d 100644 --- a/base/allocator/partition_allocator/thread_cache.cc +++ b/base/allocator/partition_allocator/thread_cache.cc
@@ -438,7 +438,7 @@ largest_active_bucket_index_ = PartitionRoot<internal::ThreadSafe>::SizeToBucketIndex( size, - PartitionRoot<internal::ThreadSafe>::BucketDistribution::kCoarser); + PartitionRoot<internal::ThreadSafe>::BucketDistribution::kDefault); PA_CHECK(largest_active_bucket_index_ < kBucketCount); ThreadCacheRegistry::Instance().SetLargestActiveBucketIndex( largest_active_bucket_index_);
diff --git a/base/allocator/partition_allocator/thread_cache_unittest.cc b/base/allocator/partition_allocator/thread_cache_unittest.cc index f606752..071ef38 100644 --- a/base/allocator/partition_allocator/thread_cache_unittest.cc +++ b/base/allocator/partition_allocator/thread_cache_unittest.cc
@@ -102,9 +102,6 @@ ThreadSafePartitionRoot* root = allocator_->root(); switch (GetParam()) { case BucketDistribution::kDefault: - root->SwitchToDefaultBucketDistribution(); - break; - case BucketDistribution::kCoarser: root->ResetBucketDistributionForTesting(); break; case BucketDistribution::kDenser: @@ -146,7 +143,7 @@ size_t GetBucketSizeForThreadCache() { size_t tc_bucket_index = root()->SizeToBucketIndex( sizeof(ThreadCache), - ThreadSafePartitionRoot::BucketDistribution::kCoarser); + ThreadSafePartitionRoot::BucketDistribution::kDefault); auto* tc_bucket = &root()->buckets[tc_bucket_index]; return tc_bucket->slot_size; } @@ -193,7 +190,6 @@ INSTANTIATE_TEST_SUITE_P(AlternateBucketDistribution, PartitionAllocThreadCacheTest, ::testing::Values(BucketDistribution::kDefault, - BucketDistribution::kCoarser, BucketDistribution::kDenser)); TEST_P(PartitionAllocThreadCacheTest, Simple) { @@ -1153,7 +1149,7 @@ // always based on the sparser distribution. size_t tc_bucket_index = root()->SizeToBucketIndex( sizeof(ThreadCache), - ThreadSafePartitionRoot::BucketDistribution::kCoarser); + ThreadSafePartitionRoot::BucketDistribution::kDefault); auto* tc_bucket = &root()->buckets[tc_bucket_index]; size_t expected_allocated_size = tc_bucket->slot_size; // For the ThreadCache itself. @@ -1239,7 +1235,7 @@ for (size_t offset = 0; offset < 4; offset++) { size_t n = i * (4 + offset) / 4; EXPECT_EQ(BucketIndexLookup::GetIndex(n), - BucketIndexLookup::GetIndexForDenserBuckets(n)); + BucketIndexLookup::GetIndexForDefaultBuckets(n)); } } @@ -1259,7 +1255,7 @@ for (size_t offset = 0; offset < 2; offset++) { size_t n = i * (4 + offset) / 4; EXPECT_EQ(BucketIndexLookup::GetIndex(n), - BucketIndexLookup::GetIndexForDenserBuckets(n)); + BucketIndexLookup::GetIndexForDefaultBuckets(n)); EXPECT_EQ(BucketIndexLookup::GetIndex(n), expected_index); expected_index += 2; } @@ -1272,7 +1268,7 @@ // the bucket index to be larger than the bucket index for the same // allocation under the default distribution. EXPECT_GT(BucketIndexLookup::GetIndex(n), - BucketIndexLookup::GetIndexForDenserBuckets(n)); + BucketIndexLookup::GetIndexForDefaultBuckets(n)); // We expect both allocations in this loop to be rounded up to the next // power of two bucket. EXPECT_EQ(BucketIndexLookup::GetIndex(n), expected_index); @@ -1286,7 +1282,7 @@ for (size_t offset = 0; offset < 4; offset++) { size_t n = i * (4 + offset) / 4; EXPECT_EQ(BucketIndexLookup::GetIndex(n), - BucketIndexLookup::GetIndexForDenserBuckets(n)); + BucketIndexLookup::GetIndexForDefaultBuckets(n)); } } } @@ -1444,7 +1440,7 @@ root->SwitchToDenserBucketDistribution(); constexpr size_t n = (1 << 12) * 3 / 2; EXPECT_NE(internal::BucketIndexLookup::GetIndex(n), - internal::BucketIndexLookup::GetIndexForDenserBuckets(n)); + internal::BucketIndexLookup::GetIndexForDefaultBuckets(n)); void* ptr = root->Alloc(n, ""); @@ -1460,7 +1456,7 @@ std::unique_ptr<PartitionAllocatorForTesting> allocator(CreateAllocator()); constexpr size_t n = (1 << 12) * 3 / 2; EXPECT_NE(internal::BucketIndexLookup::GetIndex(n), - internal::BucketIndexLookup::GetIndexForDenserBuckets(n)); + internal::BucketIndexLookup::GetIndexForDefaultBuckets(n)); ThreadSafePartitionRoot* root = allocator->root(); void* ptr = root->Alloc(n, "");
diff --git a/base/android/jni_generator/golden/SampleForTestsWithPackagePrefix_jni.golden b/base/android/jni_generator/golden/SampleForTestsWithPackagePrefix_jni.golden new file mode 100644 index 0000000..60bdda0 --- /dev/null +++ b/base/android/jni_generator/golden/SampleForTestsWithPackagePrefix_jni.golden
@@ -0,0 +1,550 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +// This file is autogenerated by +// base/android/jni_generator/jni_generator.py +// For +// this/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests + +#ifndef this_is_a_package_prefix_org_chromium_example_jni_generator_SampleForTests_JNI +#define this_is_a_package_prefix_org_chromium_example_jni_generator_SampleForTests_JNI + +#include <jni.h> + +#include "base/android/jni_generator/jni_generator_helper.h" + + +// Step 1: Forward declarations. + +JNI_REGISTRATION_EXPORT extern const char + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests[]; +const char kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests[] + = "this/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests"; + +JNI_REGISTRATION_EXPORT extern const char + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[]; +const char + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA[] + = "this/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerStructA"; + +JNI_REGISTRATION_EXPORT extern const char + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[]; +const char + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB[] + = "this/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerStructB"; +// Leaking this jclass as we cannot use LazyInstance from some threads. +JNI_REGISTRATION_EXPORT std::atomic<jclass> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(nullptr); +#ifndef this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz_defined +#define this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz_defined +inline jclass + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(JNIEnv* env) { + return base::android::LazyGetClass(env, + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests, + &g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz); +} +#endif +// Leaking this jclass as we cannot use LazyInstance from some threads. +JNI_REGISTRATION_EXPORT std::atomic<jclass> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(nullptr); +#ifndef this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined +#define this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz_defined +inline jclass + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(JNIEnv* + env) { + return base::android::LazyGetClass(env, + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA, + &g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz); +} +#endif +// Leaking this jclass as we cannot use LazyInstance from some threads. +JNI_REGISTRATION_EXPORT std::atomic<jclass> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(nullptr); +#ifndef this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined +#define this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz_defined +inline jclass + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(JNIEnv* + env) { + return base::android::LazyGetClass(env, + kClassPath_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB, + &g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz); +} +#endif + + +// Step 2: Constants (optional). + + +// Step 3: Method stubs. +namespace base { +namespace android { + +static jlong JNI_SampleForTests_Init(JNIEnv* env, const base::android::JavaParamRef<jobject>& + caller, + const base::android::JavaParamRef<jstring>& param); + +JNI_GENERATOR_EXPORT jlong + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1init( + JNIEnv* env, + jclass jcaller, + jobject caller, + jstring param) { + return JNI_SampleForTests_Init(env, base::android::JavaParamRef<jobject>(env, caller), + base::android::JavaParamRef<jstring>(env, param)); +} + +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1destroy( + JNIEnv* env, + jclass jcaller, + jlong nativeCPPClass, + jobject caller) { + CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass); + CHECK_NATIVE_PTR(env, jcaller, native, "Destroy"); + return native->Destroy(env, base::android::JavaParamRef<jobject>(env, caller)); +} + +static jdouble JNI_SampleForTests_GetDoubleFunction(JNIEnv* env, const + base::android::JavaParamRef<jobject>& caller); + +JNI_GENERATOR_EXPORT jdouble + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1getDoubleFunction( + JNIEnv* env, + jclass jcaller, + jobject caller) { + return JNI_SampleForTests_GetDoubleFunction(env, base::android::JavaParamRef<jobject>(env, + caller)); +} + +static jfloat JNI_SampleForTests_GetFloatFunction(JNIEnv* env); + +JNI_GENERATOR_EXPORT jfloat + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1getFloatFunction( + JNIEnv* env, + jclass jcaller) { + return JNI_SampleForTests_GetFloatFunction(env); +} + +static void JNI_SampleForTests_SetNonPODDatatype(JNIEnv* env, const + base::android::JavaParamRef<jobject>& caller, + const base::android::JavaParamRef<jobject>& rect); + +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1setNonPODDatatype( + JNIEnv* env, + jclass jcaller, + jobject caller, + jobject rect) { + return JNI_SampleForTests_SetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env, + caller), base::android::JavaParamRef<jobject>(env, rect)); +} + +static base::android::ScopedJavaLocalRef<jobject> JNI_SampleForTests_GetNonPODDatatype(JNIEnv* env, + const base::android::JavaParamRef<jobject>& caller); + +JNI_GENERATOR_EXPORT jobject + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1getNonPODDatatype( + JNIEnv* env, + jclass jcaller, + jobject caller) { + return JNI_SampleForTests_GetNonPODDatatype(env, base::android::JavaParamRef<jobject>(env, + caller)).Release(); +} + +JNI_GENERATOR_EXPORT jint + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1method( + JNIEnv* env, + jclass jcaller, + jlong nativeCPPClass, + jobject caller) { + CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass); + CHECK_NATIVE_PTR(env, jcaller, native, "Method", 0); + return native->Method(env, base::android::JavaParamRef<jobject>(env, caller)); +} + +JNI_GENERATOR_EXPORT jdouble + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1methodOtherP0( + JNIEnv* env, + jclass jcaller, + jlong nativePtr, + jobject caller) { + CPPClass::InnerClass* native = reinterpret_cast<CPPClass::InnerClass*>(nativePtr); + CHECK_NATIVE_PTR(env, jcaller, native, "MethodOtherP0", 0); + return native->MethodOtherP0(env, base::android::JavaParamRef<jobject>(env, caller)); +} + +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1addStructB( + JNIEnv* env, + jclass jcaller, + jlong nativeCPPClass, + jobject caller, + jobject b) { + CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass); + CHECK_NATIVE_PTR(env, jcaller, native, "AddStructB"); + return native->AddStructB(env, base::android::JavaParamRef<jobject>(env, caller), + base::android::JavaParamRef<jobject>(env, b)); +} + +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1iterateAndDoSomethingWithStructB( + JNIEnv* env, + jclass jcaller, + jlong nativeCPPClass, + jobject caller) { + CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass); + CHECK_NATIVE_PTR(env, jcaller, native, "IterateAndDoSomethingWithStructB"); + return native->IterateAndDoSomethingWithStructB(env, base::android::JavaParamRef<jobject>(env, + caller)); +} + +JNI_GENERATOR_EXPORT jstring + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForTests_1returnAString( + JNIEnv* env, + jclass jcaller, + jlong nativeCPPClass, + jobject caller) { + CPPClass* native = reinterpret_cast<CPPClass*>(nativeCPPClass); + CHECK_NATIVE_PTR(env, jcaller, native, "ReturnAString", NULL); + return native->ReturnAString(env, base::android::JavaParamRef<jobject>(env, caller)).Release(); +} + + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_javaMethod(nullptr); +static jint Java_SampleForTests_javaMethod(JNIEnv* env, const base::android::JavaRef<jobject>& obj, + JniIntWrapper foo, + JniIntWrapper bar) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env), 0); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "javaMethod", + "(II)I", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_javaMethod); + + jint ret = + env->CallIntMethod(obj.obj(), + call_context.base.method_id, as_jint(foo), as_jint(bar)); + return ret; +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod(nullptr); +static jboolean Java_SampleForTests_staticJavaMethod(JNIEnv* env) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, clazz, + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env), + false); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_STATIC>( + env, + clazz, + "staticJavaMethod", + "()Z", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_staticJavaMethod); + + jboolean ret = + env->CallStaticBooleanMethod(clazz, + call_context.base.method_id); + return ret; +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod(nullptr); +static void Java_SampleForTests_packagePrivateJavaMethod(JNIEnv* env, const + base::android::JavaRef<jobject>& obj) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "packagePrivateJavaMethod", + "()V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_packagePrivateJavaMethod); + + env->CallVoidMethod(obj.obj(), + call_context.base.method_id); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams(nullptr); +static void Java_SampleForTests_methodWithGenericParams(JNIEnv* env, const + base::android::JavaRef<jobject>& obj, const base::android::JavaRef<jobject>& foo, + const base::android::JavaRef<jobject>& bar) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "methodWithGenericParams", + "(Ljava/util/Map;Ljava/util/LinkedList;)V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_methodWithGenericParams); + + env->CallVoidMethod(obj.obj(), + call_context.base.method_id, foo.obj(), bar.obj()); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_Constructor(nullptr); +static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_Constructor(JNIEnv* env, + JniIntWrapper foo, + JniIntWrapper bar) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, clazz, + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "<init>", + "(II)V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_Constructor); + + jobject ret = + env->NewObject(clazz, + call_context.base.method_id, as_jint(foo), as_jint(bar)); + return base::android::ScopedJavaLocalRef<jobject>(env, ret); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException(nullptr); +static void Java_SampleForTests_methodThatThrowsException(JNIEnv* env, const + base::android::JavaRef<jobject>& obj) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextUnchecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "methodThatThrowsException", + "()V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_methodThatThrowsException); + + env->CallVoidMethod(obj.obj(), + call_context.method_id); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam(nullptr); +static void Java_SampleForTests_javaMethodWithAnnotatedParam(JNIEnv* env, const + base::android::JavaRef<jobject>& obj, JniIntWrapper foo, + JniIntWrapper bar, + JniIntWrapper baz, + JniIntWrapper bat) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "javaMethodWithAnnotatedParam", + "(IIII)V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_javaMethodWithAnnotatedParam); + + env->CallVoidMethod(obj.obj(), + call_context.base.method_id, as_jint(foo), as_jint(bar), as_jint(baz), as_jint(bat)); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create(nullptr); +static base::android::ScopedJavaLocalRef<jobject> Java_InnerStructA_create(JNIEnv* env, jlong l, + JniIntWrapper i, + const base::android::JavaRef<jstring>& s) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env); + CHECK_CLAZZ(env, clazz, +this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_clazz(env), + NULL); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_STATIC>( + env, + clazz, + "create", +"(JILjava/lang/String;)Lthis/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerStructA;", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructA_create); + + jobject ret = + env->CallStaticObjectMethod(clazz, + call_context.base.method_id, l, as_jint(i), s.obj()); + return base::android::ScopedJavaLocalRef<jobject>(env, ret); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_addStructA(nullptr); +static void Java_SampleForTests_addStructA(JNIEnv* env, const base::android::JavaRef<jobject>& obj, + const base::android::JavaRef<jobject>& a) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "addStructA", +"(Lthis/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerStructA;)V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_addStructA); + + env->CallVoidMethod(obj.obj(), + call_context.base.method_id, a.obj()); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething(nullptr); +static void Java_SampleForTests_iterateAndDoSomething(JNIEnv* env, const + base::android::JavaRef<jobject>& obj) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, obj.obj(), + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env)); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "iterateAndDoSomething", + "()V", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_iterateAndDoSomething); + + env->CallVoidMethod(obj.obj(), + call_context.base.method_id); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey(nullptr); +static jlong Java_InnerStructB_getKey(JNIEnv* env, const base::android::JavaRef<jobject>& obj) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env); + CHECK_CLAZZ(env, obj.obj(), +this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), + 0); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "getKey", + "()J", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getKey); + + jlong ret = + env->CallLongMethod(obj.obj(), + call_context.base.method_id); + return ret; +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue(nullptr); +static base::android::ScopedJavaLocalRef<jstring> Java_InnerStructB_getValue(JNIEnv* env, const + base::android::JavaRef<jobject>& obj) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env); + CHECK_CLAZZ(env, obj.obj(), +this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_clazz(env), + NULL); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_INSTANCE>( + env, + clazz, + "getValue", + "()Ljava/lang/String;", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_00024InnerStructB_getValue); + + jstring ret = + static_cast<jstring>(env->CallObjectMethod(obj.obj(), + call_context.base.method_id)); + return base::android::ScopedJavaLocalRef<jstring>(env, ret); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface(nullptr); +static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerInterface(JNIEnv* env) + { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, clazz, + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_STATIC>( + env, + clazz, + "getInnerInterface", +"()Lthis/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerInterface;", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_getInnerInterface); + + jobject ret = + env->CallStaticObjectMethod(clazz, + call_context.base.method_id); + return base::android::ScopedJavaLocalRef<jobject>(env, ret); +} + +static std::atomic<jmethodID> + g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum(nullptr); +static base::android::ScopedJavaLocalRef<jobject> Java_SampleForTests_getInnerEnum(JNIEnv* env) { + jclass clazz = + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env); + CHECK_CLAZZ(env, clazz, + this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_clazz(env), NULL); + + jni_generator::JniJavaCallContextChecked call_context; + call_context.Init< + base::android::MethodID::TYPE_STATIC>( + env, + clazz, + "getInnerEnum", +"()Lthis/is/a/package/prefix/org/chromium/example/jni_generator/SampleForTests$InnerEnum;", +&g_this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForTests_getInnerEnum); + + jobject ret = + env->CallStaticObjectMethod(clazz, + call_context.base.method_id); + return base::android::ScopedJavaLocalRef<jobject>(env, ret); +} + +} // namespace android +} // namespace base + +#endif // this_is_a_package_prefix_org_chromium_example_jni_generator_SampleForTests_JNI
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistration.2.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistration.2.golden new file mode 100644 index 0000000..77a588a1 --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistration.2.golden
@@ -0,0 +1,52 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package this.is.a.package.prefix.org.chromium.base.natives; + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +public class GEN_JNI { + public static final boolean TESTING_ENABLED = false; + public static final boolean REQUIRE_MOCK = false; + + + // Hashed name: Java_J_N_MGfHLNVl + public static native void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo(); + // Hashed name: Java_J_N_M5EfCheU + public static native Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample); + // Hashed name: Java_J_N_MXQefv1w + public static native String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse); + // Hashed name: Java_J_N_MSYtnUBS + public static native String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs); + // Hashed name: Java_J_N_MaV5G8K8 + public static native Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs); + // Hashed name: Java_J_N_MM2Yz6XD + public static native boolean this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange(); + // Hashed name: Java_J_N_MMy4dcxH + public static native int[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools); + // Hashed name: Java_J_N_MSslZIsy + public static native void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects); + // Hashed name: Java_J_N_Mehs9t7u + public static native Throwable this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable(); + // Hashed name: Java_J_N_MQH82FhP + public static native Throwable[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables(); + // Hashed name: Java_J_N_MyxAHj2Y + public static native Class this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass(); + // Hashed name: Java_J_N_MNGv55Cm + public static native Class[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses(); + // Hashed name: Java_J_N_Mysjo$pl + public static native String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString(); + // Hashed name: Java_J_N_M3B287zk + public static native String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings(); + // Hashed name: Java_J_N_M8UGsyhL + public static native Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct(); + // Hashed name: Java_J_N_MtYMX5wX + public static native Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs(); + // Hashed name: Java_J_N_MIs8T9aQ + public static native Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject(); + // Hashed name: Java_J_N_MtkQGyRy + public static native Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects(); +}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationHeader.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationHeader.golden new file mode 100644 index 0000000..2140fd1 --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationHeader.golden
@@ -0,0 +1,265 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +#ifndef TEMP_DIR_HEADER_ +#define TEMP_DIR_HEADER_ + +#include <jni.h> + +#include <iterator> + +#include "base/android/jni_generator/jni_generator_helper.h" +#include "base/android/jni_int_wrapper.h" + + +// Step 1: Forward declarations (classes). + + +// Step 2: Forward declarations (methods). + +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar( + JNIEnv* env, + jclass jcaller, + jobject sample); +JNI_GENERATOR_EXPORT jstring + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString( + JNIEnv* env, + jclass jcaller, + jstring stringToReverse); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jboolean + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jintArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives( + JNIEnv* env, + jclass jcaller, + jint zint, + jintArray ints, + jlong zlong, + jlongArray longs, + jshort zshort, + jshortArray shorts, + jchar zchar, + jcharArray chars, + jbyte zbyte, + jbyteArray bytes, + jdouble zdouble, + jdoubleArray doubles, + jfloat zfloat, + jfloatArray floats, + jboolean zbool, + jbooleanArray bools); +JNI_GENERATOR_EXPORT void + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes( + JNIEnv* env, + jclass jcaller, + jclass clazz, + jobjectArray classes, + jthrowable throwable, + jobjectArray throwables, + jstring string, + jobjectArray strings, + jobject tStruct, + jobjectArray structs, + jobject obj, + jobjectArray objects); +JNI_GENERATOR_EXPORT jthrowable + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jclass + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jstring + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray + Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects( + JNIEnv* env, + jclass jcaller); + + +// Step 3: Method declarations. + + +static const JNINativeMethod kMethods_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI[] = { + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo", + "()V", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1foo) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar", + "(Ljava/lang/Object;)Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1bar) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString", + "(Ljava/lang/String;)Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1revString) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative", + "([Ljava/lang/String;)[Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendToNative) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative", + "([Ljava/lang/Object;)[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1sendSamplesToNative) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange", + "()Z", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1hasPhalange) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives", + "(I[IJ[JS[SC[CB[BD[DF[FZ[Z)[I", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testAllPrimitives) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes", + "(Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/Throwable;[Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)V", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1testSpecialTypes) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable", + "()Ljava/lang/Throwable;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowable) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables", + "()[Ljava/lang/Throwable;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnThrowables) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass", + "()Ljava/lang/Class;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClass) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses", + "()[Ljava/lang/Class;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnClasses) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString", + "()Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnString) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings", + "()[Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStrings) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct", + "()Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStruct) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs", + "()[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnStructs) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject", + "()Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObject) + }, + { + "this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects", + "()[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI_this_1is_1a_1package_1prefix_1org_1chromium_1example_1jni_11generator_1SampleForAnnotationProcessor_1returnObjects) + }, + +}; + +namespace { + +JNI_REGISTRATION_EXPORT bool RegisterNative_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI(JNIEnv* env) { + const int number_of_methods = std::size(kMethods_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI); + + base::android::ScopedJavaLocalRef<jclass> native_clazz = + base::android::GetClass(env, "this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI"); + if (env->RegisterNatives( + native_clazz.obj(), + kMethods_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI, + number_of_methods) < 0) { + + jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__); + return false; + } + + return true; +} + +} // namespace + + +// Step 4: Registration function. + +namespace None { + +bool RegisterNatives(JNIEnv* env) { + // Register natives in a proxy. + if (!RegisterNative_this_is_a_package_prefix_org_chromium_base_natives_GEN_1JNI(env)) { + return false; + } + + + return true; +} + +} // namespace None + +#endif // TEMP_DIR_HEADER_
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden new file mode 100644 index 0000000..5ed4615 --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden
@@ -0,0 +1,87 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package this.is.a.package.prefix.org.chromium.base.natives; + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +public class GEN_JNI { + public static final boolean TESTING_ENABLED = false; + public static final boolean REQUIRE_MOCK = false; + + + public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() { + this.is.a.package.prefix.J.N.MGfHLNVl(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) { + return this.is.a.package.prefix.J.N.M5EfCheU(sample); + } + + public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) { + return this.is.a.package.prefix.J.N.MXQefv1w(stringToReverse); + } + + public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) { + return this.is.a.package.prefix.J.N.MSYtnUBS(strs); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) { + return this.is.a.package.prefix.J.N.MaV5G8K8(strs); + } + + public static boolean this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() { + return this.is.a.package.prefix.J.N.MM2Yz6XD(); + } + + public static int[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools) { + return this.is.a.package.prefix.J.N.MMy4dcxH(zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools); + } + + public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects) { + this.is.a.package.prefix.J.N.MSslZIsy(clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects); + } + + public static Throwable this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() { + return this.is.a.package.prefix.J.N.Mehs9t7u(); + } + + public static Throwable[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() { + return this.is.a.package.prefix.J.N.MQH82FhP(); + } + + public static Class this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() { + return this.is.a.package.prefix.J.N.MyxAHj2Y(); + } + + public static Class[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() { + return this.is.a.package.prefix.J.N.MNGv55Cm(); + } + + public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() { + return this.is.a.package.prefix.J.N.Mysjo$pl(); + } + + public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() { + return this.is.a.package.prefix.J.N.M3B287zk(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() { + return this.is.a.package.prefix.J.N.M8UGsyhL(); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() { + return this.is.a.package.prefix.J.N.MtYMX5wX(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() { + return this.is.a.package.prefix.J.N.MIs8T9aQ(); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() { + return this.is.a.package.prefix.J.N.MtkQGyRy(); + } +}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden new file mode 100644 index 0000000..d30733e --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHash.golden
@@ -0,0 +1,50 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package this.is.a.package.prefix.J; + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +public class N { + + + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo + public static native void MGfHLNVl(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar + public static native Object M5EfCheU(Object sample); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString + public static native String MXQefv1w(String stringToReverse); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative + public static native String[] MSYtnUBS(String[] strs); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative + public static native Object[] MaV5G8K8(Object[] strs); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange + public static native boolean MM2Yz6XD(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives + public static native int[] MMy4dcxH(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes + public static native void MSslZIsy(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable + public static native Throwable Mehs9t7u(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables + public static native Throwable[] MQH82FhP(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass + public static native Class MyxAHj2Y(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses + public static native Class[] MNGv55Cm(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString + public static native String Mysjo$pl(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings + public static native String[] M3B287zk(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct + public static native Object M8UGsyhL(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs + public static native Object[] MtYMX5wX(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject + public static native Object MIs8T9aQ(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects + public static native Object[] MtkQGyRy(); +}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden new file mode 100644 index 0000000..1fce3940 --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden
@@ -0,0 +1,192 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +#ifndef TEMP_DIR_HEADER_ +#define TEMP_DIR_HEADER_ + +#include <jni.h> + +#include <iterator> + +#include "base/android/jni_generator/jni_generator_helper.h" +#include "base/android/jni_int_wrapper.h" + + +// Step 1: Forward declarations (classes). + + +// Step 2: Forward declarations (methods). + +JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MGfHLNVl( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M5EfCheU( + JNIEnv* env, + jclass jcaller, + jobject sample); +JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_MXQefv1w( + JNIEnv* env, + jclass jcaller, + jstring stringToReverse); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MSYtnUBS( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MaV5G8K8( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jboolean Java_this_is_a_package_prefix_J_N_MM2Yz6XD( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jintArray Java_this_is_a_package_prefix_J_N_MMy4dcxH( + JNIEnv* env, + jclass jcaller, + jint zint, + jintArray ints, + jlong zlong, + jlongArray longs, + jshort zshort, + jshortArray shorts, + jchar zchar, + jcharArray chars, + jbyte zbyte, + jbyteArray bytes, + jdouble zdouble, + jdoubleArray doubles, + jfloat zfloat, + jfloatArray floats, + jboolean zbool, + jbooleanArray bools); +JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MSslZIsy( + JNIEnv* env, + jclass jcaller, + jclass clazz, + jobjectArray classes, + jthrowable throwable, + jobjectArray throwables, + jstring string, + jobjectArray strings, + jobject tStruct, + jobjectArray structs, + jobject obj, + jobjectArray objects); +JNI_GENERATOR_EXPORT jthrowable Java_this_is_a_package_prefix_J_N_Mehs9t7u( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MQH82FhP( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jclass Java_this_is_a_package_prefix_J_N_MyxAHj2Y( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MNGv55Cm( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_Mysjo_00024pl( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_M3B287zk( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M8UGsyhL( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtYMX5wX( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_MIs8T9aQ( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtkQGyRy( + JNIEnv* env, + jclass jcaller); + + +// Step 3: Method declarations. + + +static const JNINativeMethod kMethods_this_is_a_package_prefix_J_N[] = { + { "MGfHLNVl", "()V", reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MGfHLNVl) }, + { "M5EfCheU", "(Ljava/lang/Object;)Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_M5EfCheU) }, + { "MXQefv1w", "(Ljava/lang/String;)Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MXQefv1w) }, + { "MSYtnUBS", "([Ljava/lang/String;)[Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MSYtnUBS) }, + { "MaV5G8K8", "([Ljava/lang/Object;)[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MaV5G8K8) }, + { "MM2Yz6XD", "()Z", reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MM2Yz6XD) }, + { "MMy4dcxH", "(I[IJ[JS[SC[CB[BD[DF[FZ[Z)[I", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MMy4dcxH) }, + { "MSslZIsy", + "(Ljava/lang/Class;[Ljava/lang/Class;Ljava/lang/Throwable;[Ljava/lang/Throwable;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)V", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MSslZIsy) }, + { "Mehs9t7u", "()Ljava/lang/Throwable;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_Mehs9t7u) }, + { "MQH82FhP", "()[Ljava/lang/Throwable;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MQH82FhP) }, + { "MyxAHj2Y", "()Ljava/lang/Class;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MyxAHj2Y) }, + { "MNGv55Cm", "()[Ljava/lang/Class;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MNGv55Cm) }, + { "Mysjo$pl", "()Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_Mysjo_00024pl) }, + { "M3B287zk", "()[Ljava/lang/String;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_M3B287zk) }, + { "M8UGsyhL", "()Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_M8UGsyhL) }, + { "MtYMX5wX", "()[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MtYMX5wX) }, + { "MIs8T9aQ", "()Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MIs8T9aQ) }, + { "MtkQGyRy", "()[Ljava/lang/Object;", + reinterpret_cast<void*>(Java_this_is_a_package_prefix_J_N_MtkQGyRy) }, + +}; + +namespace { + +JNI_REGISTRATION_EXPORT bool RegisterNative_this_is_a_package_prefix_J_N(JNIEnv* env) { + const int number_of_methods = std::size(kMethods_this_is_a_package_prefix_J_N); + + base::android::ScopedJavaLocalRef<jclass> native_clazz = + base::android::GetClass(env, "this/is/a/package/prefix/J/N"); + if (env->RegisterNatives( + native_clazz.obj(), + kMethods_this_is_a_package_prefix_J_N, + number_of_methods) < 0) { + + jni_generator::HandleRegistrationError(env, native_clazz.obj(), __FILE__); + return false; + } + + return true; +} + +} // namespace + + +// Step 4: Registration function. + +namespace None { + +bool RegisterNatives(JNIEnv* env) { + // Register natives in a proxy. + if (!RegisterNative_this_is_a_package_prefix_J_N(env)) { + return false; + } + + + return true; +} + +} // namespace None + +#endif // TEMP_DIR_HEADER_
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden new file mode 100644 index 0000000..5ed4615 --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.2.golden
@@ -0,0 +1,87 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package this.is.a.package.prefix.org.chromium.base.natives; + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +public class GEN_JNI { + public static final boolean TESTING_ENABLED = false; + public static final boolean REQUIRE_MOCK = false; + + + public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo() { + this.is.a.package.prefix.J.N.MGfHLNVl(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar(Object sample) { + return this.is.a.package.prefix.J.N.M5EfCheU(sample); + } + + public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString(String stringToReverse) { + return this.is.a.package.prefix.J.N.MXQefv1w(stringToReverse); + } + + public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative(String[] strs) { + return this.is.a.package.prefix.J.N.MSYtnUBS(strs); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative(Object[] strs) { + return this.is.a.package.prefix.J.N.MaV5G8K8(strs); + } + + public static boolean this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange() { + return this.is.a.package.prefix.J.N.MM2Yz6XD(); + } + + public static int[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools) { + return this.is.a.package.prefix.J.N.MMy4dcxH(zint, ints, zlong, longs, zshort, shorts, zchar, chars, zbyte, bytes, zdouble, doubles, zfloat, floats, zbool, bools); + } + + public static void this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects) { + this.is.a.package.prefix.J.N.MSslZIsy(clazz, classes, throwable, throwables, string, strings, tStruct, structs, obj, objects); + } + + public static Throwable this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable() { + return this.is.a.package.prefix.J.N.Mehs9t7u(); + } + + public static Throwable[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables() { + return this.is.a.package.prefix.J.N.MQH82FhP(); + } + + public static Class this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass() { + return this.is.a.package.prefix.J.N.MyxAHj2Y(); + } + + public static Class[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses() { + return this.is.a.package.prefix.J.N.MNGv55Cm(); + } + + public static String this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString() { + return this.is.a.package.prefix.J.N.Mysjo$pl(); + } + + public static String[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings() { + return this.is.a.package.prefix.J.N.M3B287zk(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct() { + return this.is.a.package.prefix.J.N.M8UGsyhL(); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs() { + return this.is.a.package.prefix.J.N.MtYMX5wX(); + } + + public static Object this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject() { + return this.is.a.package.prefix.J.N.MIs8T9aQ(); + } + + public static Object[] this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects() { + return this.is.a.package.prefix.J.N.MtkQGyRy(); + } +}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden new file mode 100644 index 0000000..d30733e --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHash.golden
@@ -0,0 +1,50 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package this.is.a.package.prefix.J; + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +public class N { + + + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_foo + public static native void MGfHLNVl(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_bar + public static native Object M5EfCheU(Object sample); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_revString + public static native String MXQefv1w(String stringToReverse); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendToNative + public static native String[] MSYtnUBS(String[] strs); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_sendSamplesToNative + public static native Object[] MaV5G8K8(Object[] strs); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_hasPhalange + public static native boolean MM2Yz6XD(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testAllPrimitives + public static native int[] MMy4dcxH(int zint, int[] ints, long zlong, long[] longs, short zshort, short[] shorts, char zchar, char[] chars, byte zbyte, byte[] bytes, double zdouble, double[] doubles, float zfloat, float[] floats, boolean zbool, boolean[] bools); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_testSpecialTypes + public static native void MSslZIsy(Class clazz, Class[] classes, Throwable throwable, Throwable[] throwables, String string, String[] strings, Object tStruct, Object[] structs, Object obj, Object[] objects); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowable + public static native Throwable Mehs9t7u(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnThrowables + public static native Throwable[] MQH82FhP(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClass + public static native Class MyxAHj2Y(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnClasses + public static native Class[] MNGv55Cm(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnString + public static native String Mysjo$pl(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStrings + public static native String[] M3B287zk(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStruct + public static native Object M8UGsyhL(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnStructs + public static native Object[] MtYMX5wX(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObject + public static native Object MIs8T9aQ(); + // Original name: this_is_a_package_prefix_org_chromium_example_jni_1generator_SampleForAnnotationProcessor_returnObjects + public static native Object[] MtkQGyRy(); +}
diff --git a/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden new file mode 100644 index 0000000..c92b36ef --- /dev/null +++ b/base/android/jni_generator/golden/testProxyPackagePrefixWithProxyHashHeader.golden
@@ -0,0 +1,113 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + + +// This file is autogenerated by +// base/android/jni_generator/jni_registration_generator.py +// Please do not change its content. + +#ifndef TEMP_DIR_HEADER_ +#define TEMP_DIR_HEADER_ + +#include <jni.h> + +#include <iterator> + +#include "base/android/jni_generator/jni_generator_helper.h" +#include "base/android/jni_int_wrapper.h" + + +// Step 1: Forward declarations (classes). + + +// Step 2: Forward declarations (methods). + +JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MGfHLNVl( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M5EfCheU( + JNIEnv* env, + jclass jcaller, + jobject sample); +JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_MXQefv1w( + JNIEnv* env, + jclass jcaller, + jstring stringToReverse); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MSYtnUBS( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MaV5G8K8( + JNIEnv* env, + jclass jcaller, + jobjectArray strs); +JNI_GENERATOR_EXPORT jboolean Java_this_is_a_package_prefix_J_N_MM2Yz6XD( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jintArray Java_this_is_a_package_prefix_J_N_MMy4dcxH( + JNIEnv* env, + jclass jcaller, + jint zint, + jintArray ints, + jlong zlong, + jlongArray longs, + jshort zshort, + jshortArray shorts, + jchar zchar, + jcharArray chars, + jbyte zbyte, + jbyteArray bytes, + jdouble zdouble, + jdoubleArray doubles, + jfloat zfloat, + jfloatArray floats, + jboolean zbool, + jbooleanArray bools); +JNI_GENERATOR_EXPORT void Java_this_is_a_package_prefix_J_N_MSslZIsy( + JNIEnv* env, + jclass jcaller, + jclass clazz, + jobjectArray classes, + jthrowable throwable, + jobjectArray throwables, + jstring string, + jobjectArray strings, + jobject tStruct, + jobjectArray structs, + jobject obj, + jobjectArray objects); +JNI_GENERATOR_EXPORT jthrowable Java_this_is_a_package_prefix_J_N_Mehs9t7u( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MQH82FhP( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jclass Java_this_is_a_package_prefix_J_N_MyxAHj2Y( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MNGv55Cm( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jstring Java_this_is_a_package_prefix_J_N_Mysjo_00024pl( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_M3B287zk( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_M8UGsyhL( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtYMX5wX( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobject Java_this_is_a_package_prefix_J_N_MIs8T9aQ( + JNIEnv* env, + jclass jcaller); +JNI_GENERATOR_EXPORT jobjectArray Java_this_is_a_package_prefix_J_N_MtkQGyRy( + JNIEnv* env, + jclass jcaller); + + + +#endif // TEMP_DIR_HEADER_
diff --git a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java index b550669..f1b1c8c 100644 --- a/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java +++ b/base/android/jni_generator/java/src/org/chromium/jni_generator/JniProcessor.java
@@ -30,8 +30,10 @@ import java.util.Set; import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedOptions; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; @@ -54,8 +56,10 @@ * containing an interface annotated with NativeMethods. * */ +@SupportedOptions({JniProcessor.PACKAGE_PREFIX_OPTION}) @AutoService(Processor.class) public class JniProcessor extends AbstractProcessor { + static final String PACKAGE_PREFIX_OPTION = "package_prefix"; private static final Class<NativeMethods> JNI_STATIC_NATIVES_CLASS = NativeMethods.class; private static final Class<CheckDiscard> CHECK_DISCARD_CLASS = CheckDiscard.class; @@ -92,6 +96,17 @@ return SourceVersion.latestSupported(); } + @Override + public synchronized void init(ProcessingEnvironment processingEnv) { + super.init(processingEnv); + if (processingEnv.getOptions().containsKey(PACKAGE_PREFIX_OPTION)) { + mGenJniClassName = ClassName.get( + String.format("%s.%s", processingEnv.getOptions().get(PACKAGE_PREFIX_OPTION), + mGenJniClassName.packageName()), + mGenJniClassName.simpleName()); + } + } + /** * Processes annotations that match getSupportedAnnotationTypes() * Called each 'round' of annotation processing, must fail gracefully if set is empty. @@ -116,8 +131,8 @@ if (mNativesBuilder == null) { String genJniPrefix = e.getAnnotation(JNI_STATIC_NATIVES_CLASS).value(); if (!genJniPrefix.isEmpty()) { - mGenJniClassName = - ClassName.get("org.chromium.base.natives", genJniPrefix + "_GEN_JNI"); + mGenJniClassName = ClassName.get(mGenJniClassName.packageName(), + genJniPrefix + "_" + mGenJniClassName.simpleName()); } FieldSpec.Builder testingFlagBuilder = @@ -220,7 +235,12 @@ String getNativeMethodName(String packageName, String className, String oldMethodName) { // e.g. org.chromium.base.Foo_Class.bar // => org_chromium_base_Foo_1Class_bar() - return String.format("%s.%s.%s", packageName, className, oldMethodName) + final String packagePrefix = + processingEnv.getOptions().getOrDefault(PACKAGE_PREFIX_OPTION, ""); + return (packagePrefix.length() > 0 + ? String.format( + "%s.%s.%s.%s", packagePrefix, packageName, className, oldMethodName) + : String.format("%s.%s.%s", packageName, className, oldMethodName)) .replaceAll("_", "_1") .replaceAll("\\.", "_"); }
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py index dd19e5a2..b739c86d 100755 --- a/base/android/jni_generator/jni_generator.py +++ b/base/android/jni_generator/jni_generator.py
@@ -263,6 +263,13 @@ return [c_type + ' jcaller'] +def GetFullyQualifiedClassWithPackagePrefix(fully_qualified_class, + package_prefix): + if package_prefix: + return '%s/%s' % (package_prefix.replace(".", "/"), fully_qualified_class) + return fully_qualified_class + + def _GetParamsInDeclaration(native): """Returns the params for the forward declaration. @@ -884,12 +891,13 @@ return name_prefix + ('N' if short_name else 'GEN_JNI') @staticmethod - def GetPackage(short_name): - return 'J' if short_name else 'org/chromium/base/natives' + def GetPackage(short_name, package_prefix=None): + package = 'J' if short_name else 'org/chromium/base/natives' + return GetFullyQualifiedClassWithPackagePrefix(package, package_prefix) @staticmethod - def GetQualifiedClass(short_name, name_prefix=None): - return '%s/%s' % (ProxyHelpers.GetPackage(short_name), + def GetQualifiedClass(short_name, name_prefix=None, package_prefix=None): + return '%s/%s' % (ProxyHelpers.GetPackage(short_name, package_prefix), ProxyHelpers.GetClass(short_name, name_prefix)) @staticmethod @@ -985,6 +993,9 @@ """Uses the given java source file to generate the JNI header file.""" def __init__(self, contents, fully_qualified_class, options): + if options.package_prefix: + fully_qualified_class = GetFullyQualifiedClassWithPackagePrefix( + fully_qualified_class, options.package_prefix) contents = RemoveComments(contents) self.jni_params = JniParams(fully_qualified_class) self.jni_params.ExtractImportsAndInnerClasses(contents) @@ -1024,12 +1035,14 @@ module_name, fully_qualified_class, use_proxy_hash, + package_prefix, split_name=None, enable_jni_multiplexing=False): self.class_name = class_name self.module_name = module_name self.fully_qualified_class = fully_qualified_class self.use_proxy_hash = use_proxy_hash + self.package_prefix = package_prefix self.split_name = split_name self.enable_jni_multiplexing = enable_jni_multiplexing @@ -1050,7 +1063,7 @@ return 'Java_%s_%s' % (EscapeClassName( ProxyHelpers.GetQualifiedClass( self.use_proxy_hash or self.enable_jni_multiplexing, - self.module_name)), method_name) + self.module_name, self.package_prefix)), method_name) template = Template('Java_${JAVA_NAME}_native${NAME}') @@ -1067,7 +1080,7 @@ if isinstance(entry, NativeMethod) and entry.is_proxy: short_name = self.use_proxy_hash or self.enable_jni_multiplexing ret[ProxyHelpers.GetClass(short_name, self.module_name)] \ - = ProxyHelpers.GetQualifiedClass(short_name, self.module_name) + = ProxyHelpers.GetQualifiedClass(short_name, self.module_name, self.package_prefix) continue ret[self.class_name] = self.fully_qualified_class @@ -1101,8 +1114,8 @@ # Since all proxy methods use the same class, defining this in every # header file would result in duplicated extern initializations. if full_clazz != ProxyHelpers.GetQualifiedClass( - self.use_proxy_hash or self.enable_jni_multiplexing, - self.module_name): + self.use_proxy_hash or self.enable_jni_multiplexing, self.module_name, + self.package_prefix): ret += [template.substitute(values)] class_getter = """\ @@ -1134,8 +1147,8 @@ # Since all proxy methods use the same class, defining this in every # header file would result in duplicated extern initializations. if full_clazz != ProxyHelpers.GetQualifiedClass( - self.use_proxy_hash or self.enable_jni_multiplexing, - self.module_name): + self.use_proxy_hash or self.enable_jni_multiplexing, self.module_name, + self.package_prefix): ret += [template.substitute(values)] return ''.join(ret) @@ -1160,6 +1173,7 @@ module_name, fully_qualified_class, self.options.use_proxy_hash, + self.options.package_prefix, split_name=self.options.split_name, enable_jni_multiplexing=self.options.enable_jni_multiplexing) @@ -1534,6 +1548,10 @@ def GenerateJNIHeader(input_file, output_file, options): try: if os.path.splitext(input_file)[1] == '.class': + # The current package-prefix implementation does not support adding + # prefix to java compiled classes. The current support is only for + # java source files. + assert not options.package_prefix jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options) content = jni_from_javap.GetContent() else: @@ -1657,6 +1675,11 @@ parser.add_argument( '--split_name', help='Split name that the Java classes should be loaded from.') + parser.add_argument( + '--package_prefix', + help= + 'Adds a prefix to the classes fully qualified-name. Effectively changing a class name from' + 'foo.bar -> prefix.foo.bar') # TODO(agrieve): --stamp used only to make incremental builds work. # Remove --stamp at some point after 2022. parser.add_argument('--stamp',
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py index 1e3eeb3..81436de 100755 --- a/base/android/jni_generator/jni_generator_tests.py +++ b/base/android/jni_generator/jni_generator_tests.py
@@ -63,6 +63,7 @@ self.unchecked_exceptions = False self.split_name = None self.include_test_only = True + self.package_prefix = None class JniRegistrationGeneratorOptions(object): @@ -79,6 +80,7 @@ self.include_test_only = False self.header_path = None self.module_name = '' + self.package_prefix = None class BaseTest(unittest.TestCase): @@ -115,7 +117,7 @@ signature_to_cases[signature].extend(cases) combined_dict[ 'FORWARDING_CALLS'] = jni_registration_generator._AddForwardingCalls( - signature_to_cases, '') + signature_to_cases, '', '') return combined_dict @@ -1677,6 +1679,63 @@ @unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows') +class PackagePrefixTestGenerator(BaseTest): + def testJniSelfDocumentingExampleWithPackagePrefix(self): + options = JniGeneratorOptions() + options.package_prefix = 'this.is.a.package.prefix' + generated_text = self._CreateJniHeaderFromFile( + os.path.join(_JAVA_SRC_DIR, 'SampleForTests.java'), + 'org/chromium/example/jni_generator/SampleForTests', options) + self.AssertGoldenTextEquals( + generated_text, + golden_file='SampleForTestsWithPackagePrefix_jni.golden') + + def testProxyPackagePrefixWithManualRegistration(self): + input_java_files = ['SampleForAnnotationProcessor.java'] + options = JniRegistrationGeneratorOptions() + options.package_prefix = 'this.is.a.package.prefix' + options.manual_jni_registration = True + name_to_goldens = { + 'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java': + 'testProxyPackagePrefixWithManualRegistration.2.golden', + } + self._TestEndToEndRegistration( + input_java_files, options, name_to_goldens, + 'testProxyPackagePrefixWithManualRegistrationHeader.golden') + + def testProxyPackagePrefixWithProxyHash(self): + input_java_files = ['SampleForAnnotationProcessor.java'] + options = JniRegistrationGeneratorOptions() + options.package_prefix = 'this.is.a.package.prefix' + options.use_proxy_hash = True + name_to_goldens = { + 'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java': + 'testProxyPackagePrefixWithProxyHash.2.golden', + 'this/is/a/package/prefix/J/N.java': + 'testProxyPackagePrefixWithProxyHash.golden', + } + self._TestEndToEndRegistration( + input_java_files, options, name_to_goldens, + 'testProxyPackagePrefixWithProxyHashHeader.golden') + + def testProxyPackagePrefixWithManualRegistrationWithProxyHash(self): + input_java_files = ['SampleForAnnotationProcessor.java'] + options = JniRegistrationGeneratorOptions() + options.package_prefix = 'this.is.a.package.prefix' + options.manual_jni_registration = True + options.use_proxy_hash = True + name_to_goldens = { + 'this/is/a/package/prefix/org/chromium/base/natives/GEN_JNI.java': + 'testProxyPackagePrefixWithManualRegistrationProxyHash.2.golden', + 'this/is/a/package/prefix/J/N.java': + 'testProxyPackagePrefixWithManualRegistrationProxyHash.golden', + } + self._TestEndToEndRegistration( + input_java_files, options, name_to_goldens, + 'testProxyPackagePrefixWithManualRegistrationProxyHashHeader.golden') + + +@unittest.skipIf(os.name == 'nt', 'Not intended to work on Windows') class MultiplexTestGenerator(BaseTest): options = JniRegistrationGeneratorOptions() options.enable_jni_multiplexing = True
diff --git a/base/android/jni_generator/jni_registration_generator.py b/base/android/jni_generator/jni_registration_generator.py index e81162b..4cb51c2e 100755 --- a/base/android/jni_generator/jni_registration_generator.py +++ b/base/android/jni_generator/jni_registration_generator.py
@@ -86,7 +86,7 @@ for signature, cases in d['SIGNATURE_TO_CASES'].items(): signature_to_cases[signature].extend(cases) combined_dict['FORWARDING_CALLS'] = _AddForwardingCalls( - signature_to_cases, module_name) + signature_to_cases, module_name, options.package_prefix) if options.header_path: assert len( @@ -110,14 +110,14 @@ # J/N.java zip_helpers.add_to_zip_hermetic( srcjar, - '%s.java' % - jni_generator.ProxyHelpers.GetQualifiedClass(True, module_name), + '%s.java' % jni_generator.ProxyHelpers.GetQualifiedClass( + True, module_name, options.package_prefix), data=CreateProxyJavaFromDict(options, module_name, combined_dict)) # org/chromium/base/natives/GEN_JNI.java zip_helpers.add_to_zip_hermetic( srcjar, - '%s.java' % - jni_generator.ProxyHelpers.GetQualifiedClass(False, module_name), + '%s.java' % jni_generator.ProxyHelpers.GetQualifiedClass( + False, module_name, options.package_prefix), data=CreateProxyJavaFromDict(options, module_name, combined_dict, @@ -126,8 +126,8 @@ # org/chromium/base/natives/GEN_JNI.java zip_helpers.add_to_zip_hermetic( srcjar, - '%s.java' % - jni_generator.ProxyHelpers.GetQualifiedClass(False, module_name), + '%s.java' % jni_generator.ProxyHelpers.GetQualifiedClass( + False, module_name, options.package_prefix), data=CreateProxyJavaFromDict(options, module_name, combined_dict)) @@ -140,6 +140,10 @@ fully_qualified_class = jni_generator.ExtractFullyQualifiedJavaClassName( path, contents) + if options.package_prefix: + fully_qualified_class = jni_generator.GetFullyQualifiedClassWithPackagePrefix( + fully_qualified_class, options.package_prefix) + natives, found_module_name = jni_generator.ProxyHelpers.ExtractStaticProxyNatives( fully_qualified_class=fully_qualified_class, contents=contents, @@ -165,7 +169,7 @@ return dict_generator.Generate() -def _AddForwardingCalls(signature_to_cases, module_name): +def _AddForwardingCalls(signature_to_cases, module_name, package_prefix): template = string.Template(""" JNI_GENERATOR_EXPORT ${RETURN} Java_${CLASS_NAME}_${PROXY_SIGNATURE}( JNIEnv* env, @@ -191,8 +195,8 @@ jni_generator.JavaDataTypeToC(return_type), 'CLASS_NAME': jni_generator.EscapeClassName( - jni_generator.ProxyHelpers.GetQualifiedClass(True, - module_name)), + jni_generator.ProxyHelpers.GetQualifiedClass( + True, module_name, package_prefix)), 'PROXY_SIGNATURE': jni_generator.EscapeClassName( _GetMultiplexProxyName(return_type, params_list)), @@ -268,16 +272,17 @@ sub_dict = { 'ESCAPED_PROXY_CLASS': jni_generator.EscapeClassName( - jni_generator.ProxyHelpers.GetQualifiedClass(short_name, - module_name)), + jni_generator.ProxyHelpers.GetQualifiedClass(short_name, module_name, + options.package_prefix)), 'PROXY_CLASS': - jni_generator.ProxyHelpers.GetQualifiedClass(short_name, module_name), + jni_generator.ProxyHelpers.GetQualifiedClass(short_name, module_name, + options.package_prefix), 'KMETHODS': registration_dict['PROXY_NATIVE_METHOD_ARRAY'], 'REGISTRATION_NAME': jni_generator.GetRegistrationFunctionName( - jni_generator.ProxyHelpers.GetQualifiedClass(short_name, - module_name)), + jni_generator.ProxyHelpers.GetQualifiedClass(short_name, module_name, + options.package_prefix)), } if registration_dict['PROXY_NATIVE_METHOD_ARRAY']: @@ -322,7 +327,8 @@ or options.enable_jni_multiplexing) class_name = jni_generator.ProxyHelpers.GetClass(is_natives_class, module_name) - package = jni_generator.ProxyHelpers.GetPackage(is_natives_class) + package = jni_generator.ProxyHelpers.GetPackage(is_natives_class, + options.package_prefix) if forwarding or not (options.use_proxy_hash or options.enable_jni_multiplexing): @@ -429,6 +435,7 @@ self.module_name, fully_qualified_class, options.use_proxy_hash, + options.package_prefix, enable_jni_multiplexing=options.enable_jni_multiplexing) self.registration_dict = None @@ -549,7 +556,7 @@ return_type, params_list = native.return_and_signature class_name = jni_generator.EscapeClassName( jni_generator.ProxyHelpers.GetQualifiedClass( - True, self.module_name)) + True, self.module_name, self.options.package_prefix)) proxy_signature = jni_generator.EscapeClassName( _GetMultiplexProxyName(return_type, params_list)) @@ -748,7 +755,8 @@ params_with_types = ', '.join( '%s %s' % (p.datatype, p.name) for p in proxy_native.params) param_names = ', '.join(p.name for p in proxy_native.params) - proxy_class = jni_generator.ProxyHelpers.GetQualifiedClass(True, module_name) + proxy_class = jni_generator.ProxyHelpers.GetQualifiedClass( + True, module_name, options.package_prefix) if options.enable_jni_multiplexing: if not param_names: @@ -877,6 +885,11 @@ arg_parser.add_argument('--include-test-only', action='store_true', help='Whether to maintain ForTesting JNI methods.') + arg_parser.add_argument( + '--package_prefix', + help= + 'Adds a prefix to the classes fully qualified-name. Effectively changing a class name from' + 'foo.bar -> prefix.foo.bar') args = arg_parser.parse_args(build_utils.ExpandFileArgs(argv[1:])) if not args.enable_proxy_mocks and args.require_mocks:
diff --git a/base/files/scoped_file_linux.cc b/base/files/scoped_file_linux.cc index e72b5b724..61ee19f 100644 --- a/base/files/scoped_file_linux.cc +++ b/base/files/scoped_file_linux.cc
@@ -4,6 +4,8 @@ #include "base/files/scoped_file.h" +#include <dlfcn.h> + #include <algorithm> #include <array> #include <atomic> @@ -79,14 +81,32 @@ } // namespace base +using LibcCloseFuncPtr = int (*)(int); + +// Load the libc close symbol to forward to from the close wrapper. +LibcCloseFuncPtr LoadCloseSymbol() { +#if defined(THREAD_SANITIZER) + // If TSAN is enabled use __interceptor___close first to make sure the TSAN + // wrapper gets called. + return reinterpret_cast<LibcCloseFuncPtr>( + dlsym(RTLD_DEFAULT, "__interceptor___close")); +#else + return reinterpret_cast<LibcCloseFuncPtr>(dlsym(RTLD_NEXT, "close")); +#endif +} + extern "C" { -int __close(int); - +NO_SANITIZE("cfi-icall") __attribute__((visibility("default"), noinline)) int close(int fd) { + static LibcCloseFuncPtr libc_close = LoadCloseSymbol(); if (base::IsFDOwned(fd) && g_is_ownership_enforced) CrashOnFdOwnershipViolation(); - return __close(fd); + if (libc_close == nullptr) { + RAW_LOG(ERROR, "close symbol missing\n"); + base::ImmediateCrash(); + } + return libc_close(fd); } } // extern "C"
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java index 12073fc..1337679c 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/ApplicationTestUtils.java
@@ -40,6 +40,9 @@ CriteriaHelper.pollUiThread(() -> { return sMonitor.getLifecycleStageOf(activity) == stage; }, failureReason, ACTIVITY_TIMEOUT, CriteriaHelper.DEFAULT_POLLING_INTERVAL); + // De-flake by flushing the tasks that are already queued on the Looper's Handler. + // TODO(https://crbug.com/1424788): Remove this and properly fix flaky tests. + TestThreadUtils.flushNonDelayedLooperTasks(); } /** Finishes the given activity and waits for its onDestroy() to be called. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TestThreadUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/TestThreadUtils.java new file mode 100644 index 0000000..e2225ea8 --- /dev/null +++ b/base/test/android/javatests/src/org/chromium/base/test/util/TestThreadUtils.java
@@ -0,0 +1,34 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base.test.util; + +import org.chromium.base.ThreadUtils; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.FutureTask; + +/** + * Helper methods to deal with threading related tasks in tests. + */ +public class TestThreadUtils { + /** + * Since PostTask goes through c++, and order is not guaranteed between c++ and Java Handler + * tasks, in many cases it's not sufficient to PostTask to the UI thread to check if UI + * properties like visibility are updated in response to a click, as UI updates go through a + * Java Handler and may run after the posted PostTask task. + * + * You should strongly prefer to wait on the signal you care about (eg. use Espresso to wait for + * a view to be displayed) instead of flushing tasks. + */ + public static void flushNonDelayedLooperTasks() { + if (ThreadUtils.runningOnUiThread()) return; + var task = new FutureTask<Void>(() -> {}, null); + ThreadUtils.getUiThreadHandler().post(task); + try { + task.get(); + } catch (InterruptedException | ExecutionException e) { + } + } +}
diff --git a/base/tracing/protos/chrome_track_event.proto b/base/tracing/protos/chrome_track_event.proto index f19c1cf..8d2218a 100644 --- a/base/tracing/protos/chrome_track_event.proto +++ b/base/tracing/protos/chrome_track_event.proto
@@ -1031,11 +1031,25 @@ SERVICE_WORKER = 5; } + // Definition of world type. + enum WorldType { + WORLD_UNKNOWN = 0; + WORLD_MAIN = 1; + WORLD_ISOLATED = 2; + WORLD_INSPECTOR_ISOLATED = 3; + WORLD_REG_EXP = 4; + WORLD_FOR_V8_CONTEXT_SNAPSHOT_NON_MAIN = 5; + WORLD_WORKER = 6; + WORLD_SHADOW_REALM = 7; + } + optional ContextType type = 1; // Contains url of frame or worker. optional string url = 2; // The origin of the execution context. optional string origin = 3; + // The world type of the execution context. + optional WorldType world_type = 4; } // Serializes the blink::SourceLocation object.
diff --git a/base/win/windows_version.cc b/base/win/windows_version.cc index 4f5644b..04bd7ae0 100644 --- a/base/win/windows_version.cc +++ b/base/win/windows_version.cc
@@ -124,6 +124,36 @@ } } +// Returns true if this is an x86/x64 process running on ARM64 through +// emulation. +// static +bool OSInfo::IsRunningEmulatedOnArm64() { +#if defined(ARCH_CPU_ARM64) + // If we're running native ARM64 then we aren't running emulated. + return false; +#else + using IsWow64Process2Function = decltype(&IsWow64Process2); + + IsWow64Process2Function is_wow64_process2 = + reinterpret_cast<IsWow64Process2Function>(::GetProcAddress( + ::GetModuleHandleA("kernel32.dll"), "IsWow64Process2")); + if (!is_wow64_process2) { + return false; + } + USHORT process_machine; + USHORT native_machine; + bool retval = is_wow64_process2(::GetCurrentProcess(), &process_machine, + &native_machine); + if (!retval) { + return false; + } + if (native_machine == IMAGE_FILE_MACHINE_ARM64) { + return true; + } + return false; +#endif +} + OSInfo::OSInfo(const _OSVERSIONINFOEXW& version_info, const _SYSTEM_INFO& system_info, DWORD os_type)
diff --git a/base/win/windows_version.h b/base/win/windows_version.h index afdfc78..145ff47 100644 --- a/base/win/windows_version.h +++ b/base/win/windows_version.h
@@ -110,9 +110,14 @@ OSInfo(const OSInfo&) = delete; OSInfo& operator=(const OSInfo&) = delete; - // Separate from the rest of OSInfo so it can be used during early process + // Separate from the rest of OSInfo so they can be used during early process // initialization. static WindowsArchitecture GetArchitecture(); + // This is necessary because GetArchitecture doesn't return correct OS + // architectures for x86/x64 binaries running on ARM64 - it says the OS is + // x86/x64. This function returns true if the process is an x86 or x64 process + // running emulated on ARM64. + static bool IsRunningEmulatedOnArm64(); // Returns the OS Version as returned from a call to GetVersionEx(). const Version& version() const { return version_; }
diff --git a/build/config/BUILD.gn b/build/config/BUILD.gn index 980b8896..749b085 100644 --- a/build/config/BUILD.gn +++ b/build/config/BUILD.gn
@@ -328,6 +328,7 @@ if (is_win) { configs += _windows_linker_configs + configs += [ "//build/config/win:exe_flags" ] } else if (is_mac) { configs += [ "//build/config/mac:mac_dynamic_flags" ] } else if (is_ios) {
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn index ca7debd..3365142 100644 --- a/build/config/BUILDCONFIG.gn +++ b/build/config/BUILDCONFIG.gn
@@ -514,12 +514,7 @@ "executable", "loadable_module", "shared_library", - - # TODO(crbug.com/1426886): When bindgen is not built in the Chromium - # build it will be safe to add rust_bin here. Right now it would make - # a conflict between the Chromium libc++ that this selects and the - # clang libraries that are shipped with the Rust toolchain. - # "rust_bin", + "rust_bin", "rust_dylib", "rust_cdylib", ]) {
diff --git a/build/config/siso/.gitignore b/build/config/siso/.gitignore new file mode 100644 index 0000000..522449bd --- /dev/null +++ b/build/config/siso/.gitignore
@@ -0,0 +1 @@ +/.sisoenv
diff --git a/build/config/siso/clang_linux.star b/build/config/siso/clang_linux.star index 1e1a15a..9e522d5 100644 --- a/build/config/siso/clang_linux.star +++ b/build/config/siso/clang_linux.star
@@ -27,6 +27,7 @@ "third_party/llvm-build/Release+Asserts/bin/clang++", ], "remote": True, + "canonicalize_dir": True, }, { "name": "clang/cc", @@ -36,6 +37,7 @@ "third_party/llvm-build/Release+Asserts/bin/clang", ], "remote": True, + "canonicalize_dir": True, }, ]) return step_config
diff --git a/build/config/siso/configure_siso.py b/build/config/siso/configure_siso.py new file mode 100755 index 0000000..87ec7b1 --- /dev/null +++ b/build/config/siso/configure_siso.py
@@ -0,0 +1,34 @@ +#!/usr/bin/env python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""This script is used to configure siso.""" + +import argparse +import os +import sys + +THIS_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def main(): + parser = argparse.ArgumentParser(description='configure siso') + parser.add_argument('--rbe_instance', help='RBE instance to use for Siso') + args = parser.parse_args() + + project = None + if not args.rbe_instance: + return 0 + elems = args.rbe_instance.split('/') + if len(elems) == 4 and elems[0] == 'projects': + project = elems[1] + siso_env_path = os.path.join(THIS_DIR, '.sisoenv') + with open(siso_env_path, 'w') as f: + if project: + f.write('SISO_PROJECT=%s\n' % project) + f.write('SISO_REAPI_INSTANCE=%s\n' % args.rbe_instance) + return 0 + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/build/config/siso/simple.star b/build/config/siso/simple.star index 3dddc36..71b18d0 100644 --- a/build/config/siso/simple.star +++ b/build/config/siso/simple.star
@@ -3,6 +3,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Siso configuration for simple steps.""" + load("@builtin//struct.star", "module") def __copy(ctx, cmd):
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn index a02f55d..507a76e 100644 --- a/build/config/win/BUILD.gn +++ b/build/config/win/BUILD.gn
@@ -332,6 +332,11 @@ } } +# Flags that should be applied to building .exe files but not .dll files. +config("exe_flags") { + rustflags = [ "-Ctarget-feature=+crt-static" ] +} + config("default_cfg_compiler") { # Emit table of address-taken functions for Control-Flow Guard (CFG). # This is needed to allow functions to be called by code that is built
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index eda1d34b..1205a19 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -12.20230411.3.1 +12.20230412.2.1
diff --git a/build/rust/rust_static_library.gni b/build/rust/rust_static_library.gni index 94f2442..6512b34 100644 --- a/build/rust/rust_static_library.gni +++ b/build/rust/rust_static_library.gni
@@ -153,16 +153,6 @@ exclude_forwards = TESTONLY_AND_VISIBILITY + [ "configs" ] _target_name = target_name - # For Gtest unittests, we must avoid dropping the object files even when - # there's no edges into them, as the tests register themselves through - # static initializers. For C++ this is done by not putting them in a library - # at all, but Rust must be compiled into an rlib. - # - # On AIX there's no flag to avoid pruning unit tests in this library from - # the linking step. - _whole_archive = defined(invoker.is_gtest_unittests) && - invoker.is_gtest_unittests && current_os != "aix" - rust_target(_target_name) { forward_variables_from(invoker, "*", exclude_forwards) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) @@ -171,16 +161,6 @@ library_configs = invoker.configs } target_type = "rust_library" - - if (_whole_archive && !is_win) { - all_dependent_configs = [ ":${_target_name}_whole_archive" ] - } - } - - if (_whole_archive && !is_win) { - config("${_target_name}_whole_archive") { - ldflags = [ "-LinkWrapper,add-whole-archive=${_target_name}" ] - } } }
diff --git a/build/toolchain/whole_archive.py b/build/toolchain/whole_archive.py index 6b5fe60..aeeb0ddc 100644 --- a/build/toolchain/whole_archive.py +++ b/build/toolchain/whole_archive.py
@@ -18,7 +18,7 @@ # file instead of the command line. def extract_libname(s): m = re.match(r'-LinkWrapper,add-whole-archive=(.+)', s) - return m.group(1) + ".rlib" + return m.group(1) # The set of libraries we want to apply `--whole-archive`` to. whole_archive_libs = [
diff --git a/buildtools/reclient_cfgs/reproxy_cfg_templates/reproxy.cfg.template b/buildtools/reclient_cfgs/reproxy_cfg_templates/reproxy.cfg.template index 37ff22f..00d4ea0 100644 --- a/buildtools/reclient_cfgs/reproxy_cfg_templates/reproxy.cfg.template +++ b/buildtools/reclient_cfgs/reproxy_cfg_templates/reproxy.cfg.template
@@ -1,11 +1,10 @@ instance=$rbe_instance service=remotebuildexecution.googleapis.com:443 log_format=reducedtext -# TODO(b/270201776) switch to automatic_auth once the option is rolled out in reproxy -use_application_default_credentials=true -# automatic_auth=true +automatic_auth=true fail_early_min_action_count=4000 fail_early_min_fallback_ratio=0.5 deps_cache_max_mb=256 -enable_deps_cache=true +# TODO(b/276727504) Re-enable once noop build shutdown time bug is fixed +# enable_deps_cache=true use_unified_uploads=true
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc index c63e534..2735d250e 100644 --- a/cc/tiles/gpu_image_decode_cache.cc +++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -26,6 +26,7 @@ #include "base/numerics/safe_math.h" #include "base/ranges/algorithm.h" #include "base/strings/stringprintf.h" +#include "base/synchronization/lock.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "base/trace_event/memory_dump_manager.h" @@ -1119,7 +1120,7 @@ false /* can_do_hardware_accelerated_decode */); } - base::AutoLock lock(lock_); + base::AutoLock locker(lock_); const InUseCacheKey cache_key = InUseCacheKeyFromDrawImage(draw_image); ImageData* image_data = GetImageDataForDrawImage(draw_image, cache_key); scoped_refptr<ImageData> new_data; @@ -1452,8 +1453,6 @@ void GpuImageDecodeCache::AddToPersistentCache(const DrawImage& draw_image, scoped_refptr<ImageData> data) { - lock_.AssertAcquired(); - if (base::FeatureList::IsEnabled(kLimitImageDecodeCacheSize)) { // Make sure we're not over capacity. If we are, this will purge older cache // entries until we're not. @@ -1469,8 +1468,6 @@ template <typename Iterator> Iterator GpuImageDecodeCache::RemoveFromPersistentCache(Iterator it) { - lock_.AssertAcquired(); - if (it->second->decode.ref_count != 0 || it->second->upload.ref_count != 0) { // Orphan the image and erase it from the |persisent_cache_|. This ensures // that the image will be deleted once all refs are removed. @@ -1521,6 +1518,7 @@ } size_t GpuImageDecodeCache::GetMaximumMemoryLimitBytes() const { + base::AutoLock locker(lock_); return max_working_set_bytes_; } @@ -1594,6 +1592,8 @@ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::OnMemoryDump"); + base::AutoLock locker(lock_); + std::string dump_name = base::StringPrintf( "cc/image_memory/cache_0x%" PRIXPTR, reinterpret_cast<uintptr_t>(this)); @@ -1804,8 +1804,6 @@ DecodeTaskType task_type) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::GetImageDecodeTaskAndRef"); - lock_.AssertAcquired(); - auto cache_key = InUseCacheKeyFromDrawImage(draw_image); // This ref is kept alive while an upload task may need this decode. We @@ -1849,7 +1847,6 @@ const InUseCacheKey& cache_key) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::RefImageDecode"); - lock_.AssertAcquired(); auto found = in_use_cache_.find(cache_key); DCHECK(found != in_use_cache_.end()); ++found->second.ref_count; @@ -1861,7 +1858,6 @@ const InUseCacheKey& cache_key) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::UnrefImageDecode"); - lock_.AssertAcquired(); auto found = in_use_cache_.find(cache_key); DCHECK(found != in_use_cache_.end()); DCHECK_GT(found->second.image_data->decode.ref_count, 0u); @@ -1878,7 +1874,6 @@ const InUseCacheKey& cache_key) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::RefImage"); - lock_.AssertAcquired(); auto found = in_use_cache_.find(cache_key); // If no secondary cache entry was found for the given |draw_image|, then @@ -1902,7 +1897,6 @@ void GpuImageDecodeCache::UnrefImageInternal(const DrawImage& draw_image, const InUseCacheKey& cache_key) { - lock_.AssertAcquired(); auto found = in_use_cache_.find(cache_key); DCHECK(found != in_use_cache_.end()); DCHECK_GT(found->second.image_data->upload.ref_count, 0u); @@ -1919,8 +1913,6 @@ // necessary memory budget book-keeping and cleanup. void GpuImageDecodeCache::OwnershipChanged(const DrawImage& draw_image, ImageData* image_data) { - lock_.AssertAcquired(); - bool has_any_refs = image_data->upload.ref_count > 0 || image_data->decode.ref_count > 0; // If we have no image refs on an image, we should unbudget it. @@ -2017,8 +2009,6 @@ bool GpuImageDecodeCache::EnsureCapacity(size_t required_size) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::EnsureCapacity"); - lock_.AssertAcquired(); - // While we are over preferred item capacity, we iterate through our set of // cached image data in LRU order, removing unreferenced images. for (auto it = persistent_cache_.rbegin(); @@ -2050,8 +2040,6 @@ } bool GpuImageDecodeCache::ExceedsCacheLimits() const { - lock_.AssertAcquired(); - size_t items_limit; if (aggressively_freeing_resources_) { items_limit = kSuspendedMaxItemsInCacheForGpu; @@ -2115,8 +2103,6 @@ const DrawImage& draw_image, ImageData* image_data, TaskType task_type) { - lock_.AssertAcquired(); - // Check if image needs dark mode to be applied, based on this image may be // decoded again if decoded data is not available. bool needs_dark_mode_filter = NeedsDarkModeFilter(draw_image, image_data); @@ -2131,8 +2117,6 @@ ImageData* image_data, TaskType task_type, bool needs_decode_for_dark_mode) { - lock_.AssertAcquired(); - DCHECK_GT(image_data->decode.ref_count, 0u); if (image_data->decode.do_hardware_accelerated_decode()) { @@ -2281,8 +2265,6 @@ void GpuImageDecodeCache::UploadImageIfNecessary(const DrawImage& draw_image, ImageData* image_data) { CheckContextLockAcquiredIfNecessary(); - lock_.AssertAcquired(); - // We are about to upload a new image and are holding the context lock. // Ensure that any images which have been marked for deletion are actually // cleaned up so we don't exceed our memory limit during this upload. @@ -2619,7 +2601,6 @@ bool allow_hardware_decode) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::CreateImageData"); - lock_.AssertAcquired(); const auto [image_info, upload_scale_mip_level] = CreateImageInfoForDrawImage(draw_image, AuxImage::kDefault); @@ -2837,7 +2818,6 @@ void GpuImageDecodeCache::FlushYUVImages( std::vector<sk_sp<SkImage>>* yuv_images) { CheckContextLockAcquiredIfNecessary(); - lock_.AssertAcquired(); GrDirectContext* ctx = context_->GrContext(); for (auto& image : *yuv_images) { ctx->flushAndSubmit(image); @@ -2866,7 +2846,6 @@ // lock and its textures have been deleted. void GpuImageDecodeCache::RunPendingContextThreadOperations() { CheckContextLockAcquiredIfNecessary(); - lock_.AssertAcquired(); for (auto* image : images_pending_complete_lock_) { context_->ContextSupport()->CompleteLockDiscardableTexureOnContextThread( @@ -3028,7 +3007,6 @@ const InUseCacheKey& key) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), "GpuImageDecodeCache::GetImageDataForDrawImage"); - lock_.AssertAcquired(); DCHECK(UseCacheForDrawImage(draw_image)); auto found_in_use = in_use_cache_.find(key); @@ -3106,12 +3084,14 @@ bool GpuImageDecodeCache::IsInInUseCacheForTesting( const DrawImage& image) const { + base::AutoLock locker(lock_); auto found = in_use_cache_.find(InUseCacheKeyFromDrawImage(image)); return found != in_use_cache_.end(); } bool GpuImageDecodeCache::IsInPersistentCacheForTesting( const DrawImage& image) const { + base::AutoLock locker(lock_); auto found = persistent_cache_.Peek(image.frame_key()); return found != persistent_cache_.end(); }
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h index 1bcd316..4e68790 100644 --- a/cc/tiles/gpu_image_decode_cache.h +++ b/cc/tiles/gpu_image_decode_cache.h
@@ -201,14 +201,22 @@ // For testing only. void SetWorkingSetLimitsForTesting(size_t bytes_limit, size_t items_limit) { + base::AutoLock locker(lock_); max_working_set_bytes_ = bytes_limit; max_working_set_items_ = items_limit; } - size_t GetWorkingSetBytesForTesting() const { return working_set_bytes_; } + size_t GetWorkingSetBytesForTesting() const { + base::AutoLock locker(lock_); + return working_set_bytes_; + } size_t GetNumCacheEntriesForTesting() const { + base::AutoLock locker(lock_); return persistent_cache_.size(); } - size_t GetInUseCacheEntriesForTesting() const { return in_use_cache_.size(); } + size_t GetInUseCacheEntriesForTesting() const { + base::AutoLock locker(lock_); + return in_use_cache_.size(); + } size_t GetDrawImageSizeForTesting(const DrawImage& image); void SetImageDecodingFailedForTesting(const DrawImage& image); bool DiscardableIsLockedForTesting(const DrawImage& image); @@ -219,6 +227,7 @@ YUVIndex index); size_t GetDarkModeImageCacheSizeForTesting(const DrawImage& draw_image); size_t paint_image_entries_count_for_testing() const { + base::AutoLock locker(lock_); return paint_image_entries_.size(); } bool NeedsDarkModeFilterForTesting(const DrawImage& draw_image); @@ -589,7 +598,7 @@ ClientId client_id, const DrawImage& image, const TracingInfo& tracing_info, - DecodeTaskType task_type); + DecodeTaskType task_type) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Note that this function behaves as if it was public (all of the same locks // need to be acquired). Uses |client_id| to identify which client created a @@ -602,38 +611,45 @@ DecodeTaskType task_type); void RefImageDecode(const DrawImage& draw_image, - const InUseCacheKey& cache_key); + const InUseCacheKey& cache_key) + EXCLUSIVE_LOCKS_REQUIRED(lock_); void UnrefImageDecode(const DrawImage& draw_image, - const InUseCacheKey& cache_key); - void RefImage(const DrawImage& draw_image, const InUseCacheKey& cache_key); + const InUseCacheKey& cache_key) + EXCLUSIVE_LOCKS_REQUIRED(lock_); + void RefImage(const DrawImage& draw_image, const InUseCacheKey& cache_key) + EXCLUSIVE_LOCKS_REQUIRED(lock_); void UnrefImageInternal(const DrawImage& draw_image, - const InUseCacheKey& cache_key); + const InUseCacheKey& cache_key) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Called any time the ownership of an object changed. This includes changes // to ref-count or to orphaned status. - void OwnershipChanged(const DrawImage& draw_image, ImageData* image_data); + void OwnershipChanged(const DrawImage& draw_image, ImageData* image_data) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Ensures that the working set can hold an element of |required_size|, // freeing unreferenced cache entries to make room. - bool EnsureCapacity(size_t required_size); - bool CanFitInWorkingSet(size_t size) const; - bool ExceedsCacheLimits() const; + bool EnsureCapacity(size_t required_size) EXCLUSIVE_LOCKS_REQUIRED(lock_); + bool CanFitInWorkingSet(size_t size) const EXCLUSIVE_LOCKS_REQUIRED(lock_); + bool ExceedsCacheLimits() const EXCLUSIVE_LOCKS_REQUIRED(lock_); void ReduceCacheUsageLocked() EXCLUSIVE_LOCKS_REQUIRED(lock_); void InsertTransferCacheEntry( const ClientImageTransferCacheEntry& image_entry, - ImageData* image_data); + ImageData* image_data) EXCLUSIVE_LOCKS_REQUIRED(lock_); bool NeedsDarkModeFilter(const DrawImage& draw_image, ImageData* image_data); void DecodeImageAndGenerateDarkModeFilterIfNecessary( const DrawImage& draw_image, ImageData* image_data, - TaskType task_type); + TaskType task_type) EXCLUSIVE_LOCKS_REQUIRED(lock_); void DecodeImageIfNecessary(const DrawImage& draw_image, ImageData* image_data, TaskType task_type, - bool needs_decode_for_dark_mode); + bool needs_decode_for_dark_mode) + EXCLUSIVE_LOCKS_REQUIRED(lock_); void GenerateDarkModeFilter(const DrawImage& draw_image, - ImageData* image_data); + ImageData* image_data) + EXCLUSIVE_LOCKS_REQUIRED(lock_); sk_sp<SkImage> CreateImageFromYUVATexturesInternal( const SkImage* uploaded_y_image, const SkImage* uploaded_u_image, @@ -644,12 +660,14 @@ const SkYUVAInfo::Subsampling yuva_subsampling, const SkYUVColorSpace yuva_color_space, sk_sp<SkColorSpace> target_color_space, - sk_sp<SkColorSpace> decoded_color_space) const; + sk_sp<SkColorSpace> decoded_color_space) const + EXCLUSIVE_LOCKS_REQUIRED(lock_); scoped_refptr<GpuImageDecodeCache::ImageData> CreateImageData( const DrawImage& image, bool allow_hardware_decode); - void WillAddCacheEntry(const DrawImage& draw_image); + void WillAddCacheEntry(const DrawImage& draw_image) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Returns the SkImageInfo for the resulting image and the mip level for // upload. @@ -660,7 +678,8 @@ // Finds the ImageData that should be used for the given DrawImage. Looks // first in the |in_use_cache_|, and then in the |persistent_cache_|. ImageData* GetImageDataForDrawImage(const DrawImage& image, - const InUseCacheKey& key); + const InUseCacheKey& key) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Returns true if the given ImageData can be used to draw the specified // DrawImage. @@ -669,12 +688,12 @@ // Helper to delete an image and remove it from the cache. Ensures that // the image is unlocked and Skia cleanup is handled on the right thread. - void DeleteImage(ImageData* image_data); + void DeleteImage(ImageData* image_data) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Helper to unlock an image, indicating that it is no longer actively // being used. An image must be locked via TryLockImage below before it // can be used again. - void UnlockImage(ImageData* image_data); + void UnlockImage(ImageData* image_data) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Attempts to lock an image for use. If locking fails (the image is deleted // on the service side), this function will delete the local reference to the @@ -682,43 +701,47 @@ enum class HaveContextLock { kYes, kNo }; bool TryLockImage(HaveContextLock have_context_lock, const DrawImage& draw_image, - ImageData* data); + ImageData* data) EXCLUSIVE_LOCKS_REQUIRED(lock_); // Requires that the |context_| lock be held when calling. void UploadImageIfNecessary(const DrawImage& draw_image, - ImageData* image_data); + ImageData* image_data) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Implementation of UploadImageIfNecessary for each sub-case. void UploadImageIfNecessary_TransferCache_HardwareDecode( const DrawImage& draw_image, ImageData* image_data, - sk_sp<SkColorSpace> color_space); + sk_sp<SkColorSpace> color_space) EXCLUSIVE_LOCKS_REQUIRED(lock_); void UploadImageIfNecessary_TransferCache_SoftwareDecode( const DrawImage& draw_image, ImageData* image_data, sk_sp<SkColorSpace> decoded_target_colorspace, - absl::optional<TargetColorParams> target_color_params); + absl::optional<TargetColorParams> target_color_params) + EXCLUSIVE_LOCKS_REQUIRED(lock_); void UploadImageIfNecessary_GpuCpu_YUVA( const DrawImage& draw_image, ImageData* image_data, sk_sp<SkImage> uploaded_image, GrMipMapped image_needs_mips, sk_sp<SkColorSpace> decoded_target_colorspace, - sk_sp<SkColorSpace> color_space); + sk_sp<SkColorSpace> color_space) EXCLUSIVE_LOCKS_REQUIRED(lock_); void UploadImageIfNecessary_GpuCpu_RGBA(const DrawImage& draw_image, ImageData* image_data, sk_sp<SkImage> uploaded_image, GrMipMapped image_needs_mips, - sk_sp<SkColorSpace> color_space); + sk_sp<SkColorSpace> color_space) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Flush pending operations on context_->GrContext() for each element of // |yuv_images| and then clear the vector. - void FlushYUVImages(std::vector<sk_sp<SkImage>>* yuv_images); + void FlushYUVImages(std::vector<sk_sp<SkImage>>* yuv_images) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Runs pending operations that required the |context_| lock to be held, but // were queued up during a time when the |context_| lock was unavailable. // These including deleting, unlocking, and locking textures. - void RunPendingContextThreadOperations(); + void RunPendingContextThreadOperations() EXCLUSIVE_LOCKS_REQUIRED(lock_); void CheckContextLockAcquiredIfNecessary(); @@ -732,7 +755,8 @@ const std::string& texture_dump_name, const size_t bytes, const GrGLuint gl_id, - const size_t locked_size) const; + const size_t locked_size) const + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Alias each texture of the YUV image entry to its Skia texture counterpart, // taking ownership of the memory and preventing double counting. @@ -743,7 +767,8 @@ void MemoryDumpYUVImage(base::trace_event::ProcessMemoryDump* pmd, const ImageData* image_data, const std::string& dump_base_name, - size_t locked_size) const; + size_t locked_size) const + EXCLUSIVE_LOCKS_REQUIRED(lock_); // |persistent_cache_| represents the long-lived cache, keeping a certain // budget of ImageDatas alive even when their ref count reaches zero. @@ -751,16 +776,19 @@ scoped_refptr<ImageData>, PaintImage::FrameKeyHash>; void AddToPersistentCache(const DrawImage& draw_image, - scoped_refptr<ImageData> data); + scoped_refptr<ImageData> data) + EXCLUSIVE_LOCKS_REQUIRED(lock_); template <typename Iterator> - Iterator RemoveFromPersistentCache(Iterator it); + Iterator RemoveFromPersistentCache(Iterator it) + EXCLUSIVE_LOCKS_REQUIRED(lock_); // Purges any old entries from the PersistentCache if the feature to enable // this behavior is turned on. - void MaybePurgeOldCacheEntries(); + void MaybePurgeOldCacheEntries() EXCLUSIVE_LOCKS_REQUIRED(lock_); // Adds mips to an image if required. - void UpdateMipsIfNeeded(const DrawImage& draw_image, ImageData* image_data); + void UpdateMipsIfNeeded(const DrawImage& draw_image, ImageData* image_data) + EXCLUSIVE_LOCKS_REQUIRED(lock_); static scoped_refptr<TileTask> GetTaskFromMapForClientId( const ClientId client_id, @@ -779,13 +807,13 @@ // All members below this point must only be accessed while holding |lock_|. // The exception are const members like |normal_max_cache_bytes_| that can // be accessed without a lock since they are thread safe. - base::Lock lock_; + mutable base::Lock lock_; - PersistentCache persistent_cache_; + PersistentCache persistent_cache_ GUARDED_BY(lock_); // Tracks the total number of bytes of image data represented by the elements // in `persistent_cache_`. Must be updated on AddTo/RemoveFromPersistentCache. - size_t persistent_cache_memory_size_ = 0; + size_t persistent_cache_memory_size_ GUARDED_BY(lock_) = 0; struct CacheEntries { PaintImage::ContentId content_ids[2] = {PaintImage::kInvalidContentId, @@ -797,19 +825,20 @@ }; // A map of PaintImage::Id to entries for this image in the // |persistent_cache_|. - base::flat_map<PaintImage::Id, CacheEntries> paint_image_entries_; + base::flat_map<PaintImage::Id, CacheEntries> paint_image_entries_ + GUARDED_BY(lock_); // |in_use_cache_| represents the in-use (short-lived) cache. Entries are // cleaned up as soon as their ref count reaches zero. using InUseCache = std::unordered_map<InUseCacheKey, InUseCacheEntry, InUseCacheKeyHash>; - InUseCache in_use_cache_; + InUseCache in_use_cache_ GUARDED_BY(lock_); - size_t max_working_set_bytes_ = 0; - size_t max_working_set_items_ = 0; - size_t working_set_bytes_ = 0; - size_t working_set_items_ = 0; - bool aggressively_freeing_resources_ = false; + size_t max_working_set_bytes_ GUARDED_BY(lock_) = 0; + size_t max_working_set_items_ GUARDED_BY(lock_) = 0; + size_t working_set_bytes_ GUARDED_BY(lock_) = 0; + size_t working_set_items_ GUARDED_BY(lock_) = 0; + bool aggressively_freeing_resources_ GUARDED_BY(lock_) = false; // This field is not a raw_ptr<> because of incompatibilities with tracing // (TRACE_EVENT*), perfetto::TracedDictionary::Add and gmock/EXPECT_THAT.
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index aa1284b..ee9a00b 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -285,9 +285,6 @@ # Chromium functionality directly into the executable. ":dependencies", - # For configuring PartitionAlloc - "//base/allocator:buildflags", - # For the sampling profiler. "//chrome/common/profiler", @@ -433,7 +430,6 @@ ":chrome_dll_manifest", ":chrome_dll_version", ":dependencies", - "//base/allocator:buildflags", "//chrome/app:chrome_dll_resources", "//chrome/app:command_ids", "//chrome/app/theme:chrome_unscaled_resources", @@ -1161,7 +1157,6 @@ deps = [ ":dependencies", - "//base/allocator:buildflags", "//build:chromeos_buildflags", "//chrome/app:command_ids", "//chrome/app:notification_metrics",
diff --git a/chrome/VERSION b/chrome/VERSION index 6449a27..02f3a68 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=114 MINOR=0 -BUILD=5711 +BUILD=5712 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index ba0b255..d7b49d2 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -338,6 +338,8 @@ "//chrome/browser/ui/android/appmenu:java", "//chrome/browser/ui/android/default_browser_promo:java", "//chrome/browser/ui/android/device_lock:java", + "//chrome/browser/ui/android/edge_to_edge:factory_java", + "//chrome/browser/ui/android/edge_to_edge:java", "//chrome/browser/ui/android/fast_checkout:java", "//chrome/browser/ui/android/favicon:java", "//chrome/browser/ui/android/layouts:java", @@ -717,6 +719,7 @@ "//chrome/browser/touch_to_fill/payments/android/internal:java", "//chrome/browser/ui/android/appmenu/internal:java", "//chrome/browser/ui/android/autofill/internal:java", + "//chrome/browser/ui/android/edge_to_edge/internal:java", "//chrome/browser/ui/android/fast_checkout/internal:java", "//chrome/browser/ui/android/webid/internal:java", "//chrome/browser/video_tutorials/internal:java", @@ -940,6 +943,8 @@ "//chrome/browser/ui/android/autofill/internal:junit", "//chrome/browser/ui/android/default_browser_promo:java", "//chrome/browser/ui/android/default_browser_promo:junit", + "//chrome/browser/ui/android/device_lock:junit", + "//chrome/browser/ui/android/edge_to_edge/internal:junit", "//chrome/browser/ui/android/fast_checkout/internal:junit", "//chrome/browser/ui/android/favicon:java", "//chrome/browser/ui/android/layouts:java",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index f23c04d..a697eda 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -384,6 +384,7 @@ "java/res/drawable/ic_cancel_circle.xml", "java/res/drawable/ic_checkmark_24dp.xml", "java/res/drawable/ic_cloud_offline_24dp.xml", + "java/res/drawable/ic_cloud_upload_24dp.xml", "java/res/drawable/ic_create_new_folder_24dp.xml", "java/res/drawable/ic_error.xml", "java/res/drawable/ic_find_in_page.xml",
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb index 39ffc63..caddc7e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_af.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Ongroepeer oortjie}other{Ongroepeer oortjies}}</translation> <translation id="2277224997687551299">Wysig groep se naam</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Boekmerk oortjie}other{Boekmerk oortjies}}</translation> -<translation id="2479148705183875116">Gaan na Instellings</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Vou <ph name="TABS_COUNT_ONE" /> oortjie in.}other{Vou oortjiegroep met <ph name="TABS_COUNT_MANY" /> oortjies in.}}</translation> <translation id="2569352796411618312">Voorstel: <ph name="NUMBER_OF_TABS" /> van jou oortjies is nie onlangs gebruik nie. Maak hulle toe?</translation> <translation id="2613747923081026172">Skep groep</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb index 5f34dac4..82230c1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_am.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ትርን ነጥል}one{ትርን ነጥል}other{ትሮችን ነጥል}}</translation> <translation id="2277224997687551299">የቡድን ስም ያርትዑ</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{የዕልባት ትር}one{የዕልባት ትር}other{የዕልባት ትሮች}}</translation> -<translation id="2479148705183875116">ወደ ቅንብሮች ሂድ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ትርን ሰብስብ።}one{ከ<ph name="TABS_COUNT_MANY" /> ትሮች ጋር የትር ቡድንን ሰብስብ።}other{ከ<ph name="TABS_COUNT_MANY" /> ትሮች ጋር የትር ቡድንን ሰብስብ።}}</translation> <translation id="2569352796411618312">ጥቆማ ሐሳብ፦ ከእርስዎ ትሮች <ph name="NUMBER_OF_TABS" /> ያክሉ በቅርቡ ጥቅም ላይ አልዋሉም። ይዘጉ?</translation> <translation id="2613747923081026172">ቡድን ይፍጠሩ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb index d0c4d27..423ea45 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ar.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{إلغاء تجميع علامة التبويب}zero{إلغاء تجميع علامات التبويب}two{إلغاء تجميع علامتَي التبويب}few{إلغاء تجميع علامات التبويب}many{إلغاء تجميع علامات التبويب}other{إلغاء تجميع علامات التبويب}}</translation> <translation id="2277224997687551299">تعديل اسم المجموعة</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{وضع إشارة على علامة التبويب}zero{وضع إشارة على علامات التبويب}two{وضع إشارة على علامتَي التبويب}few{وضع إشارة على علامات التبويب}many{وضع إشارة على علامات التبويب}other{وضع إشارة على علامات التبويب}}</translation> -<translation id="2479148705183875116">الانتقال إلى الإعدادات</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{تصغير علامة تبويب واحدة (<ph name="TABS_COUNT_ONE" />)}zero{تصغير مجموعة علامات التبويب التي تحتوي على <ph name="TABS_COUNT_MANY" /> علامة تبويب}two{تصغير مجموعة علامات التبويب التي تحتوي على علامتَي تبويب (<ph name="TABS_COUNT_MANY" />)}few{تصغير مجموعة علامات التبويب التي تحتوي على <ph name="TABS_COUNT_MANY" /> علامات تبويب}many{تصغير مجموعة علامات التبويب التي تحتوي على <ph name="TABS_COUNT_MANY" /> علامة تبويب}other{تصغير مجموعة علامات التبويب التي تحتوي على <ph name="TABS_COUNT_MANY" /> علامة تبويب}}</translation> <translation id="2569352796411618312">اقتراح: لم يتم استخدام <ph name="NUMBER_OF_TABS" /> من علامات التبويب مؤخرًا. هل تريد إغلاقها؟</translation> <translation id="2613747923081026172">إنشاء مجموعة</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb index 7283e72e..9dfb586 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_as.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{টেবৰ গোট ভংগ কৰক}one{টেবৰ গোট ভংগ কৰক}other{টেবৰ গোট ভংগ কৰক}}</translation> <translation id="2277224997687551299">গোটৰ নাম সম্পাদনা কৰক</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{টেব বুকমাৰ্ক কৰক}one{টেব বুকমাৰ্ক কৰক}other{টেব বুকমাৰ্ক কৰক}}</translation> -<translation id="2479148705183875116">ছেটিংসমূহলৈ যাওক</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> টা টেব সংকোচন কৰক।}one{<ph name="TABS_COUNT_MANY" /> টা টেবযুক্ত টেবৰ গোটটো সংকোচন কৰক।}other{<ph name="TABS_COUNT_MANY" /> টা টেবযুক্ত টেবৰ গোটটো সংকোচন কৰক।}}</translation> <translation id="2569352796411618312">পৰামৰ্শ: শেহতীয়াকৈ আপোনাৰ <ph name="NUMBER_OF_TABS" /> টা টেব ব্যৱহাৰ কৰা হোৱা নাই। সেইকেইটা বন্ধ কৰিবনে?</translation> <translation id="2613747923081026172">গোট সৃষ্টি কৰক</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb index 2cafb6b..b5de3a6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_az.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Tabı ayırın}other{Tabları ayırın}}</translation> <translation id="2277224997687551299">Qrup adına düzəliş edin</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Taba əlfəcin əlavə edin}other{Tablara əlfəcin əlavə edin}}</translation> -<translation id="2479148705183875116">Ayarlara keçin</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tabını yığcamlaşdırın.}other{<ph name="TABS_COUNT_MANY" /> tab olan tab qrupunu yığcamlaşdırın.}}</translation> <translation id="2569352796411618312">Təklif: <ph name="NUMBER_OF_TABS" /> tabel bu yaxınlarda istifadə edilməyib. Bağlansınlar?</translation> <translation id="2613747923081026172">Qrup yaradın</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb index 193fc5f..5b5f52ad 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_be.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Выдаліць укладку з групы}one{Выдаліць укладкі з групы}few{Выдаліць укладкі з групы}many{Выдаліць укладкі з групы}other{Выдаліць укладкі з групы}}</translation> <translation id="2277224997687551299">Змяніць назву групы</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Дадаць укладку ў закладкі}one{Дадаць укладкі ў закладкі}few{Дадаць укладкі ў закладкі}many{Дадаць укладкі ў закладкі}other{Дадаць укладкі ў закладкі}}</translation> -<translation id="2479148705183875116">Перайсці ў Налады</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Згарнуць <ph name="TABS_COUNT_ONE" /> укладку.}one{Згарнуць групу з <ph name="TABS_COUNT_MANY" /> укладкі.}few{Згарнуць групу з <ph name="TABS_COUNT_MANY" /> укладак.}many{Згарнуць групу з <ph name="TABS_COUNT_MANY" /> укладак.}other{Згарнуць групу з <ph name="TABS_COUNT_MANY" /> укладкі.}}</translation> <translation id="2569352796411618312">Прапанова: некалькі (<ph name="NUMBER_OF_TABS" />) укладак пэўны час не выкарыстоўваліся. Закрыць іх?</translation> <translation id="2613747923081026172">Стварыць групу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb index 45ff310..264637e9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bg.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Разгрупиране на раздела}other{Разгрупиране на разделите}}</translation> <translation id="2277224997687551299">Редактиране на името на групата</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Отметка към раздела}other{Отметка към разделите}}</translation> -<translation id="2479148705183875116">Към настройките</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Свиване на <ph name="TABS_COUNT_ONE" /> раздел.}other{Свиване на групата с раздели с(ъс) <ph name="TABS_COUNT_MANY" /> раздела.}}</translation> <translation id="2569352796411618312">Предложение: <ph name="NUMBER_OF_TABS" /> от разделите ви не са използвани наскоро. Искате ли да ги затворите?</translation> <translation id="2613747923081026172">Създаване на група</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb index ee2b880..e1b828ee 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bn.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ট্যাব আনগ্রুপ করুন}one{ট্যাব আনগ্রুপ করুন}other{ট্যাব আনগ্রুপ করুন}}</translation> <translation id="2277224997687551299">গ্রুপের নাম এডিট করুন</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ট্যাব বুকমার্ক করুন}one{ট্যাব বুকমার্ক করুন}other{ট্যাব বুকমার্ক করুন}}</translation> -<translation id="2479148705183875116">সেটিংসে যান</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" />টি ট্যাব ছোট করুন।}one{সেই ট্যাব গ্রুপকে ছোট করুন যাতে <ph name="TABS_COUNT_MANY" />টি ট্যাব আছে।}other{সেই ট্যাব গ্রুপকে ছোট করুন যাতে <ph name="TABS_COUNT_MANY" />টি ট্যাব আছে।}}</translation> <translation id="2569352796411618312">সাজেশন: সব ট্যাবের মধ্যে থেকে <ph name="NUMBER_OF_TABS" />টি ট্যাব সম্প্রতি ব্যবহার করা হয়নি। সেগুলি বন্ধ করে দিতে চান?</translation> <translation id="2613747923081026172">গ্রুপ তৈরি করুন</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb index 50e2e04f..2e80140 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_bs.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Razgrupiši karticu}one{Razgrupiši kartice}few{Razgrupiši kartice}other{Razgrupiši kartice}}</translation> <translation id="2277224997687551299">Uredi naziv grupe</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Označi karticu}one{Označi kartice}few{Označi kartice}other{Označi kartice}}</translation> -<translation id="2479148705183875116">Idi u postavke</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Sužavanje <ph name="TABS_COUNT_ONE" /> kartice.}one{Sužavanje grupe kartica s <ph name="TABS_COUNT_MANY" /> karticom.}few{Sužavanje grupe kartica s <ph name="TABS_COUNT_MANY" /> kartice.}other{Sužavanje grupe kartica s <ph name="TABS_COUNT_MANY" /> kartica.}}</translation> <translation id="2569352796411618312">Prijedlog: U zadnje vrijeme niste koristili sljedeći broj kartica: <ph name="NUMBER_OF_TABS" />. Zatvoriti ih?</translation> <translation id="2613747923081026172">Kreiraj grupu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb index 6a3b15c5..5a3b1279c 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ca.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupa la pestanya}other{Desagrupa les pestanyes}}</translation> <translation id="2277224997687551299">Edita el nom del grup</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Pestanya d'adreces d'interès}other{Pestanyes d'adreces d'interès}}</translation> -<translation id="2479148705183875116">Ves a Configuració</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Replega <ph name="TABS_COUNT_ONE" /> pestanya.}other{Replega el grup format per <ph name="TABS_COUNT_MANY" /> pestanyes.}}</translation> <translation id="2569352796411618312">Suggeriment: <ph name="NUMBER_OF_TABS" /> de les teves pestanyes no s'han utilitzat últimament. Vols tancar-les?</translation> <translation id="2613747923081026172">Crea un grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb index 862a9774..c6fb2f6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cs.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Zrušit seskupení karty}few{Zrušit seskupení karet}many{Zrušit seskupení karet}other{Zrušit seskupení karet}}</translation> <translation id="2277224997687551299">Upravit název skupiny</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Přidat kartu do záložek}few{Přidat karty do záložek}many{Přidat karty do záložek}other{Přidat karty do záložek}}</translation> -<translation id="2479148705183875116">Přejít do nastavení</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Sbalit <ph name="TABS_COUNT_ONE" /> kartu.}few{Sbalit skupinu karet se <ph name="TABS_COUNT_MANY" /> kartami.}many{Sbalit skupinu karet s <ph name="TABS_COUNT_MANY" /> karty.}other{Sbalit skupinu karet s <ph name="TABS_COUNT_MANY" /> kartami.}}</translation> <translation id="2569352796411618312">Tento počet vašich karet v poslední době nebyl použit: <ph name="NUMBER_OF_TABS" />. Chcete je zavřít?</translation> <translation id="2613747923081026172">Vytvořit skupinu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb index 91f5b27..1f93b2f 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_cy.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Dadgrwpio tab}zero{Dadgrwpio tabiau}two{Dadgrwpio tabiau}few{Dadgrwpio tabiau}many{Dadgrwpio tabiau}other{Dadgrwpio tabiau}}</translation> <translation id="2277224997687551299">Golygu enw'r grŵp</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Rhoi nod tudalen ar y tab}zero{Rhoi nod tudalen ar y tabiau}two{Rhoi nod tudalen ar y tabiau}few{Rhoi nod tudalen ar y tabiau}many{Rhoi nod tudalen ar y tabiau}other{Rhoi nod tudalen ar y tabiau}}</translation> -<translation id="2479148705183875116">Mynd i'r Gosodiadau</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Crebachu <ph name="TABS_COUNT_ONE" /> tab.}zero{Crebachu'r grŵp tabiau sydd â <ph name="TABS_COUNT_MANY" /> tab.}two{Crebachu'r grŵp tabiau sydd â <ph name="TABS_COUNT_MANY" /> dab.}few{Crebachu'r grŵp tabiau sydd â <ph name="TABS_COUNT_MANY" /> thab.}many{Crebachu'r grŵp tabiau sydd â <ph name="TABS_COUNT_MANY" /> thab.}other{Crebachu'r grŵp tabiau sydd â <ph name="TABS_COUNT_MANY" /> tab.}}</translation> <translation id="2569352796411618312">Awgrym: Nid yw <ph name="NUMBER_OF_TABS" /> o'ch tabiau wedi'u defnyddio'n ddiweddar. Cau'r tabiau?</translation> <translation id="2613747923081026172">Creu grŵp</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb index e69b867..13b1baa 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_da.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Ophæv gruppering af fane}one{Ophæv gruppering af fane}other{Ophæv gruppering af faner}}</translation> <translation id="2277224997687551299">Rediger gruppenavn</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Gem fane som bogmærke}one{Gem fane som bogmærke}other{Gem faner som bogmærker}}</translation> -<translation id="2479148705183875116">Gå til Indstillinger</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Skjul <ph name="TABS_COUNT_ONE" /> fane.}one{Skjul fanegruppe med <ph name="TABS_COUNT_MANY" /> fane.}other{Skjul fanegruppe med <ph name="TABS_COUNT_MANY" /> faner.}}</translation> <translation id="2569352796411618312">Forslag: <ph name="NUMBER_OF_TABS" /> af dine faner er ikke blevet brugt for nylig. Vil du lukke dem?</translation> <translation id="2613747923081026172">Opret gruppe</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb index 44a66490..0c0510b7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_de.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Tab-Gruppierung aufheben}other{Tab-Gruppierung aufheben}}</translation> <translation id="2277224997687551299">Gruppenname bearbeiten</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Tab zu Lesezeichen hinzufügen}other{Tabs zu Lesezeichen hinzufügen}}</translation> -<translation id="2479148705183875116">Zu den Einstellungen</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> Tab minimieren}other{Tabgruppe mit <ph name="TABS_COUNT_MANY" /> Tabs minimieren}}</translation> <translation id="2569352796411618312">Vorschlag: <ph name="NUMBER_OF_TABS" /> von deinen Tabs wurden längere Zeit nicht verwendet. Möchtest du sie schließen?</translation> <translation id="2613747923081026172">Gruppe erstellen</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb index b9d48077..095ff16 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_el.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Κατάργηση ομαδοπ. καρτέλας}other{Κατάργηση ομαδοπ. καρτελών}}</translation> <translation id="2277224997687551299">Επεξεργασία ονόματος ομάδας</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Δημιουργία σελιδ. καρτέλας}other{Δημιουργία σελιδ. καρτελών}}</translation> -<translation id="2479148705183875116">Μετάβαση στις Ρυθμίσεις</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Συμπτύξτε <ph name="TABS_COUNT_ONE" /> καρτέλα.}other{Συμπτύξτε την ομάδα καρτελών με τις <ph name="TABS_COUNT_MANY" /> καρτέλες.}}</translation> <translation id="2569352796411618312">Πρόταση: <ph name="NUMBER_OF_TABS" /> από τις καρτέλες σας δεν έχουν χρησιμοποιηθεί πρόσφατα. Κλείσιμο αυτών των καρτελών;</translation> <translation id="2613747923081026172">Δημιουργία ομάδας</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb index 634324d..7d85196 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_en-GB.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Ungroup tab}other{Ungroup tabs}}</translation> <translation id="2277224997687551299">Edit group name</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Bookmark tab}other{Bookmark tabs}}</translation> -<translation id="2479148705183875116">Go to Settings</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Collapse <ph name="TABS_COUNT_ONE" /> tab.}other{Collapse tab group with <ph name="TABS_COUNT_MANY" /> tabs.}}</translation> <translation id="2569352796411618312">Suggestion: <ph name="NUMBER_OF_TABS" /> of your tabs haven't been used lately. Close them?</translation> <translation id="2613747923081026172">Create group</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb index 85a98da..497e48a6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es-419.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar pestaña}other{Desagrupar pestañas}}</translation> <translation id="2277224997687551299">Editar nombre del grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Agregar a favoritos}other{Agregar a favoritos}}</translation> -<translation id="2479148705183875116">Ir a Configuración</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Contraer <ph name="TABS_COUNT_ONE" /> pestaña}other{Contraer el grupo de pestañas, el cual tiene <ph name="TABS_COUNT_MANY" /> pestañas}}</translation> <translation id="2569352796411618312">Sugerencia: Últimamente no usaste <ph name="NUMBER_OF_TABS" /> de tus pestañas. ¿Quieres cerrarlas?</translation> <translation id="2613747923081026172">Crear grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb index d3fa334..6e40be09 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_es.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar pestaña}other{Desagrupar pestañas}}</translation> <translation id="2277224997687551299">Editar nombre de grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Añadir pestaña a marcadores}other{Añadir a marcadores}}</translation> -<translation id="2479148705183875116">Ve a Ajustes</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Ocultar <ph name="TABS_COUNT_ONE" /> pestaña}other{Ocultar grupo de pestañas con <ph name="TABS_COUNT_MANY" /> pestañas}}</translation> <translation id="2569352796411618312">Sugerencia: <ph name="NUMBER_OF_TABS" /> de las pestañas no se han usado recientemente. ¿Quieres cerrarlas?</translation> <translation id="2613747923081026172">Crear grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb index dba80e9c..32913a4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_et.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Tühista vahelehe grupeerimine}other{Tühista vahelehtede grupeerimine}}</translation> <translation id="2277224997687551299">Grupi nime muutmine</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Lisa vaheleht järjehoidjatesse}other{Lisa vahelehed järjehoidjatesse}}</translation> -<translation id="2479148705183875116">Ava seaded</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Ahenda <ph name="TABS_COUNT_ONE" /> vaheleht.}other{Ahenda <ph name="TABS_COUNT_MANY" /> vahelehega vahelehegrupp.}}</translation> <translation id="2569352796411618312">Soovitus: <ph name="NUMBER_OF_TABS" /> vahelehte pole hiljuti kasutatud. Kas sulgeda need?</translation> <translation id="2613747923081026172">Loo grupp</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb index b5af248..d96c16cc 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_eu.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Kendu fitxa taldetik}other{Kendu fitxak taldetik}}</translation> <translation id="2277224997687551299">Editatu taldearen izena</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Egin fitxaren laster-marka}other{Egin fitxen laster-markak}}</translation> -<translation id="2479148705183875116">Joan "Ezarpenak" atalera</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Tolestu <ph name="TABS_COUNT_ONE" /> fitxa.}other{Tolestu <ph name="TABS_COUNT_MANY" /> fitxa dituen fitxa taldea.}}</translation> <translation id="2569352796411618312">Iradokizuna: fitxetako <ph name="NUMBER_OF_TABS" /> ez dira erabili azkenaldian. Itxi nahi dituzu?</translation> <translation id="2613747923081026172">Sortu talde bat</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb index 799662a..a031094 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fa.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{لغو گروهبندی برگه}one{لغو گروهبندی برگه}other{لغو گروهبندی برگهها}}</translation> <translation id="2277224997687551299">ویرایش نام گروه</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{نشانکگذاری برگه}one{نشانکگذاری برگه}other{نشانکگذاری برگهها}}</translation> -<translation id="2479148705183875116">رفتن به تنظیمات</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{جمع کردن <ph name="TABS_COUNT_ONE" /> برگه.}one{جمع کردن گروه برگه با <ph name="TABS_COUNT_MANY" /> برگه.}other{جمع کردن گروه برگه با <ph name="TABS_COUNT_MANY" /> برگه.}}</translation> <translation id="2569352796411618312">پیشنهاد: <ph name="NUMBER_OF_TABS" /> مورد از برگههایتان اخیراً استفاده نشدهاند. آنها را میبندید؟</translation> <translation id="2613747923081026172">ایجاد گروه</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb index aba6bf9..77b68ff 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fi.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Poista välilehden ryhmittely}other{Poista välilehtien ryhmittely}}</translation> <translation id="2277224997687551299">Muokkaa ryhmän nimeä</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Aseta välilehti kirjanmerkiksi}other{Aseta välilehdet kirjanmerkeiksi}}</translation> -<translation id="2479148705183875116">Avaa Asetukset</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Tiivistä <ph name="TABS_COUNT_ONE" /> välilehti.}other{Tiivistä välilehtiryhmä, jossa on <ph name="TABS_COUNT_MANY" /> välilehteä.}}</translation> <translation id="2569352796411618312">Ehdotus: <ph name="NUMBER_OF_TABS" /> välilehteä ei ole käytetty vähään aikaan. Suljetaanko ne?</translation> <translation id="2613747923081026172">Luo ryhmä</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb index eb4e1ad..aa50c37 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fil.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{I-ungroup ang tab}one{I-ungroup ang mga tab}other{I-ungroup ang mga tab}}</translation> <translation id="2277224997687551299">I-edit ang pangalan ng grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{I-bookmark ang tab}one{I-bookmark ang mga tab}other{I-bookmark ang mga tab}}</translation> -<translation id="2479148705183875116">Pumunta sa Mga Setting</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{I-collapse ang <ph name="TABS_COUNT_ONE" /> tab.}one{I-collapse ang grupo ng tab na may <ph name="TABS_COUNT_MANY" /> tab.}other{I-collapse ang grupo ng tab na may <ph name="TABS_COUNT_MANY" /> na tab.}}</translation> <translation id="2569352796411618312">Suhestyon: <ph name="NUMBER_OF_TABS" /> sa iyong mga tab ang hindi nagamit nitong nakaraan. Isara ang mga ito?</translation> <translation id="2613747923081026172">Gumawa ng pangkat</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb index c49783a..0699562 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr-CA.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Retirer un onglet du groupe}one{Retirer un onglet du groupe}other{Dégrouper des onglets}}</translation> <translation id="2277224997687551299">Modifier le nom du groupe</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Onglet des favoris}one{Onglet des favoris}other{Onglets des favoris}}</translation> -<translation id="2479148705183875116">Accéder aux paramètres</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Réduire <ph name="TABS_COUNT_ONE" /> onglet.}one{Réduire le groupe d'onglets qui contient <ph name="TABS_COUNT_MANY" /> onglet.}other{Réduire le groupe d'onglets qui contient <ph name="TABS_COUNT_MANY" /> onglets.}}</translation> <translation id="2569352796411618312">Suggestion : <ph name="NUMBER_OF_TABS" /> de vos onglets n'ont pas été utilisés récemment. Les fermer?</translation> <translation id="2613747923081026172">Créer un groupe</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb index 5c90842..b8701d89 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_fr.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Dégrouper l'onglet}one{Dégrouper l'onglet}other{Dégrouper les onglets}}</translation> <translation id="2277224997687551299">Modifier le nom du groupe</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Ajouter onglet aux favoris}one{Ajouter onglet aux favoris}other{Ajouter onglets aux favoris}}</translation> -<translation id="2479148705183875116">Accéder aux paramètres</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Réduisez <ph name="TABS_COUNT_ONE" /> onglet.}one{Réduisez le groupe d'onglets qui contient <ph name="TABS_COUNT_MANY" /> onglets.}other{Réduisez le groupe d'onglets qui contient <ph name="TABS_COUNT_MANY" /> onglets.}}</translation> <translation id="2569352796411618312">Suggestion : <ph name="NUMBER_OF_TABS" /> des onglets ouverts n'ont pas été utilisés récemment. Voulez-vous les fermer ?</translation> <translation id="2613747923081026172">Créer un groupe</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb index 51a80708..524560d2 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gl.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar pestana}other{Desagrupar pestanas}}</translation> <translation id="2277224997687551299">Editar nome do grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Engadir pestana aos marcadores}other{Engadir pestanas aos marcadores}}</translation> -<translation id="2479148705183875116">Ir a Configuración</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Contraer <ph name="TABS_COUNT_ONE" /> pestana.}other{Contraer grupo de pestanas con <ph name="TABS_COUNT_MANY" /> pestanas.}}</translation> <translation id="2569352796411618312">Suxestión: <ph name="NUMBER_OF_TABS" /> das pestanas que tes abertas levan sen utilizarse un bo anaco. Queres pechalas?</translation> <translation id="2613747923081026172">Crear grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb index 5351687..804c0bd 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_gu.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ટૅબ અનગ્રૂપ કરો}one{ટૅબ અનગ્રૂપ કરો}other{ટૅબ અનગ્રૂપ કરો}}</translation> <translation id="2277224997687551299">ગ્રૂપના નામમાં ફેરફાર કરો</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ટૅબને બુકમાર્ક કરો}one{ટૅબને બુકમાર્ક કરો}other{ટૅબને બુકમાર્ક કરો}}</translation> -<translation id="2479148705183875116">સેટિંગ પર જાઓ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ટૅબ નાની કરો.}one{<ph name="TABS_COUNT_MANY" /> ટૅબ ધરાવતા ટૅબ ગ્રૂપને નાનું કરો.}other{<ph name="TABS_COUNT_MANY" /> ટૅબ ધરાવતા ટૅબ ગ્રૂપને નાનું કરો.}}</translation> <translation id="2569352796411618312">સૂચન: હજુ સુધી તમારા ટૅબમાંથી <ph name="NUMBER_OF_TABS" /> ટૅબનો ઉપયોગ કરવામાં આવ્યો નથી. તેને બંધ કરીએ?</translation> <translation id="2613747923081026172">ગ્રૂપ બનાવો</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb index 541b6ed..bed7aa527 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hi.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{टैब को ग्रुप से अलग करें}one{टैब को ग्रुप से अलग करें}other{टैब को ग्रुप से अलग करें}}</translation> <translation id="2277224997687551299">ग्रुप के नाम में बदलाव करें</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{बुकमार्क टैब}one{बुकमार्क टैब}other{बुकमार्क टैब}}</translation> -<translation id="2479148705183875116">सेटिंग पर जाएं</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> टैब छोटा करें.}one{<ph name="TABS_COUNT_MANY" /> टैब वाले टैब ग्रुप को छोटा करें.}other{<ph name="TABS_COUNT_MANY" /> टैब वाले टैब ग्रुप को छोटा करें.}}</translation> <translation id="2569352796411618312">सुझाव: आपके <ph name="NUMBER_OF_TABS" /> टैब का हाल ही में इस्तेमाल नहीं हुआ है. क्या आप उन्हें बंद करना चाहते हैं?</translation> <translation id="2613747923081026172">समूह बनाएं</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb index d971d05e..c6431b76 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hr.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Ukloni karticu iz grupe}one{Ukloni kartice iz grupe}few{Ukloni kartice iz grupe}other{Ukloni kartice iz grupe}}</translation> <translation id="2277224997687551299">Uredi naziv grupe</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Označi karticu}one{Označi kartice}few{Označi kartice}other{Označi kartice}}</translation> -<translation id="2479148705183875116">Otvori Postavke</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Sažmi <ph name="TABS_COUNT_ONE" /> karticu.}one{Sažmi grupu kartica koja sadrži <ph name="TABS_COUNT_MANY" /> karticu.}few{Sažmi grupu kartica koja sadrži <ph name="TABS_COUNT_MANY" /> kartice.}other{Sažmi grupu kartica koja sadrži <ph name="TABS_COUNT_MANY" /> kartica.}}</translation> <translation id="2569352796411618312">Prijedlog: broj vaših kartica koje niste koristili neko vrijeme: <ph name="NUMBER_OF_TABS" />. Želite li ih zatvoriti?</translation> <translation id="2613747923081026172">Izradi grupu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb index 850f568..44b0784e 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hu.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Lap kivétele a csoportból}other{Lapok kivétele a csoportból}}</translation> <translation id="2277224997687551299">Csoportnév szerkesztése</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Felvétel a könyvjelzők közé}other{Felvétel a könyvjelzők közé}}</translation> -<translation id="2479148705183875116">Beállítások</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> lap összecsukása.}other{<ph name="TABS_COUNT_MANY" /> lapot tartalmazó lapcsoport összecsukása.}}</translation> <translation id="2569352796411618312">Javaslat: <ph name="NUMBER_OF_TABS" /> lapot nem használt mostanában. Szeretné bezárni őket?</translation> <translation id="2613747923081026172">Csoport létrehozása</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb index b71969f..e961fc1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_hy.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Հեռացնել ներդիրը խմբից}one{Հեռացնել ներդիրը խմբից}other{Հեռացնել ներդիրները խմբից}}</translation> <translation id="2277224997687551299">Փոփոխել խմբի անունը</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Էջանշել ներդիրը}one{Էջանշել ներդիրը}other{Էջանշել ներդիրները}}</translation> -<translation id="2479148705183875116">Անցնել կարգավորումներ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Ծալել <ph name="TABS_COUNT_ONE" /> ներդիր։}one{Ծալել <ph name="TABS_COUNT_MANY" /> ներդիրից բաղկացած խումբը։}other{Ծալել <ph name="TABS_COUNT_MANY" /> ներդիրից բաղկացած խումբը։}}</translation> <translation id="2569352796411618312">Ձեր ներդիրներից <ph name="NUMBER_OF_TABS" />-ը վաղուց չեք օգտագործել։ Փակե՞լ դրանք։</translation> <translation id="2613747923081026172">Ստեղծել խումբ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb index e0bf888..10c13fd 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_id.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Pisahkan tab}other{Pisahkan tab}}</translation> <translation id="2277224997687551299">Edit nama grup</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Bookmark tab}other{Bookmark tab}}</translation> -<translation id="2479148705183875116">Buka Setelan</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Ciutkan <ph name="TABS_COUNT_ONE" /> tab.}other{Ciutkan grup tab yang berisi <ph name="TABS_COUNT_MANY" /> tab.}}</translation> <translation id="2569352796411618312">Saran: <ph name="NUMBER_OF_TABS" /> dari beberapa tab Anda belum digunakan akhir-akhir ini. Tutup?</translation> <translation id="2613747923081026172">Buat grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb index a4eb1e3..3f870f03 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_is.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Taka flipa úr hópi}one{Taka flipa úr hópi}other{Taka flipa úr hópi}}</translation> <translation id="2277224997687551299">Breyta heiti hóps</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Bókamerkja flipa}one{Bókamerkja flipa}other{Bókamerkja flipa}}</translation> -<translation id="2479148705183875116">Opna stillingar</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Draga saman <ph name="TABS_COUNT_ONE" /> flipa.}one{Draga saman flipahóp með <ph name="TABS_COUNT_MANY" /> flipa.}other{Draga saman flipahóp með <ph name="TABS_COUNT_MANY" /> flipum.}}</translation> <translation id="2569352796411618312">Tillaga: <ph name="NUMBER_OF_TABS" /> af flipunum þínum hafa ekki verið notaðir nýlega. Viltu loka þeim?</translation> <translation id="2613747923081026172">Búa til hóp</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb index 64ff42f1..830412bb 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_it.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Separa scheda}other{Separa schede}}</translation> <translation id="2277224997687551299">Modifica nome gruppo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Aggiungi scheda a preferiti}other{Aggiungi schede a preferiti}}</translation> -<translation id="2479148705183875116">Vai a Impostazioni</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Comprimi <ph name="TABS_COUNT_ONE" /> scheda.}other{Comprimi il gruppo di schede con <ph name="TABS_COUNT_MANY" /> schede.}}</translation> <translation id="2569352796411618312">Suggerimento: <ph name="NUMBER_OF_TABS" /> delle tue schede non sono state usate ultimamente. Vuoi chiuderle?</translation> <translation id="2613747923081026172">Crea gruppo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb index eaf8264a..7b49e4a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_iw.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{הסרת הכרטיסייה מהקבוצה}one{הסרת הכרטיסיות מהקבוצה}two{הסרת הכרטיסיות מהקבוצה}other{הסרת הכרטיסיות מהקבוצה}}</translation> <translation id="2277224997687551299">עריכת שם הקבוצה</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{הוספת הכרטיסייה לסימניות}one{הוספת הכרטיסיות לסימניות}two{הוספת הכרטיסיות לסימניות}other{הוספת הכרטיסיות לסימניות}}</translation> -<translation id="2479148705183875116">למעבר אל ההגדרות</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{כיווץ כרטיסייה אחת (<ph name="TABS_COUNT_ONE" />).}one{כיווץ של קבוצת הכרטיסיות עם <ph name="TABS_COUNT_MANY" /> כרטיסיות.}two{כיווץ של קבוצת הכרטיסיות עם <ph name="TABS_COUNT_MANY" /> כרטיסיות.}other{כיווץ של קבוצת הכרטיסיות עם <ph name="TABS_COUNT_MANY" /> כרטיסיות.}}</translation> <translation id="2569352796411618312">הצעה: <ph name="NUMBER_OF_TABS" /> מהכרטיסיות לא היו בשימוש לאחרונה. לסגור אותן?</translation> <translation id="2613747923081026172">יצירת קבוצה</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb index ab310d0..60d5721 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ja.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{タブのグループ化を解除する}other{タブのグループ化を解除する}}</translation> <translation id="2277224997687551299">グループ名を編集</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{タブをブックマークに追加}other{タブをブックマークに追加}}</translation> -<translation id="2479148705183875116">設定に移動</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> 個のタブを折りたたみます。}other{タブグループの <ph name="TABS_COUNT_MANY" /> 個のタブを折りたたみます。}}</translation> <translation id="2569352796411618312">提案: しばらく使用していないタブが <ph name="NUMBER_OF_TABS" /> 個あります。これらのタブを閉じますか?</translation> <translation id="2613747923081026172">グループを作成</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb index cd50dfba..802b6cd 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ka.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ჩანართის დაჯგუფების გაუქმება}other{ჩანართების დაჯგუფების გაუქმება}}</translation> <translation id="2277224997687551299">ჯგუფის სახელის რედაქტირება</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ჩანართის დამატება სანიშნეებში}other{ჩანართების დამატება სანიშნეებში}}</translation> -<translation id="2479148705183875116">პარამეტრებზე გადასვლა</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ჩანართის ჩაკეცვა.}other{ჩანართების <ph name="TABS_COUNT_MANY" />-ჩანართიანი ჯგუფის ჩაკეცვა.}}</translation> <translation id="2569352796411618312">შემოთავაზება: თქვენი <ph name="NUMBER_OF_TABS" /> ჩანართი ბოლო დროს არ გამოგიყენებიათ. გსურთ მათი დახურვა?</translation> <translation id="2613747923081026172">ჯგუფის შექმნა</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb index 7e7f704..3df07ae 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kk.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Қойындыны топтан шығару}other{Қойындыларды топтан шығару}}</translation> <translation id="2277224997687551299">Топтың атауын өзгерту</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Қойындыға бетбелгі қою}other{Қойындыларға бетбелгі қою}}</translation> -<translation id="2479148705183875116">Параметрлерге өту</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> қойындысын жию.}other{<ph name="TABS_COUNT_MANY" /> қойындысы бар қойындылар тобын жию.}}</translation> <translation id="2569352796411618312">Ұсыныс: <ph name="NUMBER_OF_TABS" /> қойынды біраздан бері пайдаланылмады. Олар жабылсын ба?</translation> <translation id="2613747923081026172">Топ құру</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb index 57fe003..50c93e0 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_km.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{បំបែកក្រុមផ្ទាំង}other{បំបែកក្រុមផ្ទាំង}}</translation> <translation id="2277224997687551299">កែឈ្មោះក្រុម</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ចំណាំផ្ទាំង}other{ចំណាំផ្ទាំង}}</translation> -<translation id="2479148705183875116">ចូលទៅកាន់ការកំណត់</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{បង្រួមផ្ទាំង <ph name="TABS_COUNT_ONE" />។}other{បង្រួមក្រុមផ្ទាំងដែលមាន <ph name="TABS_COUNT_MANY" />ផ្ទាំង។}}</translation> <translation id="2569352796411618312">ការណែនាំ៖ ផ្ទាំង <ph name="NUMBER_OF_TABS" /> របស់អ្នកមិនត្រូវបានប្រើទេនាពេលថ្មីៗនេះ។ បិទផ្ទាំងទាំងនោះឬ?</translation> <translation id="2613747923081026172">បង្កើតក្រុម</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb index bad50aa..f2410a1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_kn.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ಟ್ಯಾಬ್ನ ಗುಂಪನ್ನು ರದ್ದುಮಾಡಿ}one{ಟ್ಯಾಬ್ಗಳ ಗುಂಪನ್ನು ರದ್ದುಮಾಡಿ}other{ಟ್ಯಾಬ್ಗಳ ಗುಂಪನ್ನು ರದ್ದುಮಾಡಿ}}</translation> <translation id="2277224997687551299">ಗುಂಪಿನ ಹೆಸರನ್ನು ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ಬುಕ್ಮಾರ್ಕ್ ಟ್ಯಾಬ್}one{ಬುಕ್ಮಾರ್ಕ್ ಟ್ಯಾಬ್ಗಳು}other{ಬುಕ್ಮಾರ್ಕ್ ಟ್ಯಾಬ್ಗಳು}}</translation> -<translation id="2479148705183875116">ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ಟ್ಯಾಬ್ ಅನ್ನು ಕುಗ್ಗಿಸಿ.}one{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್ಗಳ ಜೊತೆಗೆ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ಕುಗ್ಗಿಸಿ.}other{<ph name="TABS_COUNT_MANY" /> ಟ್ಯಾಬ್ಗಳ ಜೊತೆಗೆ ಟ್ಯಾಬ್ ಗುಂಪನ್ನು ಕುಗ್ಗಿಸಿ.}}</translation> <translation id="2569352796411618312">ಸಲಹೆ: ನೀವು ಈ ನಡುವೆ ಬಳಸದ <ph name="NUMBER_OF_TABS" /> ಟ್ಯಾಬ್ಗಳಿವೆ. ಅವುಗಳನ್ನು ಮುಚ್ಚಬೇಕೆ?</translation> <translation id="2613747923081026172">ಗುಂಪನ್ನು ರಚಿಸಿ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb index 3d8bbac..65c415d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ko.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{탭 그룹 해제}other{탭 그룹 해제}}</translation> <translation id="2277224997687551299">그룹 이름 수정</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{북마크 탭}other{북마크 탭}}</translation> -<translation id="2479148705183875116">설정으로 이동</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{탭 <ph name="TABS_COUNT_ONE" />개를 접습니다.}other{탭 <ph name="TABS_COUNT_MANY" />개가 포함된 탭 그룹을 접습니다.}}</translation> <translation id="2569352796411618312">추천: 최근 사용하지 않은 탭이 <ph name="NUMBER_OF_TABS" />개 있습니다. 탭을 닫으시겠습니까?</translation> <translation id="2613747923081026172">그룹 만들기</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb index 6300134..acf71f7 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ky.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Өтмөктү топтон ажыратуу}other{Өтмөктөрдү топтон ажыратуу}}</translation> <translation id="2277224997687551299">Топтун аталышын өзгөртүү</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Кыстарылган өтмөк}other{Кыстарылган өтмөктөр}}</translation> -<translation id="2479148705183875116">Жөндөөлөргө өтүү</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> өтмөк жыйыштырылсын.}other{<ph name="TABS_COUNT_MANY" /> өтмөктөн турган өтмөктөр тобу жыйыштырылсын.}}</translation> <translation id="2569352796411618312">Сунуш: Өтмөктөрүңүздүн <ph name="NUMBER_OF_TABS" /> акыркы убакта колдонулган жок. Алар жабылсынбы?</translation> <translation id="2613747923081026172">Топ түзүү</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb index 9b571026..e0a29f6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lo.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ຍົກເລີກການຈັດກຸ່ມແຖບ}other{ຍົກເລີກການຈັດກຸ່ມແຖບ}}</translation> <translation id="2277224997687551299">ແກ້ໄຂຊື່ກຸ່ມ</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ແຖບບຸກມາກ}other{ແຖບບຸກມາກ}}</translation> -<translation id="2479148705183875116">ໄປທີ່ການຕັ້ງຄ່າ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{ຫຍໍ້ <ph name="TABS_COUNT_ONE" /> ແຖບລົງ.}other{ຫຍໍ້ກຸ່ມແຖບທີ່ມີ <ph name="TABS_COUNT_MANY" /> ແຖບແລ້ວ.}}</translation> <translation id="2569352796411618312">ການແນະນຳ: ທ່ານບໍ່ໄດ້ໃຊ້ແຖບຂອງທ່ານ <ph name="NUMBER_OF_TABS" /> ແຖບມາໄລຍະໜຶ່ງແລ້ວ. ປິດພວກມັນບໍ?</translation> <translation id="2613747923081026172">ສ້າງກຸ່ມ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb index b18a40d..ec46758 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lt.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Išgrupuoti skirtuką}one{Išgrupuoti skirtukus}few{Išgrupuoti skirtukus}many{Išgrupuoti skirtukus}other{Išgrupuoti skirtukus}}</translation> <translation id="2277224997687551299">Redaguoti grupės pavadinimą</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Pažymėti skirtuką}one{Pažymėti skirtukus}few{Pažymėti skirtukus}many{Pažymėti skirtukus}other{Pažymėti skirtukus}}</translation> -<translation id="2479148705183875116">Eiti į nustatymus</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Sutraukti <ph name="TABS_COUNT_ONE" /> skirtuką.}one{Sutraukti skirtukų grupę, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukas.}few{Sutraukti skirtukų grupę, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukai.}many{Sutraukti skirtukų grupę, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtuko.}other{Sutraukti skirtukų grupę, kurioje yra <ph name="TABS_COUNT_MANY" /> skirtukų.}}</translation> <translation id="2569352796411618312">Pasiūlymas: pastaruoju metu nebuvo naudojama <ph name="NUMBER_OF_TABS" /> skirtuk. Uždaryti juos?</translation> <translation id="2613747923081026172">Sukurti grupę</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb index dad73a3..503eac4 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_lv.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Atcelt cilnes grupēšanu}zero{Atcelt ciļņu grupēšanu}one{Atcelt ciļņu grupēšanu}other{Atcelt ciļņu grupēšanu}}</translation> <translation id="2277224997687551299">Rediģēt grupas nosaukumu</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Saglabāt kā grāmatzīmi}zero{Saglabāt kā grāmatzīmes}one{Saglabāt kā grāmatzīmes}other{Saglabāt kā grāmatzīmes}}</translation> -<translation id="2479148705183875116">Atvērt iestatījumus</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Sakļaut <ph name="TABS_COUNT_ONE" /> cilni.}zero{Sakļaut ciļņu grupu, kurā ir <ph name="TABS_COUNT_MANY" /> cilnes.}one{Sakļaut ciļņu grupu, kurā ir <ph name="TABS_COUNT_MANY" /> cilne.}other{Sakļaut ciļņu grupu, kurā ir <ph name="TABS_COUNT_MANY" /> cilnes.}}</translation> <translation id="2569352796411618312">Ieteikums: vairākas cilnes pēdējā laikā nav izmantotas (kopā <ph name="NUMBER_OF_TABS" />). Vai vēlaties tās aizvērt?</translation> <translation id="2613747923081026172">Izveidot grupu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mk.xtb index 9b9d9cee..47fb2f3 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mk.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Одгрупирај ја картичката}one{Одгрупирај ги картичките}other{Одгрупирај ги картичките}}</translation> <translation id="2277224997687551299">Изменете го името на групата</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Обележи ја картичката}one{Обележи ги картичките}other{Обележи ги картичките}}</translation> -<translation id="2479148705183875116">Одете во „Поставки“</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Собери <ph name="TABS_COUNT_ONE" /> картичка.}one{Собери ја групата со <ph name="TABS_COUNT_MANY" /> картичка.}other{Собери ја групата со <ph name="TABS_COUNT_MANY" /> картички.}}</translation> <translation id="2569352796411618312">Предлог: <ph name="NUMBER_OF_TABS" /> ваши картички не се користени во последно време. Дали да се затворат?</translation> <translation id="2613747923081026172">Создај група</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb index ac83c30..015cd37a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ml.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ടാബ് അൺഗ്രൂപ്പ് ചെയ്യുക}other{ടാബുകൾ അൺഗ്രൂപ്പ് ചെയ്യുക}}</translation> <translation id="2277224997687551299">ഗ്രൂപ്പിന്റെ പേര് എഡിറ്റ് ചെയ്യുക</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ടാബ് ബുക്ക്മാർക്ക് ചെയ്യുക}other{ടാബുകൾ ബുക്ക്മാർക്ക് ചെയ്യുക}}</translation> -<translation id="2479148705183875116">ക്രമീകരണത്തിലേക്ക് പോകുക</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ടാബ് ചുരുക്കുക.}other{<ph name="TABS_COUNT_MANY" /> ടാബുകളുള്ള ടാബ് ഗ്രൂപ്പ് ചുരുക്കുക.}}</translation> <translation id="2569352796411618312">നിർദ്ദേശം: നിങ്ങളുടെ ടാബുകളിൽ <ph name="NUMBER_OF_TABS" /> എണ്ണം അടുത്തിടെ ഉപയോഗിച്ചിട്ടില്ല. അവ അടയ്ക്കണോ?</translation> <translation id="2613747923081026172">ഗ്രൂപ്പ് സൃഷ്ടിക്കുക</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb index 8ed4ecaaf..bb112dc 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mn.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Табыг бүлэглэхээ болих}other{Табуудыг бүлэглэхээ болих}}</translation> <translation id="2277224997687551299">Бүлгийн нэрийг засах</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Табыг тэмдэглэх}other{Табуудыг тэмдэглэх}}</translation> -<translation id="2479148705183875116">Тохиргоо руу очих</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> табыг хураах.}other{<ph name="TABS_COUNT_MANY" /> таб бүхий бүлэг табыг хураах.}}</translation> <translation id="2569352796411618312">Зөвлөмж: Таны табуудаас <ph name="NUMBER_OF_TABS" />-г нь сүүлийн үед ашиглаагүй байна. Тэдгээрийг хаах уу?</translation> <translation id="2613747923081026172">Бүлэг үүсгэх</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb index 96a2ad9..1decebf9 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_mr.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{टॅब गटामधून काढून टाका}other{टॅब गटामधून काढून टाका}}</translation> <translation id="2277224997687551299">गटाचे नाव संपादित करा</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{टॅब बुकमार्क करा}other{टॅब बुकमार्क करा}}</translation> -<translation id="2479148705183875116">सेटिंग्ज वर जा</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> टॅब कोलॅप्स करा.}other{<ph name="TABS_COUNT_MANY" /> टॅबचा गट असलेले टॅब कोलॅप्स करा.}}</translation> <translation id="2569352796411618312">सूचना: तुमच्या टॅबपैकी <ph name="NUMBER_OF_TABS" /> चा काही दिवसांपासून वापर केला गेला नाही. ते बंद करायचे आहेत का?</translation> <translation id="2613747923081026172">गट तयार करा</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb index e265d13f..a5f1922 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ms.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Nyahkumpulkan tab}other{Nyahkumpulkan tab}}</translation> <translation id="2277224997687551299">Edit nama kumpulan</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Tandai halaman tab}other{Tandai halaman tab}}</translation> -<translation id="2479148705183875116">Pergi ke Tetapan</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Runtuhkan <ph name="TABS_COUNT_ONE" /> tab.}other{Runtuhkan kumpulan tab dengan <ph name="TABS_COUNT_MANY" /> tab.}}</translation> <translation id="2569352796411618312">Cadangan: <ph name="NUMBER_OF_TABS" /> daripada tab anda sudah lama tidak digunakan. Tutup tab?</translation> <translation id="2613747923081026172">Buat kumpulan</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb index 679306b..9e8c697 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_my.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{တဘ် အုပ်စုဖြုတ်ရန်}other{တဘ်များ အုပ်စုဖြုတ်ရန်}}</translation> <translation id="2277224997687551299">အဖွဲ့အမည်ကို တည်းဖြတ်ရန်</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{တဘ်ကို လိပ်စာမှတ်ရန်}other{တဘ်များကို လိပ်စာမှတ်ရန်}}</translation> -<translation id="2479148705183875116">'ဆက်တင်များ' သို့ သွားရန်</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> တဘ်ကို ခေါက်ပါ။}other{တဘ် <ph name="TABS_COUNT_MANY" /> ခုဖြင့် တဘ်အုပ်စု လျှော့ပြပါ။}}</translation> <translation id="2569352796411618312">အကြံပြုချက်- သင်၏တဘ် <ph name="NUMBER_OF_TABS" /> ခုကို အခုတစ်လော အသုံးပြုမထားပါ။ ၎င်းတို့ကို ပိတ်မလား။</translation> <translation id="2613747923081026172">အုပ်စုဖွဲ့ရန်</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb index 0075744..94c3963 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ne.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{समूहबाट ट्याब हटाउनुहोस्}other{समूहबाट ट्याबहरू हटाउनुहोस्}}</translation> <translation id="2277224997687551299">समूहको नाम परिवर्तन गर्नुहोस्</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ट्याब बुकमार्क गर्नुहोस्}other{ट्याबहरू बुकमार्क गर्नुहोस्}}</translation> -<translation id="2479148705183875116">सेटिङमा जानुहोस्</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ट्याब संक्षिप्त गर्नुहोस्।}other{<ph name="TABS_COUNT_MANY" /> वटा ट्याब भएको ट्याब समूह संक्षिप्त गर्नुहोस्।}}</translation> <translation id="2569352796411618312">सुझाव: तपाईंले केही समय यता आफ्ना <ph name="NUMBER_OF_TABS" /> वटा ट्याबहरू प्रयोग गर्नुभएको छैन। तिनलाई बन्द गर्ने हो?</translation> <translation id="2613747923081026172">समूह सिर्जना गर्नुहोस्</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb index eaf060b..742b2e8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_nl.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Tab uit groep verwijderen}other{Tabs uit groep verwijderen}}</translation> <translation id="2277224997687551299">Groepsnaam bewerken</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Tabblad bookmarken}other{Tabbladen bookmarken}}</translation> -<translation id="2479148705183875116">Naar Instellingen</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> tabblad samenvouwen.}other{Tabbladgroep met <ph name="TABS_COUNT_MANY" /> tabbladen samenvouwen.}}</translation> <translation id="2569352796411618312">Suggestie: <ph name="NUMBER_OF_TABS" /> van je tabbladen zijn niet recent gebruikt. Wil je ze sluiten?</translation> <translation id="2613747923081026172">Groep maken</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb index 2c88cc9..0875626 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_no.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Fjern fanen fra gruppen}other{Fjern fanene fra gruppen}}</translation> <translation id="2277224997687551299">Endre gruppenavnet</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Sett fanen som bokmerke}other{Sett fanene som bokmerker}}</translation> -<translation id="2479148705183875116">Gå til Innstillinger</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Skjul <ph name="TABS_COUNT_ONE" /> fane.}other{Skjul fanegruppe med <ph name="TABS_COUNT_MANY" /> faner.}}</translation> <translation id="2569352796411618312">Forslag: <ph name="NUMBER_OF_TABS" /> av fanene dine er ikke brukt i det siste. Vil du lukke dem?</translation> <translation id="2613747923081026172">Opprett en gruppe</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb index caea3813..350b6fe 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_or.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ଟାବକୁ ଗୋଷ୍ଠୀଭୁକ୍ତ କର ନାହିଁ}other{ଟାବକୁ ଗୋଷ୍ଠୀଭୁକ୍ତ କର ନାହିଁ}}</translation> <translation id="2277224997687551299">ଗ୍ରୁପ ନାମ ଏଡିଟ୍ କରନ୍ତୁ</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ଟାବକୁ ବୁକମାର୍କ କରନ୍ତୁ}other{ଟାବକୁ ବୁକମାର୍କ କରନ୍ତୁ}}</translation> -<translation id="2479148705183875116">ସେଟିଂସକୁ ଯାଆନ୍ତୁ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" />ଟି ଟାବ୍ ସଙ୍କୁଚିତ କରନ୍ତୁ।}other{<ph name="TABS_COUNT_MANY" />ଟି ଟାବ୍ ଥିବା ଟାବ୍ ଗ୍ରୁପକୁ ସଙ୍କୁଚିତ କରନ୍ତୁ।}}</translation> <translation id="2569352796411618312">ପ୍ରସ୍ତାବ: ଆପଣଙ୍କର <ph name="NUMBER_OF_TABS" />ଟି ଟାବ୍ ନିକଟରେ ବ୍ୟବହୃତ ହୋଇନାହିଁ। ସେଗୁଡ଼ିକୁ ବନ୍ଦ କରିବେ?</translation> <translation id="2613747923081026172">ଗୋଷ୍ଠୀ ତିଆରି କରନ୍ତୁ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb index d5afda47..5ed53989 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pa.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ਟੈਬ ਨੂੰ ਅਣ-ਗਰੁੱਪਬੱਧ ਕਰੋ}one{ਟੈਬ ਨੂੰ ਅਣ-ਗਰੁੱਪਬੱਧ ਕਰੋ}other{ਟੈਬਾਂ ਨੂੰ ਅਣ-ਗਰੁੱਪਬੱਧ ਕਰੋ}}</translation> <translation id="2277224997687551299">ਗਰੁੱਪ ਦੇ ਨਾਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ਟੈਬ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ}one{ਟੈਬ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ}other{ਟੈਬਾਂ ਨੂੰ ਬੁੱਕਮਾਰਕ ਕਰੋ}}</translation> -<translation id="2479148705183875116">ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ਟੈਬ ਨੂੰ ਸਮੇਟੋ।}one{<ph name="TABS_COUNT_MANY" /> ਟੈਬ ਵਾਲੇ ਟੈਬ ਗਰੁੱਪ ਨੂੰ ਸਮੇਟੋ।}other{<ph name="TABS_COUNT_MANY" /> ਟੈਬਾਂ ਵਾਲੇ ਟੈਬ ਗਰੁੱਪ ਨੂੰ ਸਮੇਟੋ।}}</translation> <translation id="2569352796411618312">ਸੁਝਾਅ: ਤੁਹਾਡੀਆਂ <ph name="NUMBER_OF_TABS" /> ਟੈਬਾਂ ਦੀ ਹਾਲ ਹੀ ਵਿੱਚ ਵਰਤੋਂ ਨਹੀਂ ਹੋਈ। ਕੀ ਉਹਨਾਂ ਨੂੰ ਬੰਦ ਕਰਨਾ ਹੈ?</translation> <translation id="2613747923081026172">ਗਰੁੱਪ ਬਣਾਓ</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb index 5a31086..0159a50 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pl.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Usuń kartę z grupy}few{Usuń karty z grupy}many{Usuń karty z grupy}other{Usuń karty z grupy}}</translation> <translation id="2277224997687551299">Edytuj nazwę grupy</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Dodaj kartę do zakładek}few{Dodaj karty do zakładek}many{Dodaj karty do zakładek}other{Dodaj karty do zakładek}}</translation> -<translation id="2479148705183875116">Otwórz Ustawienia</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Zwiń <ph name="TABS_COUNT_ONE" /> kartę.}few{Zwiń grupę kart z <ph name="TABS_COUNT_MANY" /> kartami.}many{Zwiń grupę kart z <ph name="TABS_COUNT_MANY" /> kartami.}other{Zwiń grupę kart z <ph name="TABS_COUNT_MANY" /> karty.}}</translation> <translation id="2569352796411618312">Sugestia: od jakiegoś czasu nie używasz <ph name="NUMBER_OF_TABS" /> kart. Zamknąć je?</translation> <translation id="2613747923081026172">Utwórz grupę</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb index 5663930b..755717a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-BR.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar guia}one{Desagrupar guia}other{Desagrupar guias}}</translation> <translation id="2277224997687551299">Editar nome do grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Adicionar guia aos favoritos}one{Adicionar guia aos favoritos}other{Adicionar guias aos favoritos}}</translation> -<translation id="2479148705183875116">Acessar as configurações</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Recolher <ph name="TABS_COUNT_ONE" /> guia.}one{Recolher grupo de guias com <ph name="TABS_COUNT_MANY" /> guia.}other{Recolher grupo de guias com <ph name="TABS_COUNT_MANY" /> guias.}}</translation> <translation id="2569352796411618312">Sugestão: <ph name="NUMBER_OF_TABS" /> das suas guias não foram usadas recentemente. Fechar todas elas?</translation> <translation id="2613747923081026172">Criar grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb index 8e049b3..6ad4eeb1 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_pt-PT.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Desagrupar separador}other{Desagrupar separadores}}</translation> <translation id="2277224997687551299">Editar nome do grupo</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Adic. separ. aos marcadores}other{Adic. separ. aos marcadores}}</translation> -<translation id="2479148705183875116">Aceder às Definições</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Reduza <ph name="TABS_COUNT_ONE" /> separador.}other{Reduza o grupo de separadores com <ph name="TABS_COUNT_MANY" /> separadores.}}</translation> <translation id="2569352796411618312">Sugestão: <ph name="NUMBER_OF_TABS" /> dos seus separadores não foram utilizados recentemente. Pretende fechá-los?</translation> <translation id="2613747923081026172">Criar grupo</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb index c2e86dc..3edadd6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ro.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Elimină fila din grup}few{Elimină filele din grup}other{Elimină filele din grup}}</translation> <translation id="2277224997687551299">Editează numele grupului</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Fila Marcaj}few{Filele Marcaj}other{Filele Marcaj}}</translation> -<translation id="2479148705183875116">Accesează Setările</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Restrânge <ph name="TABS_COUNT_ONE" /> filă.}few{Restrânge grupul de file cu <ph name="TABS_COUNT_MANY" /> file.}other{Restrânge grupul de file cu <ph name="TABS_COUNT_MANY" /> de file.}}</translation> <translation id="2569352796411618312">Sugestie: <ph name="NUMBER_OF_TABS" /> dintre file nu au fost folosite în ultima vreme. Vrei să le închizi?</translation> <translation id="2613747923081026172">Creează grupul</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb index 1788e8a7..8b2e099f 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ru.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Удалить вкладку из группы}one{Удалить вкладки из группы}few{Удалить вкладки из группы}many{Удалить вкладки из группы}other{Удалить вкладки из группы}}</translation> <translation id="2277224997687551299">Изменить название группы</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Добавить вкладку в закладки}one{Добавить вкладки в закладки}few{Добавить вкладки в закладки}many{Добавить вкладки в закладки}other{Добавить вкладки в закладки}}</translation> -<translation id="2479148705183875116">Открыть настройки</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Свернуть <ph name="TABS_COUNT_ONE" /> вкладку.}one{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки.}few{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок.}many{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладок.}other{Свернуть группу из <ph name="TABS_COUNT_MANY" /> вкладки.}}</translation> <translation id="2569352796411618312">Подсказка: вы давно не использовали некоторые вкладки (всего: <ph name="NUMBER_OF_TABS" />). Закрыть их?</translation> <translation id="2613747923081026172">Создать группу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb index 13d76c95..ceba449 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_si.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{පටිත්ත සමූහගත නොකරන්න}one{පටිති සමූහගත නොකරන්න}other{පටිති සමූහගත නොකරන්න}}</translation> <translation id="2277224997687551299">සමූහ නම සංස්කරණය කරන්න</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{පටිත්ත පිටුසන් කරන්න}one{පටිති පිටුසන් කරන්න}other{පටිති පිටුසන් කරන්න}}</translation> -<translation id="2479148705183875116">සැකසීම් වෙත යන්න</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{ටැබ <ph name="TABS_COUNT_ONE" />ක් හකුළන්න.}one{ටැබ සමූහය ටැබ <ph name="TABS_COUNT_MANY" />ක් සමග හකුළන්න.}other{ටැබ සමූහය ටැබ <ph name="TABS_COUNT_MANY" />ක් සමග හකුළන්න.}}</translation> <translation id="2569352796411618312">යෝජනාව: ඔබේ පටිතිවලින් <ph name="NUMBER_OF_TABS" /> ක් මෑතදී භාවිත වී නැත. ඒවා වසන්නද?</translation> <translation id="2613747923081026172">කණ්ඩායම සාදන්න</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb index 9c53aa5..03420126 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sk.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Zrušiť zoskupenie karty}few{Zrušiť zoskupenie kariet}many{Zrušiť zoskupenie kariet}other{Zrušiť zoskupenie kariet}}</translation> <translation id="2277224997687551299">Upraviť názov skupiny</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Uložiť kartu ako záložku}few{Uložiť karty ako záložky}many{Bookmark tabs}other{Uložiť karty ako záložky}}</translation> -<translation id="2479148705183875116">Prejsť do Nastavení</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Zbaliť <ph name="TABS_COUNT_ONE" /> kartu}few{Zbaliť skupinu s <ph name="TABS_COUNT_MANY" /> kartami}many{Collapse tab group with <ph name="TABS_COUNT_MANY" /> tabs.}other{Zbaliť skupinu s <ph name="TABS_COUNT_MANY" /> kartami}}</translation> <translation id="2569352796411618312">Návrh: V poslednom čase ste nepoužili viacero kariet (<ph name="NUMBER_OF_TABS" />). Chcete ich zavrieť?</translation> <translation id="2613747923081026172">Vytvoriť skupinu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb index 050c0172..323d415 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sl.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Razdruži zavihek}one{Razdruži zavihke}two{Razdruži zavihke}few{Razdruži zavihke}other{Razdruži zavihke}}</translation> <translation id="2277224997687551299">Urejanje imena skupine</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Dodaj zavihek med zaznamke}one{Dodaj zavihke med zaznamke}two{Dodaj zavihke med zaznamke}few{Dodaj zavihke med zaznamke}other{Dodaj zavihke med zaznamke}}</translation> -<translation id="2479148705183875116">V nastavitve</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Strni <ph name="TABS_COUNT_ONE" /> zavihek.}one{Strni skupino zavihkov s/z <ph name="TABS_COUNT_MANY" /> zavihkom.}two{Strni skupino zavihkov s/z <ph name="TABS_COUNT_MANY" /> zavihkoma.}few{Strni skupino zavihkov s/z <ph name="TABS_COUNT_MANY" /> zavihki.}other{Strni skupino zavihkov s/z <ph name="TABS_COUNT_MANY" /> zavihki.}}</translation> <translation id="2569352796411618312">Predlog: Toliko zavihkov nedavno niste uporabljali: <ph name="NUMBER_OF_TABS" />. Ali jih želite zapreti?</translation> <translation id="2613747923081026172">Ustvarjanje skupine</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb index 5ac63fe..eaa29131 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sq.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Anulo grupimin e skedës}other{Anulo grupimin e skedave}}</translation> <translation id="2277224997687551299">Redakto emrin e grupit</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Shto skedën te faqeshënuesit}other{Shto skedat te faqeshënuesit}}</translation> -<translation id="2479148705183875116">Shko te "Cilësimet"</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Palos <ph name="TABS_COUNT_ONE" /> skedë.}other{Palos grupin e skedave me <ph name="TABS_COUNT_MANY" /> skeda.}}</translation> <translation id="2569352796411618312">Sugjerim: <ph name="NUMBER_OF_TABS" /> nga skedat e tua nuk janë përdorur së fundi. Do t'i mbyllësh ato?</translation> <translation id="2613747923081026172">Krijo një grup</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb index ee2ead9..76702049 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr-Latn.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Opozovi grupisanje kartice}one{Opozovi grupisanje kartica}few{Opozovi grupisanje kartica}other{Opozovi grupisanje kartica}}</translation> <translation id="2277224997687551299">Izmenite ime grupe</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Obeleži karticu}one{Obeleži kartice}few{Obeleži kartice}other{Obeleži kartice}}</translation> -<translation id="2479148705183875116">Idi u Podešavanja</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Skupite <ph name="TABS_COUNT_ONE" /> karticu.}one{Skupite grupu sa <ph name="TABS_COUNT_MANY" /> karticom.}few{Skupite grupu sa <ph name="TABS_COUNT_MANY" /> kartice.}other{Skupite grupu sa <ph name="TABS_COUNT_MANY" /> kartica.}}</translation> <translation id="2569352796411618312">Predlog: Imate više kartica (<ph name="NUMBER_OF_TABS" />) koje niste koristili u skorije vreme. Želite li da ih zatvorite?</translation> <translation id="2613747923081026172">Napravi grupu</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb index 9bb639e..29511bb6 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sr.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Опозови груписање картице}one{Опозови груписање картица}few{Опозови груписање картица}other{Опозови груписање картица}}</translation> <translation id="2277224997687551299">Измените име групе</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Обележи картицу}one{Обележи картице}few{Обележи картице}other{Обележи картице}}</translation> -<translation id="2479148705183875116">Иди у Подешавања</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Скупите <ph name="TABS_COUNT_ONE" /> картицу.}one{Скупите групу са <ph name="TABS_COUNT_MANY" /> картицом.}few{Скупите групу са <ph name="TABS_COUNT_MANY" /> картице.}other{Скупите групу са <ph name="TABS_COUNT_MANY" /> картица.}}</translation> <translation id="2569352796411618312">Предлог: Имате више картица (<ph name="NUMBER_OF_TABS" />) које нисте користили у скорије време. Желите ли да их затворите?</translation> <translation id="2613747923081026172">Направи групу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb index 878591c..06dbaa9a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sv.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Dela upp flik}other{Dela upp flikar}}</translation> <translation id="2277224997687551299">Redigera gruppnamn</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Infoga bokmärke för flik}other{Infoga bokmärken för flikar}}</translation> -<translation id="2479148705183875116">Öppna inställningarna</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Komprimera <ph name="TABS_COUNT_ONE" /> flik.}other{Komprimera flikgruppen med <ph name="TABS_COUNT_MANY" /> flikar.}}</translation> <translation id="2569352796411618312">Förslag: <ph name="NUMBER_OF_TABS" /> av flikarna har inte använts på länge. Vill du stänga dem?</translation> <translation id="2613747923081026172">Skapa grupp</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb index 94c28a9..99d94d16 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_sw.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Ondoa kichupo katika kikundi}other{Ondoa vichupo katika kikundi}}</translation> <translation id="2277224997687551299">Badilisha jina la kikundi</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Alamisha kichupo}other{Alamisha vichupo}}</translation> -<translation id="2479148705183875116">Nenda kwenye Mipangilio</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Kunja kichupo <ph name="TABS_COUNT_ONE" />.}other{Kunja kikundi chenye vichupo <ph name="TABS_COUNT_MANY" />.}}</translation> <translation id="2569352796411618312">Pendekezo: Hujatumia vichupo <ph name="NUMBER_OF_TABS" /> hivi majuzi. Ungependa tuvifunge?</translation> <translation id="2613747923081026172">Unda kikundi</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb index cc6e3a8..ca87467 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ta.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{பக்கத்தைப் பிரி}other{பக்கங்களைப் பிரி}}</translation> <translation id="2277224997687551299">குழுவின் பெயரை மாற்று</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{பக்கத்தை புக்மார்க் செய்}other{பக்கங்களை புக்மார்க் செய்}}</translation> -<translation id="2479148705183875116">அமைப்புகளுக்குச் செல்லவும்</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> தாவலைச் சுருக்கும்.}other{<ph name="TABS_COUNT_MANY" /> பக்கங்கள் உள்ள பக்கக் குழுவைச் சுருக்கும்.}}</translation> <translation id="2569352796411618312">பரிந்துரை: உங்களின் <ph name="NUMBER_OF_TABS" /> தாவல்கள் சமீபத்தில் பயன்படுத்தவில்லை. அவற்றை மூட வேண்டுமா?</translation> <translation id="2613747923081026172">குழுவை உருவாக்கு</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb index b33f4e9..2a473e19 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_te.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ట్యాబ్ను అన్గ్రూప్ చేయండి}other{ట్యాబ్లను అన్గ్రూప్ చేయండి}}</translation> <translation id="2277224997687551299">గ్రూప్ పేరును ఎడిట్ చేయండి</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ట్యాబ్ను బుక్మార్క్ చేయండి}other{ట్యాబ్లను బుక్మార్క్ చేయండి}}</translation> -<translation id="2479148705183875116">సెట్టింగ్లకు వెళ్లు</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ట్యాబ్ను కుదించండి.}other{<ph name="TABS_COUNT_MANY" /> ట్యాబ్లతో ట్యాబ్ గ్రూప్ను కుదించండి.}}</translation> <translation id="2569352796411618312">సూచన: మీ <ph name="NUMBER_OF_TABS" /> ట్యాబ్లను ఇటీవల ఉపయోగించలేదు. వాటిని మూసివేయాలా?</translation> <translation id="2613747923081026172">గ్రూప్ను క్రియేట్ చేయండి</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb index 690fe68f..ac3548f 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_th.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{เลิกจัดกลุ่มแท็บ}other{เลิกจัดกลุ่มแท็บ}}</translation> <translation id="2277224997687551299">แก้ไขชื่อกลุ่ม</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{แท็บบุ๊กมาร์ก}other{แท็บบุ๊กมาร์ก}}</translation> -<translation id="2479148705183875116">ไปที่การตั้งค่า</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{ยุบ <ph name="TABS_COUNT_ONE" /> แท็บ}other{ยุบกลุ่มแท็บที่มีแท็บอยู่ <ph name="TABS_COUNT_MANY" /> แท็บ}}</translation> <translation id="2569352796411618312">คำแนะนำ: คุณไม่ได้ใช้แท็บ <ph name="NUMBER_OF_TABS" /> แท็บมาระยะหนึ่งแล้ว ปิดแท็บเหล่านั้นไหม</translation> <translation id="2613747923081026172">สร้างกลุ่ม</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb index b3500c78..93ee661 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_tr.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Sekme grubunu iptal et}other{Sekme grubunu iptal et}}</translation> <translation id="2277224997687551299">Grup adını düzenle</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Sekmeye yer işareti koy}other{Sekmelere yer işareti koy}}</translation> -<translation id="2479148705183875116">Ayarlar'a git</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> sekmeyi daralt.}other{<ph name="TABS_COUNT_MANY" /> sekmeli sekme grubunu daralt.}}</translation> <translation id="2569352796411618312">Öneri: <ph name="NUMBER_OF_TABS" /> sekmeyi son zamanlarda hiç kullanmadınız. Bunlar kapatılsın mı?</translation> <translation id="2613747923081026172">Grup oluştur</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb index d50037a..f73c035d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uk.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Розгрупувати вкладку}one{Розгрупувати вкладки}few{Розгрупувати вкладки}many{Розгрупувати вкладки}other{Розгрупувати вкладки}}</translation> <translation id="2277224997687551299">Змінити назву групи</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Зробити закладку для вкладки}one{Зробити закладки для вкладок}few{Зробити закладки для вкладок}many{Зробити закладки для вкладок}other{Зробити закладки для вкладок}}</translation> -<translation id="2479148705183875116">Перейти в налаштування</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Згорнути <ph name="TABS_COUNT_ONE" /> вкладку}one{Згорнути групу з <ph name="TABS_COUNT_MANY" /> вкладкою}few{Згорнути групу з <ph name="TABS_COUNT_MANY" /> вкладками}many{Згорнути групу з <ph name="TABS_COUNT_MANY" /> вкладками}other{Згорнути групу з <ph name="TABS_COUNT_MANY" /> вкладки}}</translation> <translation id="2569352796411618312">Пропозиція: ви давно не переходили на кілька вкладок (<ph name="NUMBER_OF_TABS" />). Закрити їх?</translation> <translation id="2613747923081026172">Створити групу</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb index 52adac2..7de293d 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_ur.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{ٹیب کو گروپ سے ہٹا دیں}other{ٹیبز کو گروپ سے ہٹا دیں}}</translation> <translation id="2277224997687551299">گروپ کے نام میں ترمیم کریں</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{ٹیب کو بُک مارک کریں}other{ٹیبز کو بُک مارک کریں}}</translation> -<translation id="2479148705183875116">ترتیبات پر جائیں</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ٹیب کو سکیڑیں۔}other{ٹیب گروپ کو <ph name="TABS_COUNT_MANY" /> ٹیبز کے ساتھ سکیڑیں۔}}</translation> <translation id="2569352796411618312">تجویز: آپ کے ٹیبز میں سے <ph name="NUMBER_OF_TABS" /> کا استعمال حال میں نہیں ہوا ہے۔ انہیں بند کریں؟</translation> <translation id="2613747923081026172">گروپ بنائیں</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb index 2475af0..e607d96 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_uz.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Varaqni yechish}other{Varaqlar guruhini yechish}}</translation> <translation id="2277224997687551299">Guruh nomini tahrirlash</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Varaqni bukmarklash}other{Varaqlarni bukmarklash}}</translation> -<translation id="2479148705183875116">Sozlamalarni ochish</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{<ph name="TABS_COUNT_ONE" /> ta varaqni yigʻish.}other{<ph name="TABS_COUNT_MANY" /> varaqli guruhni yigʻish.}}</translation> <translation id="2569352796411618312">Bildirgi: <ph name="NUMBER_OF_TABS" /> ta varaq oxirgi vaqtlarda ishlatilmayapti. Ular yopilsinmi?</translation> <translation id="2613747923081026172">Guruh yaratish</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb index 7f71b9e3..9f25b3f8 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_vi.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Bỏ thẻ khỏi nhóm}other{Bỏ thẻ khỏi nhóm}}</translation> <translation id="2277224997687551299">Chỉnh sửa tên nhóm</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Đánh dấu thẻ}other{Đánh dấu các thẻ}}</translation> -<translation id="2479148705183875116">Chuyển đến phần Cài đặt</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Thu gọn <ph name="TABS_COUNT_ONE" /> thẻ.}other{Thu gọn nhóm thẻ có <ph name="TABS_COUNT_MANY" /> thẻ.}}</translation> <translation id="2569352796411618312">Đề xuất: Gần đây, bạn không sử dụng <ph name="NUMBER_OF_TABS" /> thẻ. Bạn có muốn đóng các thẻ này không?</translation> <translation id="2613747923081026172">Tạo nhóm</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb index 8335e49..53787dd 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-CN.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{为标签页取消分组}other{为标签页取消分组}}</translation> <translation id="2277224997687551299">修改组名称</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{为所选标签页添加书签}other{为所有所选标签页添加书签}}</translation> -<translation id="2479148705183875116">转到“设置”</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{收起 <ph name="TABS_COUNT_ONE" /> 个标签页。}other{收起包含 <ph name="TABS_COUNT_MANY" /> 个标签页的标签页组。}}</translation> <translation id="2569352796411618312">建议:您有 <ph name="NUMBER_OF_TABS" /> 个标签页最近未被使用过。关闭它们?</translation> <translation id="2613747923081026172">创建群组</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb index ea8d2c7a..4e70b9a 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-HK.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{將分頁移出群組}other{將分頁移出群組}}</translation> <translation id="2277224997687551299">編輯群組名稱</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{將分頁加入書籤}other{將分頁加入書籤}}</translation> -<translation id="2479148705183875116">前往「設定」</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{收合 <ph name="TABS_COUNT_ONE" /> 個分頁。}other{收合有 <ph name="TABS_COUNT_MANY" /> 個分頁嘅分頁群組。}}</translation> <translation id="2569352796411618312">我有建議:你有 <ph name="NUMBER_OF_TABS" /> 個分頁最近冇用過,係咪要閂咗佢?</translation> <translation id="2613747923081026172">建立群組</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb index 2125f6e..9441887 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zh-TW.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{將分頁移出群組}other{將分頁移出群組}}</translation> <translation id="2277224997687551299">編輯群組名稱</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{將分頁加入書籤}other{將分頁加入書籤}}</translation> -<translation id="2479148705183875116">前往「設定」</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{收合 <ph name="TABS_COUNT_ONE" /> 個分頁。}other{收合包含 <ph name="TABS_COUNT_MANY" /> 個分頁的分頁群組。}}</translation> <translation id="2569352796411618312">建議:你有 <ph name="NUMBER_OF_TABS" /> 個分頁最近沒有使用過。要關閉這些分頁嗎?</translation> <translation id="2613747923081026172">建立群組</translation>
diff --git a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb index 2e80c23..e22c275 100644 --- a/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb +++ b/chrome/android/features/tab_ui/java/strings/translations/android_chrome_tab_ui_strings_zu.xtb
@@ -14,7 +14,6 @@ <translation id="22623456902492423">{TABS_COUNT,plural, =1{Hlukanisa ithebhu}one{Hlukanisa amathebhu}other{Hlukanisa amathebhu}}</translation> <translation id="2277224997687551299">Hlela igama leqembu</translation> <translation id="2330212241471632770">{TABS_COUNT,plural, =1{Faka ibhukhimakhi kuthebhu}one{Faka ibhukhimakhi kumathebhu}other{Faka ibhukhimakhi kumathebhu}}</translation> -<translation id="2479148705183875116">Iya kumasethingi</translation> <translation id="2539705006853443997">{TABS_COUNT,plural, =1{Goqa ithebhu engu-<ph name="TABS_COUNT_ONE" />.}one{Goqa iqembu lethebhu enamathebhu angu-<ph name="TABS_COUNT_MANY" />.}other{Goqa iqembu lethebhu enamathebhu angu-<ph name="TABS_COUNT_MANY" />.}}</translation> <translation id="2569352796411618312">Isiphakamiso: <ph name="NUMBER_OF_TABS" /> yamathebhu akho awakasetshenziswa kamuva nje. Wavale?</translation> <translation id="2613747923081026172">Dala iqembu</translation>
diff --git a/chrome/android/java/res/drawable/ic_cloud_upload_24dp.xml b/chrome/android/java/res/drawable/ic_cloud_upload_24dp.xml new file mode 100644 index 0000000..77955f7 --- /dev/null +++ b/chrome/android/java/res/drawable/ic_cloud_upload_24dp.xml
@@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<vector + xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="960" + android:viewportHeight="960"> + + <path + android:pathData="M260,800Q169,800 104.5,737Q40,674 40,583Q40,505 87,444Q134,383 210,366Q235, + 274 310,217Q385,160 480,160Q597,160 678.5,241.5Q760,323 760,440L760,440L760,440Q829, + 448 874.5,499.5Q920,551 920,620Q920,695 867.5,747.5Q815,800 740,800L520,800Q487,800 463.5, + 776.5Q440,753 440,720L440,514L376,576L320,520L480,360L640,520L584,576L520,514L520,720Q520, + 720 520,720Q520,720 520,720L740,720Q782,720 811,691Q840,662 840,620Q840,578 811,549Q782, + 520 740,520L680,520L680,440Q680,357 621.5,298.5Q563,240 480,240Q397,240 338.5,298.5Q280, + 357 280,440L260,440Q202,440 161,481Q120,522 120,580Q120,638 161,679Q202,720 260,720L360, + 720L360,800L260,800ZM480,520L480,520L480,520Q480,520 480,520Q480,520 480,520L480,520L480, + 520Q480,520 480,520Q480,520 480,520L480,520Q480,520 480,520Q480,520 480,520L480,520Q480, + 520 480,520Q480,520 480,520Q480,520 480,520Q480,520 480,520L480,520L480,520Q480,520 480, + 520Q480,520 480,520Q480,520 480,520Q480,520 480,520L480,520Q480,520 480,520Q480,520 480, + 520Q480,520 480,520Q480,520 480,520L480,520L480,520Z" + android:fillColor="@android:color/white"/> +</vector>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/creator/CreatorActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/creator/CreatorActivity.java index 5b417a5..acf94336 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/creator/CreatorActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/creator/CreatorActivity.java
@@ -71,13 +71,14 @@ } @Override public void onCreate(Bundle savedInstanceState) { - byte[] mWebFeedId = + byte[] webFeedId = getIntent().getByteArrayExtra(CreatorIntentConstants.CREATOR_WEB_FEED_ID); String url = getIntent().getStringExtra(CreatorIntentConstants.CREATOR_URL); boolean following = getIntent().getBooleanExtra(CreatorIntentConstants.CREATOR_FOLLOWING, false); - int mEntryPoint = getIntent().getIntExtra( + int entryPoint = getIntent().getIntExtra( CreatorIntentConstants.CREATOR_ENTRY_POINT, SingleWebFeedEntryPoint.OTHER); + mActivityTabProvider = new ActivityTabProvider(); mLifecycleDispatcher = new ActivityLifecycleDispatcherImpl(this); mShareDelegateSupplier = new ShareDelegateSupplier(); @@ -97,9 +98,9 @@ /* isCustomTab */ false); mTabShareDelegateSupplier.set(tabshareDelegate); - CreatorCoordinator coordinator = new CreatorCoordinator(this, mWebFeedId, + CreatorCoordinator coordinator = new CreatorCoordinator(this, webFeedId, getSnackbarManager(), mWindowAndroid, mProfile, url, this::createWebContents, - this::createNewTab, mTabShareDelegateSupplier, mEntryPoint, following, + this::createNewTab, mTabShareDelegateSupplier, entryPoint, following, this::showSignInInterstitial); mBottomSheetController = coordinator.getBottomSheetController();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java index 6589ce7..e534575 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/feed/FeedActionDelegateImpl.java
@@ -14,7 +14,9 @@ import org.chromium.chrome.browser.bookmarks.BookmarkModel; import org.chromium.chrome.browser.bookmarks.BookmarkUtils; import org.chromium.chrome.browser.feed.FeedActionDelegate; +import org.chromium.chrome.browser.feed.SingleWebFeedEntryPoint; import org.chromium.chrome.browser.feed.signinbottomsheet.SigninBottomSheetCoordinator; +import org.chromium.chrome.browser.feed.webfeed.CreatorIntentConstants; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.native_page.NativePageNavigationDelegate; import org.chromium.chrome.browser.ntp.NewTabPageUma; @@ -118,7 +120,7 @@ } @Override - public void openWebFeed(String webFeedName) { + public void openWebFeed(String webFeedName, @SingleWebFeedEntryPoint int entryPoint) { if (!FeatureList.isInitialized() || !ChromeFeatureList.isEnabled(ChromeFeatureList.CORMORANT)) { return; @@ -127,7 +129,8 @@ assert ThreadUtils.runningOnUiThread(); Class<?> creatorActivityClass = CreatorActivity.class; Intent intent = new Intent(mActivityContext, creatorActivityClass); - intent.putExtra("CREATOR_WEB_FEED_ID", webFeedName.getBytes()); + intent.putExtra(CreatorIntentConstants.CREATOR_WEB_FEED_ID, webFeedName.getBytes()); + intent.putExtra(CreatorIntentConstants.CREATOR_ENTRY_POINT, entryPoint); mActivityContext.startActivity(intent); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AddressEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AddressEditor.java index 769b520..bffc71e7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AddressEditor.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AddressEditor.java
@@ -315,6 +315,9 @@ /** Saves the edited profile on disk. */ private void commitChanges(AutofillProfile profile) { + if (willBeSavedInAccount()) { + profile.setSource(Source.ACCOUNT); + } // Country code and phone number are always required and are always collected from the // editor model. profile.setCountryCode(mCountryField.getValue().toString()); @@ -451,7 +454,18 @@ } private boolean willBeSavedInAccount() { - return mIsMigrationToAccount || (mProfile.getSource() == Source.ACCOUNT && !mIsUpdate); + if (mIsMigrationToAccount) { + return true; + } + + if (mProfile.getSource() == Source.ACCOUNT && !mIsUpdate) { + return true; // Only already saved address can be updated. + } + + // User creates a new address profile, which is going to be stored in their Google account + // according to the storage eligibility. + return mIsProfileNew + && PersonalDataManager.getInstance().isEligibleForAddressAccountStorage(); } private boolean isAlreadySavedInAccount() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index 9fbed2a..bb79c5f4d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -128,6 +128,10 @@ private BrowserStateBrowserControlsVisibilityDelegate mBrowserControlsVisibilityDelegate; private @Nullable CustomTabCaptureStateToken mLastCustomTabCaptureStateToken; + // Whether the maximization button should be shown when it can. Set to {@code true} + // while the side sheet is running with the maximize button option on. + private boolean mMaximizeButtonEnabled; + /** * Whether to use the toolbar as handle to resize the Window height. */ @@ -278,11 +282,13 @@ } // The visibility will get updated after the location bar completes its layout. maximizeButton.setVisibility(View.GONE); + mMaximizeButtonEnabled = true; setMaximizeButtonDrawable(maximizedOnInit); maximizeButton.setOnClickListener((v) -> setMaximizeButtonDrawable(callback.onClick())); } private void setMaximizeButtonVisibility() { + if (!mMaximizeButtonEnabled) return; var maximizeButton = (ImageButton) findViewById(R.id.custom_tabs_sidepanel_maximize); if (maximizeButton == null) return; @@ -324,6 +330,7 @@ var maximizeButton = (ImageButton) findViewById(R.id.custom_tabs_sidepanel_maximize); maximizeButton.setOnClickListener(null); maximizeButton.setVisibility(View.GONE); + mMaximizeButtonEnabled = false; } private void updateCustomActionButtonVisuals( @@ -1346,4 +1353,9 @@ mTitleUrlContainer = titleUrlContainer; } } + + @VisibleForTesting + boolean isMaximizeButtonEnabledForTesting() { + return mMaximizeButtonEnabled; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java index dad6dc83..d9ded29c0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -187,8 +187,11 @@ } String contentDescription = getContentDescription(email); + // We don't want to tint the user's profile picture. Tinting should only be supported for + // the signed-out avatar. + boolean supportTinting = email == null; return new ButtonSpec(drawable, buttonSpec.getOnClickListener(), - /*onLongClickListener=*/null, contentDescription, buttonSpec.getSupportsTinting(), + /*onLongClickListener=*/null, contentDescription, supportTinting, buttonSpec.getIPHCommandBuilder(), AdaptiveToolbarButtonVariant.UNKNOWN, buttonSpec.getActionChipLabelResId()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java index ecde8459..d579759 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -50,6 +50,9 @@ import org.chromium.chrome.browser.ui.native_page.TouchEnabledDelegate; import org.chromium.chrome.browser.user_education.IPHCommandBuilder; import org.chromium.chrome.browser.user_education.UserEducationHelper; +import org.chromium.chrome.browser.util.BrowserUiUtils; +import org.chromium.chrome.browser.util.BrowserUiUtils.HostSurface; +import org.chromium.chrome.browser.util.BrowserUiUtils.ModuleTypeOnStartAndNTP; import org.chromium.chrome.browser.video_tutorials.FeatureType; import org.chromium.chrome.browser.video_tutorials.VideoTutorialServiceFactory; import org.chromium.chrome.browser.video_tutorials.iph.VideoTutorialTryNowTracker; @@ -298,9 +301,12 @@ private void initializeLogoCoordinator( boolean searchProviderHasLogo, boolean searchProviderIsGoogle) { - Callback<LoadUrlParams> logoClickedCallback = mCallbackController.makeCancelable( - (urlParams) - -> mManager.getNativePageHost().loadUrl(urlParams, /*isIncognito=*/false)); + Callback<LoadUrlParams> logoClickedCallback = + mCallbackController.makeCancelable((urlParams) -> { + mManager.getNativePageHost().loadUrl(urlParams, /*isIncognito=*/false); + BrowserUiUtils.recordModuleClickHistogram( + HostSurface.NEW_TAB_PAGE, ModuleTypeOnStartAndNTP.DOODLE); + }); Callback<Logo> onLogoAvailableCallback = mCallbackController.makeCancelable((logo) -> { mSnapshotTileGridChanged = true; mShowingNonStandardLogo = logo != null;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index f93c749b..d4e5bba7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -134,6 +134,7 @@ import org.chromium.chrome.browser.ui.appmenu.AppMenuCoordinatorFactory; import org.chromium.chrome.browser.ui.appmenu.AppMenuDelegate; import org.chromium.chrome.browser.ui.appmenu.AppMenuObserver; +import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerFactory; import org.chromium.chrome.browser.ui.fold_transitions.FoldTransitionController; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.chrome.browser.ui.system.StatusBarColorController; @@ -767,6 +768,7 @@ initMerchantTrustSignals(); initScrollCapture(); + initializeEdgeToEdgeController(); new OneShotCallback<>(mProfileSupplier, this::initHistoryClustersCoordinator); @@ -1441,6 +1443,13 @@ } } + /** Setup drawing using Android Edge-to-Edge. */ + private void initializeEdgeToEdgeController() { + if (EdgeToEdgeControllerFactory.isEnabled()) { + EdgeToEdgeControllerFactory.create(mActivity).drawUnderSystemBars(); + } + } + /** * TODO(jinsukkim): remove/hide this in favor of wiring it directly. * @return {@link TabObscuringHandler} object.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java index 7ac1251..e9748eb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java
@@ -114,7 +114,7 @@ * @Restriction(UiRestriction.RESTRICTION_TYPE_PHONE) */ @Test - @DisabledTest(message = "http://crbug.com/172473") + @MediumTest public void testHideSelectionOnPhoneTabSwiping() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); // Setup
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index eaeab81..4f77b21 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -737,25 +737,7 @@ @Test @SmallTest - @Features.DisableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) - public void testNavigationWithFallbackURLInSubFrame_FallbackDisabled() { - mActivityTestRule.startMainActivityOnBlankPage(); - String fallbackUrl = mTestServer.getURL(FALLBACK_LANDING_PATH); - String subframeUrl = "intent://test/#Intent;scheme=badscheme;S.browser_fallback_url=" - + fallbackUrl + ";end"; - String originalUrl = getSubframeNavigationUrl(subframeUrl, false, false); - - OverrideUrlLoadingResult result = loadUrlAndWaitForIntentUrl(originalUrl, true, false); - - Assert.assertEquals( - OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB, result.getResultType()); - Assert.assertEquals(fallbackUrl, result.getTargetUrl().getSpec()); - } - - @Test - @SmallTest - @Features.EnableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) - public void testNavigationWithFallbackURLInSubFrame_FallbackEnabled() throws Exception { + public void testNavigationWithFallbackURLInSubFrame() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); String fallbackUrl = mTestServer.getURL(FALLBACK_LANDING_PATH); String subframeUrl = "intent://test/#Intent;scheme=badscheme;S.browser_fallback_url=" @@ -939,21 +921,7 @@ @Test @LargeTest - @Features.DisableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) - public void testSubframeLoadCannotLaunchPlayApp_FallbackDisabled() throws TimeoutException { - mActivityTestRule.startMainActivityOnBlankPage(); - // TODO(https://crbug.com/1365100): Verify the fallback URL is loaded once implemented. - OverrideUrlLoadingResult result = loadUrlAndWaitForIntentUrl( - mTestServer.getURL(SUBFRAME_REDIRECT_WITH_PLAY_FALLBACK), false, false); - Assert.assertEquals( - OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB, result.getResultType()); - Assert.assertEquals(FALLBACK_URL, result.getTargetUrl().getSpec()); - } - - @Test - @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) - public void testSubframeLoadCannotLaunchPlayApp_FallbackEnabled() throws TimeoutException { + public void testSubframeLoadCannotLaunchPlayApp() throws TimeoutException { String fallbackUrl = "https://play.google.com/store/apps/details?id=com.android.chrome"; String mainUrl = mTestServer.getURL(SUBFRAME_REDIRECT_WITH_PLAY_FALLBACK); String redirectUrl = mTestServer.getURL(HELLO_PAGE); @@ -1431,10 +1399,7 @@ @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME, - ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF_NAME}) - public void - testSubframeNavigationToSelf() throws Exception { + public void testSubframeNavigationToSelf() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); String targetUrl = mTestServer.getURL(HELLO_PAGE); @@ -1531,14 +1496,12 @@ @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) public void testIncognitoSubframeExternalNavigation_Rejected() throws Exception { doTestIncognitoSubframeExternalNavigation(false); } @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME}) public void testIncognitoSubframeExternalNavigation_Accepted() throws Exception { doTestIncognitoSubframeExternalNavigation(true); } @@ -1574,8 +1537,7 @@ @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF_NAME, - ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) + @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) public void testIntentToSelf() { String targetUrl = mTestServer.getURL(HELLO_PAGE); @@ -1597,8 +1559,7 @@ @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF_NAME, - ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) + @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) public void testIntentToSelfWithFallback() throws Exception { mActivityTestRule.startMainActivityOnBlankPage(); @@ -1645,8 +1606,7 @@ // that would escape the sandbox by clobbering the main frame. @Test @LargeTest - @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF_NAME, - ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) + @Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) public void testIntentToSelfWithFallback_Sandboxed() throws Exception { mActivityTestRule.startMainActivityOnBlankPage();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java index 1989c0c4..ca065ed 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/NewTabPageTest.java
@@ -60,12 +60,16 @@ import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.HistogramWatcher; +import org.chromium.base.test.util.JniMocker; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.feed.FeedActionDelegate; import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.browser.logo.LogoBridge; +import org.chromium.chrome.browser.logo.LogoBridgeJni; +import org.chromium.chrome.browser.logo.LogoCoordinator; import org.chromium.chrome.browser.native_page.ContextMenuManager; import org.chromium.chrome.browser.omnibox.OmniboxStub; import org.chromium.chrome.browser.omnibox.UrlBar; @@ -80,6 +84,7 @@ import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.tab.TabSelectionType; import org.chromium.chrome.browser.util.BrowserUiUtils; +import org.chromium.chrome.browser.util.BrowserUiUtils.ModuleTypeOnStartAndNTP; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.R; @@ -158,6 +163,8 @@ .setRevision(RENDER_TEST_REVISION) .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_NEW_TAB_PAGE) .build(); + @Rule + public JniMocker mJniMocker = new JniMocker(); @Mock OmniboxStub mOmniboxStub; @Mock @@ -168,6 +175,10 @@ private Callback mOnVisitComplete; @Mock private Runnable mOnPageLoaded; + @Mock + LogoBridge.Natives mLogoBridgeJniMock; + @Mock + private LogoBridge mLogoBridge; private static final String TEST_PAGE = "/chrome/test/data/android/navigate/simple.html"; private static final String TEST_FEED = @@ -919,6 +930,26 @@ + " is not recorded correctly when click on the profile button."); } + /** + * Test whether the clicking action on Logo in {@link NewTabPage} is been recorded in + * histogram correctly. + */ + @Test + @SmallTest + @Feature({"NewTabPage"}) + public void testRecordHistogramLogoClick_Ntp() { + mJniMocker.mock(LogoBridgeJni.TEST_HOOKS, mLogoBridgeJniMock); + NewTabPageLayout ntpLayout = mNtp.getNewTabPageLayout(); + LogoCoordinator logoCoordinator = ntpLayout.getLogoCoordinatorForTesting(); + logoCoordinator.setLogoBridgeForTesting(mLogoBridge); + logoCoordinator.setOnLogoClickUrlForTesting(TEST_URL); + HistogramWatcher histogramWatcher = HistogramWatcher.newSingleRecordWatcher( + HISTOGRAM_NTP_MODULE_CLICK, ModuleTypeOnStartAndNTP.DOODLE); + TestThreadUtils.runOnUiThreadBlocking(() -> logoCoordinator.onLogoClickedForTesting(true)); + histogramWatcher.assertExpected(HISTOGRAM_NTP_MODULE_CLICK + + " is not recorded correctly when click on Logo with doodle enabled."); + } + private void captureThumbnail() { Canvas canvas = new Canvas(); mNtp.captureThumbnail(canvas);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AddressEditorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AddressEditorTest.java index 6c7bd9fe..08a0a1b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AddressEditorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AddressEditorTest.java
@@ -37,6 +37,7 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; import org.chromium.chrome.R; +import org.chromium.chrome.browser.autofill.PersonalDataManager; import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile; import org.chromium.chrome.browser.autofill.Source; import org.chromium.chrome.browser.autofill.prefeditor.EditorDialog; @@ -111,6 +112,8 @@ @Mock private IdentityManager mIdentityManager; @Mock + private PersonalDataManager mPersonalDataManager; + @Mock private Profile mProfile; @Captor @@ -159,6 +162,8 @@ when(mSyncService.getSelectedTypes()).thenReturn(new HashSet()); SyncService.overrideForTests(mSyncService); + PersonalDataManager.setInstanceForTesting(mPersonalDataManager); + setUpSupportedCountries(mSupportedCountries); when(mEditorDialog.getContext()).thenReturn(mActivity); @@ -235,6 +240,13 @@ private void validateShownFields( EditorModel editorModel, AutofillProfile profile, boolean shouldMarkFieldsRequired) { + validateShownFields(editorModel, profile, shouldMarkFieldsRequired, + /*shouldMarkFieldsRequiredWhenAddressFieldEmpty=*/false); + } + + private void validateShownFields(EditorModel editorModel, AutofillProfile profile, + boolean shouldMarkFieldsRequired, + boolean shouldMarkFieldsRequiredWhenAddressFieldEmpty) { Assert.assertNotNull(editorModel); List<EditorFieldModel> editorFields = editorModel.getFields(); // editorFields[0] - country dropdown. @@ -270,10 +282,11 @@ // Note: dependent locality is a required field for address profiles stored in Google // account, but it's still marked as optional by the editor when the corresponding field in - // the address profile is empty. + // the existing address profile is empty. It is considered required for new address + // profiles. validateTextField(editorFields.get(5), profile.getDependentLocality(), - EditorFieldModel.INPUT_TYPE_HINT_NONE, "dependent locality label", false, true, - false); + EditorFieldModel.INPUT_TYPE_HINT_NONE, "dependent locality label", + shouldMarkFieldsRequiredWhenAddressFieldEmpty, true, false); validateTextField(editorFields.get(6), profile.getCompanyName(), EditorFieldModel.INPUT_TYPE_HINT_NONE, "organization label", false, true, false); @@ -326,6 +339,30 @@ @Test @SmallTest + public void validateUIStrings_NewAddressProfile_EligibleForAddressAccountStorage() { + when(mPersonalDataManager.isEligibleForAddressAccountStorage()).thenReturn(true); + mAddressEditor = new AddressEditor( + /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); + mAddressEditor.setEditorDialog(mEditorDialog); + setUpAddressUiComponents(new ArrayList()); + mAddressEditor.edit(null, unused -> {}); + + final String deleteTitle = + mActivity.getString(R.string.autofill_delete_address_confirmation_dialog_title); + final String deleteText = + mActivity.getString(R.string.autofill_delete_account_address_source_notice) + .replace("$1", USER_EMAIL); + final String sourceNotice = + mActivity + .getString(R.string.autofill_address_will_be_saved_in_account_source_notice) + .replace("$1", USER_EMAIL); + + checkUiStringsHaveExpectedValues( + mEditorModelCapture.getValue(), deleteTitle, deleteText, sourceNotice); + } + + @Test + @SmallTest public void validateUIStrings_LocalOrSyncAddressProfile_AddressSyncDisabled() { mAddressEditor = new AddressEditor( /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); @@ -562,6 +599,21 @@ @Test @SmallTest + public void validateShownFields_NewAddressProfile_EligibleForAddressAccountStorage() { + when(mPersonalDataManager.isEligibleForAddressAccountStorage()).thenReturn(true); + setUpAddressUiComponents(sSupportedAddressFields); + mAddressEditor = new AddressEditor( + /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); + mAddressEditor.setEditorDialog(mEditorDialog); + + mAddressEditor.edit(null, unused -> { return; }); + validateShownFields(mEditorModelCapture.getValue(), new AutofillProfile(), + /*shouldMarkFieldsRequired=*/true, + /*shouldMarkFieldsRequiredWhenAddressFieldEmpty=*/true); + } + + @Test + @SmallTest public void validateShownFields_LocalOrSyncAddressProfile_SaveLocally() { setUpAddressUiComponents(sSupportedAddressFields); mAddressEditor = new AddressEditor( @@ -677,7 +729,34 @@ @Test @SmallTest - public void edit_AlterProfile_Cancel() { + public void edit_NewAddressProfile_EligibleForAddressAccountStorage() { + when(mPersonalDataManager.isEligibleForAddressAccountStorage()).thenReturn(true); + mAddressEditor = new AddressEditor( + /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); + mAddressEditor.setEditorDialog(mEditorDialog); + setUpAddressUiComponents(sSupportedAddressFields); + mAddressEditor.edit(null, mDoneCallback); + + EditorModel editorModel = mEditorModelCapture.getValue(); + Assert.assertNotNull(editorModel); + List<EditorFieldModel> editorFields = editorModel.getFields(); + Assert.assertEquals(13, editorFields.size()); + + // Set values of the required fields. + editorFields.get(2).setValue("New Name"); + editorFields.get(4).setValue("Locality"); + editorFields.get(5).setValue("Dependent locality"); + editorFields.get(8).setValue("Postal code"); + editorFields.get(9).setValue("Street address"); + editorModel.done(); + + Assert.assertNotNull(mEditedAutofillAddress); + Assert.assertEquals(Source.ACCOUNT, mEditedAutofillAddress.getProfile().getSource()); + } + + @Test + @SmallTest + public void edit_AlterAddressProfile_Cancel() { mAddressEditor = new AddressEditor( /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); mAddressEditor.setEditorDialog(mEditorDialog); @@ -707,7 +786,7 @@ @Test @SmallTest - public void edit_AlterProfile_CommitChanges() { + public void edit_AlterAddressProfile_CommitChanges() { mAddressEditor = new AddressEditor( /*saveToDisk=*/false, /*isUpdate=*/false, /*isMigrationToAccount=*/false); mAddressEditor.setEditorDialog(mEditorDialog);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java index 4acd2335..d027fbf 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
@@ -376,7 +376,9 @@ @Test @Features.EnableFeatures({ChromeFeatureList.CCT_RESIZABLE_SIDE_SHEET}) public void testMaximizeButton() { + assertFalse(mToolbar.isMaximizeButtonEnabledForTesting()); mToolbar.initSideSheetMaximizeButton(/*maximizedOnInit=*/false, () -> true); + assertTrue(mToolbar.isMaximizeButtonEnabledForTesting()); var maximizeButton = (ImageButton) mToolbar.findViewById(R.id.custom_tabs_sidepanel_maximize); assertEquals("Maximize button should be invisible upon start", View.GONE, @@ -405,6 +407,9 @@ mToolbar.removeSideSheetMaximizeButton(); assertEquals("Maximize button should be hidden", View.GONE, maximizeButton.getVisibility()); + + mToolbar.removeSideSheetMaximizeButton(); + assertFalse(mToolbar.isMaximizeButtonEnabledForTesting()); } private void assertUrlAndTitleVisible(boolean titleVisible, boolean urlVisible) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedActionDelegateImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedActionDelegateImplTest.java index 1d10e19..8933ee5 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedActionDelegateImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedActionDelegateImplTest.java
@@ -96,7 +96,7 @@ FeatureList.setTestFeatures(ImmutableMap.of(ChromeFeatureList.CORMORANT, true)); String webFeedName = "SomeFeedName"; - mFeedActionDelegateImpl.openWebFeed(webFeedName); + mFeedActionDelegateImpl.openWebFeed(webFeedName, SingleWebFeedEntryPoint.OTHER); verify(mActivityContext).startActivity(mIntentCaptor.capture()); Assert.assertArrayEquals("Feed ID not passed correctly.", webFeedName.getBytes(), @@ -106,7 +106,7 @@ @Test public void testOpenWebFeed_disabledWhenCormorantFlagDisabled() { FeatureList.setTestFeatures(ImmutableMap.of(ChromeFeatureList.CORMORANT, false)); - mFeedActionDelegateImpl.openWebFeed("SomeFeedName"); + mFeedActionDelegateImpl.openWebFeed("SomeFeedName", SingleWebFeedEntryPoint.OTHER); verify(mActivityContext, never()).startActivity(any()); } }
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc index 6696baa..bd36816 100644 --- a/chrome/app/chrome_main.cc +++ b/chrome/app/chrome_main.cc
@@ -4,7 +4,6 @@ #include <stdint.h> -#include "base/allocator/buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_buildflags.h" #include "base/command_line.h" #include "base/functional/bind.h" @@ -37,13 +36,9 @@ #endif #if BUILDFLAG(IS_WIN) -#include "base/allocator/buildflags.h" #include "base/dcheck_is_on.h" #include "base/debug/handle_hooks_win.h" #include "base/win/current_module.h" -#if BUILDFLAG(USE_ALLOCATOR_SHIM) -#include "base/allocator/partition_allocator/shim/allocator_shim.h" -#endif #include <timeapi.h> @@ -85,12 +80,6 @@ #endif #if BUILDFLAG(IS_WIN) -#if BUILDFLAG(USE_ALLOCATOR_SHIM) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) - // Call this early on in order to configure heap workarounds. This must be - // called from chrome.dll. This may be a NOP on some platforms. - allocator_shim::ConfigurePartitionAlloc(); -#endif - install_static::InitializeFromPrimaryModule(); #if !defined(COMPONENT_BUILD) && DCHECK_IS_ON() // Patch the main EXE on non-component builds when DCHECKs are enabled.
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index 960e4b82..505a966 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -6496,6 +6496,12 @@ <message name="IDS_MULTI_CAPTURE_NOTIFICATION_MESSAGE" desc="This is the message of the notification when an application starts capturing multiple surfaces."> Your system administrator has allowed <ph name="APP_ORIGIN">$1</ph> to record your screen </message> + <message name="IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_TITLE" desc="This is the title of the notification on login when multi capture is enabled and capturing potentially could happen."> + Your screen might be recorded + </message> + <message name="IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_MESSAGE" desc="This is the message of the notification on login when multi capture is enabled and capturing potentially could happen."> + You'll see a notification if recording starts on this managed device + </message> <!-- Strings for Projector--> <message name="IDS_PROJECTOR_APP_NAME" desc="Name for the Projector app in the launcher">
diff --git a/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_MESSAGE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_MESSAGE.png.sha1 new file mode 100644 index 0000000..5940692 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_MESSAGE.png.sha1
@@ -0,0 +1 @@ +64b245b9e9fa96ea11c4a00731d0dedd9a526a5c \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_TITLE.png.sha1 new file mode 100644 index 0000000..5940692 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_TITLE.png.sha1
@@ -0,0 +1 @@ +64b245b9e9fa96ea11c4a00731d0dedd9a526a5c \ 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 e900a27..77ca173a 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">Kan nie stoor nie weens onvoldoende toestemmings. Stoor asseblief na 'n ander plek.</translation> <translation id="4546308221697447294">Blaai vinnig met Google Chrome</translation> <translation id="4546345569117159016">Regterknoppie</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> wil hierdie uitbreiding gebruik:</translation> <translation id="4546692474302123343">Google Assistent-steminvoer</translation> <translation id="4547659257713117923">Geen oortjies van ander toestelle af nie</translation> <translation id="4547672827276975204">Stel outomaties</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index b295d86..2951c5de 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -4106,6 +4106,7 @@ <translation id="4545759655004063573">পৰ্যাপ্ত অনুমতি নোহোৱাৰ কাৰণে ছেভ কৰিব নোৱাৰি। অনুগ্ৰহ কৰি আন এঠাইত ছেভ কৰক।</translation> <translation id="4546308221697447294">Google Chrome ব্যৱহাৰ কৰি দ্ৰুতভাৱে ব্ৰাউজ কৰক</translation> <translation id="4546345569117159016">সোঁফালৰ বুটাম</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" />এ এই এক্সটেনশ্বনটো ব্যৱহাৰ কৰিব বিচাৰে:</translation> <translation id="4546692474302123343">Google Assistantৰ ভইচ ইনপুট</translation> <translation id="4547659257713117923">অন্য ডিভাইচৰ কোনো টেব নাই</translation> <translation id="4547672827276975204">স্বয়ংক্ৰিয়াভাৱে ছেট কৰক</translation> @@ -4963,6 +4964,7 @@ <translation id="5338503421962489998">স্থানীয় ষ্ট'ৰেজ</translation> <translation id="5339031667684712858">আপুনি আঁতৰোৱা ছাইট</translation> <translation id="5340638867532133571">পৰিশোধৰ নিয়ন্ত্ৰক ইনষ্টল কৰিবলৈ ছাইটসমূহক অনুমতি দিয়ক(চুপাৰিছ কৰা)</translation> +<translation id="5340787663756381836">&বিচাৰক আৰু সম্পাদনা কৰক</translation> <translation id="5341793073192892252">তলৰ কুকিসমূহ অৱৰোধ কৰা হৈছিল (কোনো ব্যতিক্ৰম নৰখাকৈ তৃতীয় পক্ষৰ কুকিসমূহ অৱৰোধ কৰা হৈছে)</translation> <translation id="5342091991439452114">পিনটোত অতি কমেও <ph name="MINIMUM" />টা অংক থাকিব লাগিব</translation> <translation id="5344036115151554031">Linux পুনঃস্থাপন কৰি থকা হৈছে</translation> @@ -5855,6 +5857,7 @@ <translation id="6136114942382973861">ডাউনল’ডৰ বাৰডাল বন্ধ কৰক</translation> <translation id="6136287496450963112">আপোনাৰ সুৰক্ষা সম্পৰ্কীয় চাবি এটা পিনৰ দ্বাৰা সুৰক্ষিত নহয়। ফিংগাৰপ্ৰিণ্ট পৰিচালনা কৰিবলৈ, প্ৰথমে এটা পিন সৃষ্টি কৰক।</translation> <translation id="6138680304137685902">SHA-384ৰ সৈতে X9.62 ECDSA স্বাক্ষৰ</translation> +<translation id="6140948187512243695">সবিশেষ দেখুৱাওক</translation> <translation id="6141988275892716286">ডাউনল’ড নিশ্চিত কৰক</translation> <translation id="6143186082490678276">সহায় লওক</translation> <translation id="6143366292569327983">অনুবাদ কৰিবলৈ পৃষ্ঠাখন কি ভাষাত আছে সেয়া বাছনি কৰক</translation> @@ -9356,6 +9359,7 @@ <translation id="939401694733344652">এই একাউণ্টসমূহ এই মুহূৰ্তত Android এপৰ সৈতে ব্যৱহাৰ কৰি থকা নাই। যদি আপুনি এইটো Android এপৰ সৈতে ব্যৱহাৰ কৰিবলৈ এটা একাউণ্ট বাছনি কৰে, একাউণ্টটো অন্য Android এপৰ সৈতেও ব্যৱহাৰ কৰিব পৰা যায়। আপুনি <ph name="LINK_BEGIN" />ছেটিং > একাউণ্ট<ph name="LINK_END" />ত Android এপৰ এক্সেছ সলনি কৰিব পাৰে।</translation> <translation id="939598580284253335">পাছফ্ৰেজ দিয়ক</translation> <translation id="939736085109172342">নতুন ফ'ল্ডাৰ</translation> +<translation id="940212040923880623">&বিচাৰক আৰু সম্পাদনা কৰক</translation> <translation id="942532530371314860"><ph name="APP_NAME" />এ এটা Chrome টেব আৰু অডিঅ' শ্বেয়াৰ কৰি আছে।</translation> <translation id="944799160843436808">Chromebookত Steam ছেটআপ কৰাত সমস্যা হৈছে</translation> <translation id="945522503751344254">মতামত পঠিয়াওক</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 7d24d931..31cf3d3 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -4090,6 +4090,7 @@ <translation id="4545759655004063573">Qeyri-kafi icazələrə görə yadda saxlanıla bilmədi. Lütfən, başqa yerdə saxlayın.</translation> <translation id="4546308221697447294">Google Chrome ilə sürətli axtarış edin</translation> <translation id="4546345569117159016">Sağ düymə</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> bu artırmadan istifadə etmək istəyir:</translation> <translation id="4546692474302123343">Google Assistentin səs daxiletmə funksiyası</translation> <translation id="4547659257713117923">Başqa cihazlardan heç bir panel yoxdur</translation> <translation id="4547672827276975204">Avtomatik olaraq ayarlayın</translation> @@ -4947,6 +4948,7 @@ <translation id="5338503421962489998">Yerli saxlama yaddaşı</translation> <translation id="5339031667684712858">Sildiyiniz saytlar</translation> <translation id="5340638867532133571">Saytların ödəniş meneceri quraşdırmasına icazə verin (məsləhətlidir)</translation> +<translation id="5340787663756381836">&Tapın və redaktə edin</translation> <translation id="5341793073192892252">Aşağıdakı kukilər blok edilib (üçüncü tərəf kukiləri istisna olmadan bloklanır)</translation> <translation id="5342091991439452114">PIN ən azı <ph name="MINIMUM" /> rəqəmli olmalıdır</translation> <translation id="5344036115151554031">Linux bərpa edilir</translation> @@ -9334,6 +9336,7 @@ <translation id="939401694733344652">Bu hesablar hazırda Android tətbiqləri ilə istifadə edilmir. Bu Android tətbiqi ilə istifadə ediləcək hesabı seçsəniz, hesab digər Android tətbiqləri ilə də istifadə edilə bilər. Android tətbiqinə girişi <ph name="LINK_BEGIN" />Ayarlar > Hesablar<ph name="LINK_END" /> bölməsində dəyişə bilərsiniz.</translation> <translation id="939598580284253335">Parol daxil edin</translation> <translation id="939736085109172342">Yeni qovluq</translation> +<translation id="940212040923880623">&Tapın və redaktə edin</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome tab və audionu paylaşır.</translation> <translation id="944799160843436808">Chromebook'da Steam'i ayarlayarkən problem baş verdi</translation> <translation id="945522503751344254">Geri əlaqə göndərin</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 5e94fb72..6c7de271 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">За Linux е препоръчително да разполагате с поне <ph name="INSTALL_SIZE" /> свободно място. За да увеличите свободното място, изтрийте файлове от устройството.</translation> <translation id="1038643060055067718">Редове:</translation> <translation id="1039337018183941703">Невалиден или повреден файл</translation> +<translation id="1040761927998636252">Отметка без име за <ph name="URL" /></translation> <translation id="1041175011127912238">Страницата не реагира</translation> <translation id="1041263367839475438">Налични устройства</translation> <translation id="1042174272890264476">Компютърът ви също се предлага с библиотеката RLZ на <ph name="SHORT_PRODUCT_NAME" />, която е вградена. Тя задава неуникален и непозволяващ лично идентифициране маркер за измерване на търсенията и използването на <ph name="SHORT_PRODUCT_NAME" />, стимулирани от определена промоционална кампания. Тези етикети понякога се показват в заявките за търсене с Google в <ph name="PRODUCT_NAME" />.</translation> @@ -4964,6 +4965,7 @@ <translation id="5338503421962489998">Локално хранилище</translation> <translation id="5339031667684712858">Премахнати от вас сайтове</translation> <translation id="5340638867532133571">Разрешаване на сайтовете да инсталират приложения за обработване на плащания (препоръчително)</translation> +<translation id="5340787663756381836">&Намиране и редактиране</translation> <translation id="5341793073192892252">Следните „бисквитки“ бяха блокирани („бисквитките“ на трети страни се блокират без изключение)</translation> <translation id="5342091991439452114">ПИН кодът трябва да съдържа поне <ph name="MINIMUM" /> цифри</translation> <translation id="5344036115151554031">Linux се възстановява</translation> @@ -9357,6 +9359,7 @@ <translation id="939401694733344652">Понастоящем тези профили не се използват с приложения за Android. Ако изберете профил, който да се ползва с това приложение за Android, той ще може да се използва и с други такива приложения. Имате възможност да промените достъпа до дадено приложение за Android от <ph name="LINK_BEGIN" />Настройки > Профили<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Въведете пропуск</translation> <translation id="939736085109172342">Нова папка</translation> +<translation id="940212040923880623">&Намиране и редактиране</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> споделя раздел в Chrome и звук.</translation> <translation id="944799160843436808">При настройването на Steam на Chromebook възникна проблем</translation> <translation id="945522503751344254">Изпращане на отзиви</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 2f49b7b..aa44d5c2 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1250,7 +1250,7 @@ <translation id="2048554637254265991">কন্টেনার ম্যানেজার শুরু হওয়ার সময় কোনও সমস্যা হয়েছে। আবার চেষ্টা করুন।</translation> <translation id="2048653237708779538">অ্যাকশন উপলভ্য নেই</translation> <translation id="204914487372604757">শর্টকাট তৈরি করুন</translation> -<translation id="2050339315714019657">প্রতিকৃতি</translation> +<translation id="2050339315714019657">পোর্ট্রেট</translation> <translation id="2051555741181591333">অটোমেটিক হটস্পট বন্ধ করুন</translation> <translation id="2052572566310583903">আপনার অন্য ডিভাইসে ইনস্টল করা হয়েছে</translation> <translation id="2053105195397337973">বিভিন্ন সাইটে বিজ্ঞাপন স্প্যাম এবং জালিয়াতি বন্ধ করার ফিচার চালু করার মাধ্যমে ট্র্যাক করা কমাতে আমরা নতুন উপায় নিয়ে আসছি।</translation> @@ -4968,6 +4968,7 @@ <translation id="5338503421962489998">স্থানীয় সঞ্চয়স্থান</translation> <translation id="5339031667684712858">আপনি সরিয়ে দিয়েছেন এমন সাইট</translation> <translation id="5340638867532133571">সাইটগুলিকে পেমেন্ট হ্যান্ডলার ইনস্টল করার অনুমতি দিন (প্রস্তাবিত)</translation> +<translation id="5340787663756381836">&খুঁজুন ও এডিট করুন</translation> <translation id="5341793073192892252">নিম্নোক্ত কুকিগুলি ব্লক করা আছে (কোনও এক্সেপশন ছাড়াই তৃতীয়-পক্ষের কুকিগুলি ব্লক করা হচ্ছে)</translation> <translation id="5342091991439452114">পিন অবশ্যই কমপক্ষে <ph name="MINIMUM" /> সংখ্যার হতে হবে</translation> <translation id="5344036115151554031">Linux-কে ফিরিয়ে আনা হচ্ছে</translation> @@ -9364,6 +9365,7 @@ <translation id="939401694733344652">এই মুহূর্তে এইসব অ্যাকাউন্ট Android অ্যাপের সাথে ব্যবহার করা হচ্ছে না। এই Android অ্যাপের সাথে ব্যবহারের জন্য কোনও অ্যাকাউন্ট বেছে নিলে, সেটি অন্যান্য Android অ্যাপের ক্ষেত্রেও ব্যবহার করা যাবে। আপনি <ph name="LINK_BEGIN" />সেটিংস > অ্যাকাউন্ট<ph name="LINK_END" /> বিকল্প থেকে Android অ্যাপের অ্যাক্সেস পরিবর্তন করতে পারবেন।</translation> <translation id="939598580284253335">পাসফ্রেজ প্রবেশ করান</translation> <translation id="939736085109172342">নতুন ফোল্ডার</translation> +<translation id="940212040923880623">&খুঁজুন ও এডিট করুন</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> একটি Chrome ট্যাব ও অডিও শেয়ার করছে।</translation> <translation id="944799160843436808">Chromebook-এ Steam সেট-আপ করার সময় সমস্যা হয়েছে</translation> <translation id="945522503751344254">মতামত জানান</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index 0ebae3ff..6b13b35 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">Preporučuje se najmanje <ph name="INSTALL_SIZE" /> slobodnog prostora za Linux. Da oslobodite prostor, izbrišite fajlove s uređaja.</translation> <translation id="1038643060055067718">Redovi:</translation> <translation id="1039337018183941703">Nevažeći ili oštećen fajl</translation> +<translation id="1040761927998636252">Neimenovana oznaka za <ph name="URL" /></translation> <translation id="1041175011127912238">Ova stranica ne reagira</translation> <translation id="1041263367839475438">Dostupni uređaji</translation> <translation id="1042174272890264476">Vaš računar također ima ugrađenu RLZ biblioteku proizvoda <ph name="SHORT_PRODUCT_NAME" />. RLZ dodjeljuje nejedinstvenu oznaku koja ne može poslužiti za ličnu identifikaciju za mjerenje pretraživanja i korištenje proizvoda <ph name="SHORT_PRODUCT_NAME" /> do kojeg je došlo putem određene promotivne kampanje. Te oznake se nekada pojavljuju u upitima Google Pretraživanja u proizvodu <ph name="PRODUCT_NAME" />.</translation> @@ -2164,7 +2165,7 @@ <translation id="2804043232879091219">Otvaranje alternativnog preglednika nije uspjelo</translation> <translation id="2804667941345577550">Odjavit ćete se s ove web lokacije, uključujući otvorene kartice</translation> <translation id="2804680522274557040">Kamera je isključena</translation> -<translation id="2804742109948581745">Jedno uz drugo</translation> +<translation id="2804742109948581745">Jedan pored drugog</translation> <translation id="2805539617243680210">Sve je spremno!</translation> <translation id="2805646850212350655">Microsoft sistem za šifriranje fajlova</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -4109,7 +4110,7 @@ <translation id="4545759655004063573">Nije moguće sačuvati jer nema dovoljno odobrenja. Sačuvajte na drugoj lokaciji.</translation> <translation id="4546308221697447294">Pretražujte brže uz Google Chrome</translation> <translation id="4546345569117159016">Desno dugme</translation> -<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> želi upotrijebiti ovo proširenje:</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> želi koristiti ovu ekstenziju:</translation> <translation id="4546692474302123343">Glasovni unos Google Asistenta</translation> <translation id="4547659257713117923">Nema kartica iz drugih uređaja</translation> <translation id="4547672827276975204">Postavi automatski</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index ac6e0af..63b4ced 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -4092,6 +4092,7 @@ <translation id="4545759655004063573">No es pot desar perquè no hi ha prou permisos. Deseu-ho en un altre lloc.</translation> <translation id="4546308221697447294">Navega ràpidament amb Google Chrome</translation> <translation id="4546345569117159016">Botó dret</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> vol utilitzar aquesta extensió:</translation> <translation id="4546692474302123343">Entrada de veu de l'Assistent de Google</translation> <translation id="4547659257713117923">Cap pestanya d'altres dispositius</translation> <translation id="4547672827276975204">Defineix automàticament</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index df875d75..7ea722fe 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -4112,6 +4112,7 @@ <translation id="4545759655004063573">Ni ellir cadw oherwydd diffyg caniatadau. Cadwch i leoliad arall.</translation> <translation id="4546308221697447294">Pori'n gyflym gyda Google Chrome</translation> <translation id="4546345569117159016">Botwm de</translation> +<translation id="4546509872654834602">Mae <ph name="SUPERVISED_USER_NAME" /> eisiau defnyddio'r estyniad hwn:</translation> <translation id="4546692474302123343">Mewnbwn llais Google Assistant</translation> <translation id="4547659257713117923">Dim Tabiau o Ddyfeisiau Eraill</translation> <translation id="4547672827276975204">Gosod yn awtomatig</translation> @@ -4969,6 +4970,7 @@ <translation id="5338503421962489998">Storfa leol</translation> <translation id="5339031667684712858">Gwefannau a dynnwyd gennych</translation> <translation id="5340638867532133571">Caniatáu i wefannau osod trinyddion talu (argymhellir)</translation> +<translation id="5340787663756381836">&Canfod a golygu</translation> <translation id="5341793073192892252">Cafodd y cwcis canlynol eu rhwystro (caiff cwcis trydydd parti eu rhwystro heb eithriad)</translation> <translation id="5342091991439452114">Rhaid i'r PIN fod o leiaf <ph name="MINIMUM" /> o ddigidau</translation> <translation id="5344036115151554031">Yn adfer Linux</translation> @@ -5860,6 +5862,7 @@ <translation id="6136114942382973861">Cau'r bar lawrlwythiadau</translation> <translation id="6136287496450963112">Nid yw eich allwedd ddiogelwch yn cael ei amddiffyn gan PIN. I reoli olion bysedd, crëwch PIN yn gyntaf.</translation> <translation id="6138680304137685902">Llofnod X9.62 ECDSA â SHA-384</translation> +<translation id="6140948187512243695">Dangos y manylion</translation> <translation id="6141988275892716286">Cadarnhau lawrlwytho</translation> <translation id="6143186082490678276">Cael Help</translation> <translation id="6143366292569327983">Dewiswch iaith y dudalen i gyfieithu ohoni</translation> @@ -9370,6 +9373,7 @@ <translation id="939401694733344652">Nid yw'r cyfrifon hyn yn cael eu defnyddio gydag apiau Android ar hyn o bryd. Os ydych yn dewis cyfrif i'w ddefnyddio gyda'r ap Android hwn, gellir hefyd defnyddio'r cyfrif gydag apiau Android eraill. Gallwch newid mynediad apiau Android yn y <ph name="LINK_BEGIN" />Gosodiadau > Cyfrifon<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Rhowch gyfrinymadrodd</translation> <translation id="939736085109172342">Ffolder newydd</translation> +<translation id="940212040923880623">&Canfod a Golygu</translation> <translation id="942532530371314860">Mae <ph name="APP_NAME" /> yn rhannu tab Chrome a sain.</translation> <translation id="944799160843436808">Bu problem wrth sefydlu Steam ar Chromebook</translation> <translation id="945522503751344254">Danfon adborth</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 14ade11..f0ff383 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -4190,7 +4190,7 @@ <translation id="4617270414136722281">Valgmuligheder for udvidelser</translation> <translation id="4617880081511131945">Der kan ikke oprettes forbindelse</translation> <translation id="4618195822946934889">Webadressen må kun indeholde ASCII-tegn</translation> -<translation id="4619564267100705184">Bekræft din identitet</translation> +<translation id="4619564267100705184">Verificer din identitet</translation> <translation id="4619615317237390068">Faner fra andre enheder</translation> <translation id="4620809267248568679">Denne indstilling håndhæves af en udvidelse.</translation> <translation id="4622051949285931942">Vil du deaktivere automatiske opdateringer?</translation> @@ -6260,7 +6260,7 @@ <translation id="6514565641373682518">Denne side har deaktiveret din musemarkør.</translation> <translation id="6517709704288360414">Din enhed fungerer muligvis ikke længere korrekt, og du kan opleve problemer med sikkerheden og ydeevnen. Hvis du deaktiverer opdateringer, kan du miste retten til at indgive juridiske krav, hvis du oplever problemer.</translation> <translation id="6518014396551869914">Ko&pier billede</translation> -<translation id="6518133107902771759">Bekræft</translation> +<translation id="6518133107902771759">Verificer</translation> <translation id="651942933739530207">Må <ph name="APP_NAME" /> dele din skærm og dit lydoutput?</translation> <translation id="6519437681804756269">[<ph name="TIMESTAMP" />] <ph name="FILE_INFO" /> @@ -7375,7 +7375,7 @@ <translation id="7506541170099744506">Din <ph name="DEVICE_TYPE" /> er tilmeldt virksomhedsadministration.</translation> <translation id="7507207699631365376">Se denne udbyders <ph name="BEGIN_LINK" />privatlivspolitik<ph name="END_LINK" /></translation> <translation id="7509097596023256288">Konfiguration af administration</translation> -<translation id="7509246181739783082">Bekræft din identitet</translation> +<translation id="7509246181739783082">Verificer din identitet</translation> <translation id="7509539379068593709">Afinstaller app</translation> <translation id="7514239104543605883">Kopiér til din enhed</translation> <translation id="7514365320538308">Download</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index ba899799..71530550 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -4947,6 +4947,7 @@ <translation id="5338503421962489998">Lokaler Speicher</translation> <translation id="5339031667684712858">Entfernte Websites</translation> <translation id="5340638867532133571">Installation von Zahlungs-Handlern auf Websites zulassen (empfohlen)</translation> +<translation id="5340787663756381836">&Suchen und bearbeiten</translation> <translation id="5341793073192892252">Die folgenden Cookies wurden blockiert (Cookies von Drittanbietern werden ausnahmslos blockiert)</translation> <translation id="5342091991439452114">PIN muss mindestens <ph name="MINIMUM" /> Ziffern umfassen</translation> <translation id="5344036115151554031">Linux wird wiederhergestellt</translation> @@ -9336,6 +9337,7 @@ <translation id="939401694733344652">Diese Konten werden momentan nicht mit Android-Apps verwendet. Wenn du ein Konto für die Verwendung mit dieser Android-App auswählst, kann es auch mit anderen Android-Apps verwendet werden. Du kannst den Zugriff auf Android-Apps unter <ph name="LINK_BEGIN" />„Einstellungen“ > „Konten“<ph name="LINK_END" /> anpassen.</translation> <translation id="939598580284253335">Passphrase eingeben</translation> <translation id="939736085109172342">Neuer Ordner</translation> +<translation id="940212040923880623">&Suchen und bearbeiten</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> hat einen Chrome-Tab und Audio freigegeben.</translation> <translation id="944799160843436808">Beim Einrichten von Steam auf Chromebook ist ein Problem aufgetreten</translation> <translation id="945522503751344254">Feedback geben</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 614011f..22c9faa 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2165,6 +2165,7 @@ <translation id="2804043232879091219">Δεν ήταν δυνατό το άνοιγμα του εναλλακτικού προγράμματος περιήγησης</translation> <translation id="2804667941345577550">Θα αποσυνδεθείτε από αυτόν τον ιστότοπο, συμπεριλαμβανομένων όσων εμφανίζονται σε ανοικτές καρτέλες</translation> <translation id="2804680522274557040">Απενεργοποιημένη κάμερα</translation> +<translation id="2804742109948581745">Παράθεση</translation> <translation id="2805539617243680210">Είστε έτοιμοι!</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Εφαρμογές </translation> @@ -4658,6 +4659,7 @@ <translation id="5056950756634735043">Σύνδεση στο κοντέινερ</translation> <translation id="5057110919553308744">Όταν κάνετε κλικ στην επέκταση</translation> <translation id="5059241099014281248">Περιορισμός σύνδεσης</translation> +<translation id="5059429103770496207">Στιλ προβολής</translation> <translation id="5059526285558225588">Επιλέξτε τι θα μοιράζεστε</translation> <translation id="5060332552815861872">Υπάρχει 1 διαθέσιμος εκτυπωτής για αποθήκευση.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Αυτός ο φάκελος περιέχει έναν σελιδοδείκτη. Είστε βέβαιοι ότι θέλετε να τον διαγράψετε;}other{Αυτός ο φάκελος περιέχει # σελιδοδείκτες. Είστε βέβαιοι ότι θέλετε να τους διαγράψετε;}}</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index eda1868f..1bc417be 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2165,6 +2165,7 @@ <translation id="2804043232879091219">The alternative browser could not be opened</translation> <translation id="2804667941345577550">You’ll be signed out of this site, including in open tabs</translation> <translation id="2804680522274557040">Camera turned off</translation> +<translation id="2804742109948581745">Side-by-side</translation> <translation id="2805539617243680210">You're ready!</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Apps</translation> @@ -4658,6 +4659,7 @@ <translation id="5056950756634735043">Connecting to the container</translation> <translation id="5057110919553308744">When you click the extension</translation> <translation id="5059241099014281248">Restrict sign-in</translation> +<translation id="5059429103770496207">Display style</translation> <translation id="5059526285558225588">Choose what to share</translation> <translation id="5060332552815861872">There is 1 printer available to save.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{This folder contains a bookmark. Are you sure that you want to delete it?}other{This folder contains # bookmarks. Are you sure that you want to delete it?}}</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index 1269e35..ae30fcf 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1653,7 +1653,7 @@ <translation id="2365507699358342471">Este sitio web puede ver el texto y las imágenes que se hayan copiado en el portapapeles.</translation> <translation id="2367972762794486313">Mostrar aplicaciones</translation> <translation id="2369058545741334020">Abrir en modo Lectura</translation> -<translation id="236939127352773362">Cuando algún dispositivo cercano esté compartiendo archivos</translation> +<translation id="236939127352773362">Cuando algún dispositivo cercano esté compartiendo contenido</translation> <translation id="2371076942591664043">Abrir al &finalizar</translation> <translation id="2373666622366160481">Ajustar al tamaño del papel</translation> <translation id="2375406435414127095">Conecta tu teléfono</translation> @@ -3870,7 +3870,7 @@ <translation id="435527878592612277">Selecciona una foto</translation> <translation id="4356100841225547054">Desactivar volumen</translation> <translation id="4358302248024731679">Para diagnosticar mejor los problemas de Bluetooth, los Googlers pueden incluir registros de Bluetooth adicionales en sus comentarios. Si seleccionas esta opción, tu informe contendrá registros btsnoop y HCI de la sesión actual modificados para retirar tanta información personal identificable como sea posible. Solo los administradores del grupo de productos de ChromeOS de Listnr podrán acceder a estos registros, que se eliminarán definitivamente después de 90 días.</translation> -<translation id="4358643842961018282">El dispositivo está actualizado</translation> +<translation id="4358643842961018282">Tu dispositivo está actualizado</translation> <translation id="4359408040881008151">Instalada debido a las extensiones dependientes</translation> <translation id="4359717112757026264">Paisaje urbano</translation> <translation id="4361142739114356624">Falta la clave privada de este certificado de cliente o no es válida</translation> @@ -4093,6 +4093,7 @@ <translation id="4545759655004063573">No se puede guardar debido a que los permisos son insuficientes. Selecciona otra ubicación.</translation> <translation id="4546308221697447294">Navega de forma rápida con Google Chrome</translation> <translation id="4546345569117159016">Botón derecho</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> quiere usar esta extensión:</translation> <translation id="4546692474302123343">Entrada de voz del Asistente de Google</translation> <translation id="4547659257713117923">No hay pestañas de otros dispositivos</translation> <translation id="4547672827276975204">Definir automáticamente</translation> @@ -4354,7 +4355,7 @@ <translation id="4785914069240823137">Cancelar recorte</translation> <translation id="4788092183367008521">Revisa tu conexión de red y vuelve a intentarlo.</translation> <translation id="4789348252524569426">No se pueden instalar los archivos de voz. El dispositivo debe actualizarse. Reinícialo y vuelve a intentarlo.</translation> -<translation id="4789550509729954245">Mostrar notificación cuando algún dispositivo cercano esté compartiendo archivos</translation> +<translation id="4789550509729954245">Mostrar notificación cuando algún dispositivo cercano esté compartiendo contenido</translation> <translation id="4791037424585594169">(UDP)</translation> <translation id="4792290259143007505">Habilitar aceleración del TrackPoint</translation> <translation id="4792711294155034829">&Notificar un error...</translation> @@ -4950,6 +4951,7 @@ <translation id="5338503421962489998">Almacenamiento local</translation> <translation id="5339031667684712858">Sitios que has eliminado</translation> <translation id="5340638867532133571">Permitir a los sitios instalar controladores de pago (recomendado)</translation> +<translation id="5340787663756381836">&Buscar y editar</translation> <translation id="5341793073192892252">Se han bloqueado las siguientes cookies (las cookies de terceros se bloquean sin excepción)</translation> <translation id="5342091991439452114">El PIN debe tener al menos <ph name="MINIMUM" /> dígitos</translation> <translation id="5344036115151554031">Restaurando Linux</translation> @@ -6379,7 +6381,7 @@ <translation id="6630117778953264026">Mayor seguridad</translation> <translation id="6630752851777525409"><ph name="EXTENSION_NAME" /> desea acceder de forma permanente a un certificado parar autenticarse en tu nombre.</translation> <translation id="6633126565486451781">Este archivo podría haber sido leído o editado, ya que este sitio no utiliza una conexión segura.</translation> -<translation id="6635362468090274700">Nadie puede compartir nada contigo hasta que tu dispositivo sea visible.<ph name="BR" /><ph name="BR" />Para hacerlo visible temporalmente, abre el área de estado y activa la visibilidad Nearby.</translation> +<translation id="6635362468090274700">Nadie puede compartir contenido contigo hasta que tu dispositivo sea visible.<ph name="BR" /><ph name="BR" />Para hacerlo visible temporalmente, abre el área de estado y activa la visibilidad de Nearby.</translation> <translation id="6635674640674343739">No se puede establecer la conexión de red. Revisa tu conexión de red e inténtalo de nuevo.</translation> <translation id="6635944431854494329">El propietario puede controlar esta función desde Configuración > Configuración avanzada > Enviar automáticamente los datos de uso y diagnóstico a Google.</translation> <translation id="6636623428211296678">Explora más ajustes a continuación o termina ahora</translation> @@ -9342,6 +9344,7 @@ <translation id="939401694733344652">Estas cuentas no se están usando con aplicaciones Android en estos momentos. Si eliges una cuenta para usar con esta aplicación Android, la cuenta también podrá usarse con otras aplicaciones Android. Puedes cambiar el acceso a aplicaciones Android en <ph name="LINK_BEGIN" />Ajustes > Cuentas<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Introducir frase de contraseña</translation> <translation id="939736085109172342">Nueva carpeta</translation> +<translation id="940212040923880623">&Buscar y editar</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> está compartiendo audio y una pestaña de Chrome.</translation> <translation id="944799160843436808">No se ha podido configurar Steam en Chromebook</translation> <translation id="945522503751344254">Enviar comentarios</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 285efcb..d6fd7b8 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -4099,6 +4099,7 @@ <translation id="4545759655004063573">Ei saa salvestada ebapiisavate õiguste tõttu. Salvestage muusse asukohta.</translation> <translation id="4546308221697447294">Google Chrome'iga sirvite kiirelt</translation> <translation id="4546345569117159016">Parem nupp</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> soovib kasutada seda laiendust:</translation> <translation id="4546692474302123343">Google'i assistendi häälsisend</translation> <translation id="4547659257713117923">Muudest seadmetest pärinevaid vahelehti ei ole</translation> <translation id="4547672827276975204">Määra automaatselt</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 90bec8e..9e309fee 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -4106,6 +4106,7 @@ <translation id="4545759655004063573">به دلیل مجوزهای ناکافی ذخیره امکانپذیر نیست. لطفاً در محل دیگری ذخیره کنید.</translation> <translation id="4546308221697447294">با Google Chrome سریع مرور کنید</translation> <translation id="4546345569117159016">دکمه راست</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> میخواهد از این افزونه استفاده کند:</translation> <translation id="4546692474302123343">ورودی گفتاری «دستیار Google»</translation> <translation id="4547659257713117923">برگهای از دیگر دستگاهها وجود ندارد</translation> <translation id="4547672827276975204">تنظیم خودکار</translation> @@ -4963,6 +4964,7 @@ <translation id="5338503421962489998">فضای ذخیرهسازی محلی</translation> <translation id="5339031667684712858">سایتهایی که برداشتهاید</translation> <translation id="5340638867532133571">اجازه به سایتها برای نصب کنترلکنندههای پرداخت (توصیه میشود)</translation> +<translation id="5340787663756381836">جستجو و ویرایش</translation> <translation id="5341793073192892252">کوکیهای زیر مسدود شدند (کوکیهای شخص ثالث بدون استثنا مسدود میشوند)</translation> <translation id="5342091991439452114">پین باید حداقل <ph name="MINIMUM" /> رقم باشد</translation> <translation id="5344036115151554031">درحال بازیابی Linux</translation> @@ -9357,6 +9359,7 @@ <translation id="939401694733344652">درحالحاضر از این حسابها در برنامههای Android استفاده نمیشود. اگر حسابی را برای استفاده در این برنامه Android انتخاب کنید، میتوانید از آن حساب در برنامههای Android دیگر نیز استفاده کنید. میتوانید دسترسی برنامه Android را در بخش <ph name="LINK_BEGIN" />تنظیمات > حسابها<ph name="LINK_END" /> تغییر دهید.</translation> <translation id="939598580284253335">گذرعبارت را وارد کنید</translation> <translation id="939736085109172342">پوشهٔ جدید</translation> +<translation id="940212040923880623">جستجو و ویرایش</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> در حال اشتراکگذاری یک برگه Chrome و صوت است.</translation> <translation id="944799160843436808">مشکلی در راهاندازی Steam در Chromebook وجود داشت</translation> <translation id="945522503751344254">ارسال بازخورد</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index c563fef..f1a516e 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4105,6 +4105,7 @@ <translation id="4545759655004063573">Ei voi tallentaa, sillä käyttöluvat eivät riitä. Tallenna muuhun sijaintiin.</translation> <translation id="4546308221697447294">Selaa nopeasti Google Chromella.</translation> <translation id="4546345569117159016">Kakkospainike</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> haluaa käyttää tätä laajennusta:</translation> <translation id="4546692474302123343">Google Assistantin äänisyöte</translation> <translation id="4547659257713117923">Ei välilehtiä muista laitteista</translation> <translation id="4547672827276975204">Aseta automaattisesti</translation> @@ -4962,6 +4963,7 @@ <translation id="5338503421962489998">Paikallinen tallennustila</translation> <translation id="5339031667684712858">Poistamasi sivustot</translation> <translation id="5340638867532133571">Salli sivustojen asentaa maksujen käsittelijöitä (suositus)</translation> +<translation id="5340787663756381836">&Etsi ja muokkaa</translation> <translation id="5341793073192892252">Seuraavat evästeet estettiin (kolmannen osapuolen evästeet estetään poikkeuksetta)</translation> <translation id="5342091991439452114">PIN-koodissa on oltava vähintään <ph name="MINIMUM" /> numeroa.</translation> <translation id="5344036115151554031">Palautetaan Linuxia</translation> @@ -9353,6 +9355,7 @@ <translation id="939401694733344652">Näitä tilejä ei käytetä Android-sovellusten kanssa tällä hetkellä. Jos valitset Android-sovelluksen kanssa käytettävän tilin, sitä voidaan käyttää myös muilla Android-sovelluksilla. Voit muokata Android-sovelluksen pääsyä valitsemalla <ph name="LINK_BEGIN" />Asetukset > Tilit<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Anna tunnuslause</translation> <translation id="939736085109172342">Uusi kansio</translation> +<translation id="940212040923880623">&Etsi ja muokkaa</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> jakaa Chrome-välilehden ja ääntä.</translation> <translation id="944799160843436808">Steamin käyttöönotto Chromebookilla ei onnistunut</translation> <translation id="945522503751344254">Lähetä palautetta</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 77562ec..1f9751ed 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -4110,6 +4110,7 @@ <translation id="4545759655004063573">Hindi ma-save dahil hindi sapat ang mga pahintulot. Mangyaring i-save sa isa pang lokasyon.</translation> <translation id="4546308221697447294">Mag-browse nang mabilis gamit ang Google Chrome</translation> <translation id="4546345569117159016">Kanang button</translation> +<translation id="4546509872654834602">Gustong gamitin ni <ph name="SUPERVISED_USER_NAME" /> ang extension na ito:</translation> <translation id="4546692474302123343">Input na boses ng Google Assistant</translation> <translation id="4547659257713117923">Walang Mga Tab Mula Sa Ibang Mga Device</translation> <translation id="4547672827276975204">Awtomatikong itakda</translation> @@ -4967,6 +4968,7 @@ <translation id="5338503421962489998">Lokal na storage</translation> <translation id="5339031667684712858">Mga site na inalis mo</translation> <translation id="5340638867532133571">Payagan ang mga site na mag-install ng mga tagapangasiwa ng pagbabayad (inirerekomenda)</translation> +<translation id="5340787663756381836">&Hanapin at i-edit</translation> <translation id="5341793073192892252">Na-block ang sumusunod na cookies (bina-block ang third-party na cookies nang walang pagbubukod)</translation> <translation id="5342091991439452114">Hindi dapat bababa sa <ph name="MINIMUM" /> (na) digit ang PIN</translation> <translation id="5344036115151554031">Nire-restore ang Linux</translation> @@ -9364,6 +9366,7 @@ <translation id="939401694733344652">Hindi ginagamit sa mga Android app ang mga account na ito sa ngayon. Kung pipili ka ng account na gagamitin sa Android app na ito, puwede ring gamitin ang account sa iba pang Android app. Puwede mong baguhin ang access ng Android app sa <ph name="LINK_BEGIN" />Mga Setting > Mga Account<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Ilagay ang passphrase</translation> <translation id="939736085109172342">Bagong folder</translation> +<translation id="940212040923880623">&Hanapin at I-edit</translation> <translation id="942532530371314860">Nagbabahagi ng tab ng Chrome at audio ang <ph name="APP_NAME" />.</translation> <translation id="944799160843436808">Nagkaproblema sa pag-set up ng Steam sa Chromebook</translation> <translation id="945522503751344254">Magpadala ng feedback</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 2b2e13dc..70495af 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -4093,6 +4093,7 @@ <translation id="4545759655004063573">Impossible d'enregistrer en raison d'autorisations insuffisantes. Veuillez changer d'emplacement.</translation> <translation id="4546308221697447294">Naviguez à toute vitesse avec Google Chrome</translation> <translation id="4546345569117159016">Bouton droit</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> souhaite utiliser cette extension :</translation> <translation id="4546692474302123343">Saisie vocale avec l'Assistant Google</translation> <translation id="4547659257713117923">Aucun onglet issu d'autres appareils</translation> <translation id="4547672827276975204">Définir automatiquement</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index 35530b3..70dd960 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -4949,6 +4949,7 @@ <translation id="5338503421962489998">Almacenamento local</translation> <translation id="5339031667684712858">Sitios que quitaches</translation> <translation id="5340638867532133571">Permitir que os sitios instalen indicadores de pago (recomendado)</translation> +<translation id="5340787663756381836">&Buscar e editar</translation> <translation id="5341793073192892252">Bloqueáronse as seguintes cookies (estanse bloqueando as cookies de terceiros sen excepción)</translation> <translation id="5342091991439452114">O PIN debe ter como mínimo <ph name="MINIMUM" /> díxitos</translation> <translation id="5344036115151554031">Restaurando Linux</translation> @@ -9337,6 +9338,7 @@ <translation id="939401694733344652">Neste momento, estas contas non se están usando con aplicacións para Android. Se seleccionas unha conta para usala con esta aplicación para Android, tamén se pode utilizar con outras aplicacións para Android. Podes cambiar o acceso ás aplicacións para Android en <ph name="LINK_BEGIN" />Configuración > Contas<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Introducir frase de acceso</translation> <translation id="939736085109172342">Cartafol novo</translation> +<translation id="940212040923880623">&Buscar e editar</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> está compartindo audio e unha pestana de Chrome.</translation> <translation id="944799160843436808">Produciuse un problema ao instalar Steam en Chromebook</translation> <translation id="945522503751344254">Enviar comentarios</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 6ed785d..c3a8858d 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -4091,6 +4091,7 @@ <translation id="4545759655004063573">અપૂરતી પરવાનગીઓને કારણે સાચવી શકાતું નથી. કૃપા કરીને બીજી જગ્યાએ સાચવો.</translation> <translation id="4546308221697447294">Google Chrome વડે ઝડપથી બ્રાઉઝ કરો</translation> <translation id="4546345569117159016">જમણું બટન</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> આ એક્સ્ટેન્શનનો ઉપયોગ કરવા માગે છે:</translation> <translation id="4546692474302123343">Google Assistant વૉઇસ ઇનપુટ</translation> <translation id="4547659257713117923">અન્ય ડિવાઇસમાંથી કોઈ ટેબ નથી</translation> <translation id="4547672827276975204">ઑટોમૅટિક રીતે સેટ કરો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 4eae947..380378a 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -4967,6 +4967,7 @@ <translation id="5338503421962489998">स्थानीय मेमोरी</translation> <translation id="5339031667684712858">हटाई गई साइटें</translation> <translation id="5340638867532133571">साइटों को भुगतान हैंडलर इंस्टॉल करने की अनुमति दें (सुझाव दिया जाता है)</translation> +<translation id="5340787663756381836">&ढूंढें और बदलाव करें</translation> <translation id="5341793073192892252">इन कुकी को ब्लॉक कर दिया गया था (तृतीय पक्ष की कुकी बिना किसी अपवाद के ब्लॉक की जा रही हैं)</translation> <translation id="5342091991439452114">पिन कम से कम <ph name="MINIMUM" /> अंकों का होना चाहिए</translation> <translation id="5344036115151554031">Linux को पहले जैसा किया जा रहा है</translation> @@ -9360,6 +9361,7 @@ <translation id="939401694733344652">फ़िलहाल, इन खातों का इस्तेमाल Android ऐप्लिकेशन के साथ नहीं किया जा रहा है. अगर किसी खाते को इस Android ऐप्लिकेशन के साथ इस्तेमाल करने के लिए चुना जाता है, तो उस खाते का इस्तेमाल दूसरे Android ऐप्लिकेशन के साथ भी किया जा सकता है. <ph name="LINK_BEGIN" />सेटिंग > खाते<ph name="LINK_END" /> में जाकर तय किया जा सकता है कि Android ऐप्लिकेशन किसी खाते का इस्तेमाल करे या नहीं.</translation> <translation id="939598580284253335">'पासफ़्रेज़' दर्ज करें</translation> <translation id="939736085109172342">नया फ़ोल्डर</translation> +<translation id="940212040923880623">&ढूंढें और बदलाव करें</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> एक Chrome टैब और ऑडियो शेयर कर रहा है.</translation> <translation id="944799160843436808">Chromebook पर Steam को सेट अप करते समय कोई गड़बड़ी हुई</translation> <translation id="945522503751344254">फ़ीडबैक भेजें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index 81cdb92..7656359 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">Za Linux se preporučuje najmanje <ph name="INSTALL_SIZE" /> prostora. Da biste oslobodili prostor, izbrišite datoteke s uređaja.</translation> <translation id="1038643060055067718">Redci:</translation> <translation id="1039337018183941703">Neispravna ili oštećena datoteka</translation> +<translation id="1040761927998636252">Neimenovana oznaka za <ph name="URL" /></translation> <translation id="1041175011127912238">Stranica ne reagira</translation> <translation id="1041263367839475438">Dostupni uređaji</translation> <translation id="1042174272890264476">Vaše računalo ima ugrađenu RLZ biblioteku preglednika <ph name="SHORT_PRODUCT_NAME" />. RLZ dodjeljuje nejedinstvenu oznaku koja ne može poslužiti za osobnu identifikaciju za mjerenje pretraživanja i upotrebu proizvoda <ph name="SHORT_PRODUCT_NAME" /> potaknutu određenom promotivnom kampanjom. Te se oznake ponekad prikazuju u upitima Google pretraživanja u pregledniku <ph name="PRODUCT_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index 9cb4d7e..9e0d482 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -4965,6 +4965,7 @@ <translation id="5338503421962489998">Helyi tárhely</translation> <translation id="5339031667684712858">Eltávolított webhelyek</translation> <translation id="5340638867532133571">Fizetéskezelők telepítésének engedélyezése a webhelyek számára (ajánlott)</translation> +<translation id="5340787663756381836">&Keresés és szerkesztés</translation> <translation id="5341793073192892252">A következő cookie-kat letiltottuk (a harmadik féltől származó cookie-kat kivétel nélkül letiltjuk)</translation> <translation id="5342091991439452114">A PIN-kódnak legalább <ph name="MINIMUM" /> számjegyűnek kell lennie</translation> <translation id="5344036115151554031">A Linux rendszer visszaállítása folyamatban van</translation> @@ -9357,6 +9358,7 @@ <translation id="939401694733344652">Ezeket a fiókokat jelenleg nem használják Android-alkalmazásokkal. Ha kiválasztja valamelyik fiókot az ezzel az Android-alkalmazással való használatra, a fiók más Android-alkalmazásokkal is használható lehet. Az Android-alkalmazások hozzáférését a <ph name="LINK_BEGIN" />Beállítások > Fiókok<ph name="LINK_END" /> pontnál módosíthatja.</translation> <translation id="939598580284253335">Összetett jelszó megadása</translation> <translation id="939736085109172342">Új mappa</translation> +<translation id="940212040923880623">&Keresés és szerkesztés</translation> <translation id="942532530371314860">A(z) <ph name="APP_NAME" /> megosztja a Chrome egy lapját és a hangot.</translation> <translation id="944799160843436808">Hiba történt a Steam Chromebookon való beállítása során</translation> <translation id="945522503751344254">Visszajelzés küldése</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index f3605a91..13615ab 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -3021,6 +3021,7 @@ <translation id="3609277884604412258">Արագ որոնում</translation> <translation id="3610241585790874201">Ձեր սարքում չի թույլատրվում տվյալներ պահել</translation> <translation id="3610369246614755442">Դոկ-կայանի հովացուցիչը տեխսպասարկման կարիք ունի</translation> +<translation id="3610961622607302617">Փոխել <ph name="WEBSITE" /> կայքի գաղտնաբառը</translation> <translation id="361106536627977100">Flash-ի տվյալներ</translation> <translation id="3611655097742243705">Հավելվածներ գտնելու համար այցելեք Play Խանութ</translation> <translation id="3611658447322220736">Վերջերս փակված կայքերը կարող են ավարտել տվյալների ուղարկումն ու ստացումը</translation> @@ -4954,6 +4955,7 @@ <translation id="5338503421962489998">Տեղային պահեստ</translation> <translation id="5339031667684712858">Կայքերը, որոնք հեռացրել եք</translation> <translation id="5340638867532133571">Թույլ տալ կայքերին տեղադրել վճարումների մշակիչներ (խորհուրդ է տրվում)</translation> +<translation id="5340787663756381836">&Գտնել և փոփոխել</translation> <translation id="5341793073192892252">Հետևյալ քուքիներն արգելափակված են (երրորդ կողմի քուքիներն արգելափակվում են առանց բացառության)</translation> <translation id="5342091991439452114">PIN կոդը պետք է առնվազն <ph name="MINIMUM" /> թիվ պարունակի</translation> <translation id="5344036115151554031">Լինուքսի վերականգնում</translation> @@ -6040,6 +6042,7 @@ <translation id="6318125393809743217">Ներառել policies.json ֆայլը կանոնների կարգավորումների հետ։</translation> <translation id="6318407754858604988">Ներբեռնումը սկսվեց</translation> <translation id="6318944945640833942">Չհաջողվեց տպիչ հայտնաբերել: Նորից մուտքագրեք տպիչի հասցեն:</translation> +<translation id="6320808462673705899">Ձեր որոնմանը համապատասխանող էջանիշներ չկան։</translation> <translation id="6322370287306604163">Արագ ապակողպեք մատնահետքի օգնությամբ</translation> <translation id="6322559670748154781">Այս ֆայլը հազվադեպ է ներբեռնվում և արգելափակվել է Լրացուցիչ պաշտպանության կողմից</translation> <translation id="6324916366299863871">Փոփոխել դյուրանցումը</translation> @@ -9341,6 +9344,7 @@ <translation id="939401694733344652">Այս հաշիվները ներկայումս չեն օգտագործվում Android-ի համար նախատեսված հավելվածներում։ Android-ի համար նախատեսված այս հավելվածում հաշիվ մտնելուց հետո վերջինս կարող եք օգտագործել նաև այլ այդպիսի հավելվածներում։ Android-ի համար նախատեսված հավելվածների մուտքի պարամետրերը փոխելու համար անցեք <ph name="LINK_BEGIN" />Կարգավորումներ > Հաշիվներ<ph name="LINK_END" />։</translation> <translation id="939598580284253335">Մուտքագրեք անցաբառը</translation> <translation id="939736085109172342">Նոր պանակ</translation> +<translation id="940212040923880623">&Գտնել և փոփոխել</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> հավելվածը կիսվում է Chrome-ի ներդիրով ու ձայնով:</translation> <translation id="944799160843436808">Չհաջողվեց կարգավորել Steam-ը Chromebook-ում</translation> <translation id="945522503751344254">Կարծիք հայտնել</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 340e343..0f2a63ce 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">Tidak dapat menyimpan karena izin tidak memadai. Simpan ke lokasi lain.</translation> <translation id="4546308221697447294">Akses dengan cepat menggunakan Google Chrome</translation> <translation id="4546345569117159016">Tombol kanan</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> ingin menggunakan ekstensi ini:</translation> <translation id="4546692474302123343">Masukan suara Asisten Google</translation> <translation id="4547659257713117923">Tidak Ada Tab dari Perangkat Lainnya</translation> <translation id="4547672827276975204">Setel otomatis</translation> @@ -4966,6 +4967,7 @@ <translation id="5338503421962489998">Penyimpanan lokal</translation> <translation id="5339031667684712858">Situs yang Anda hapus</translation> <translation id="5340638867532133571">Izinkan situs menginstal penangan pembayaran (disarankan)</translation> +<translation id="5340787663756381836">&Cari dan edit</translation> <translation id="5341793073192892252">Cookie berikut diblokir (cookie pihak ketiga sedang diblokir tanpa pengecualian)</translation> <translation id="5342091991439452114">PIN minimal harus <ph name="MINIMUM" /> digit</translation> <translation id="5344036115151554031">Memulihkan Linux</translation> @@ -9357,6 +9359,7 @@ <translation id="939401694733344652">Akun ini tidak sedang digunakan dengan aplikasi Android. Jika Anda memilih akun untuk digunakan dengan aplikasi Android ini, akun tersebut juga dapat digunakan dengan aplikasi Android lainnya. Anda dapat mengubah akses aplikasi Android di <ph name="LINK_BEGIN" />Setelan > Akun<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Masukkan frasa sandi</translation> <translation id="939736085109172342">Folder baru</translation> +<translation id="940212040923880623">&Cari dan Edit</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> membagikan audio dan tab Chrome.</translation> <translation id="944799160843436808">Terjadi masalah saat menyiapkan Steam di Chromebook</translation> <translation id="945522503751344254">Kirim masukan</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index f1c8c42..c83bde4 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -4110,6 +4110,7 @@ <translation id="4545759655004063573">Ekki eru nægar heimildir til að vista. Vistaðu á öðrum stað.</translation> <translation id="4546308221697447294">Hraðvirk vefskoðun með Google Chrome</translation> <translation id="4546345569117159016">Hægri hnappur</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> vill nota þessa viðbót:</translation> <translation id="4546692474302123343">Raddinntak Google hjálpara</translation> <translation id="4547659257713117923">Engir flipar frá öðrum tækjum</translation> <translation id="4547672827276975204">Stilla sjálfkrafa</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 796bd90..22d1665 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -4950,6 +4950,7 @@ <translation id="5338503421962489998">Archiviazione locale</translation> <translation id="5339031667684712858">Siti rimossi</translation> <translation id="5340638867532133571">Consenti ai siti di installare gestori dei pagamenti (opzione consigliata)</translation> +<translation id="5340787663756381836">&Trova e modifica</translation> <translation id="5341793073192892252">I seguenti cookie sono stati bloccati (i cookie di terze parti vengono bloccati senza eccezioni)</translation> <translation id="5342091991439452114">Il PIN deve contenere almeno <ph name="MINIMUM" /> cifre</translation> <translation id="5344036115151554031">Ripristino di Linux</translation> @@ -5025,7 +5026,7 @@ <translation id="5413640305322530561">Scopri di più sui dati diagnostici e sull'utilizzo</translation> <translation id="5414198321558177633">Aggiornamento dell'elenco di profili in corso. Questa operazione può richiedere alcuni minuti.</translation> <translation id="5414566801737831689">Lettura delle icone dei siti web visitati</translation> -<translation id="5414836363063783498">Verifica…</translation> +<translation id="5414836363063783498">Verifica in corso…</translation> <translation id="5417312524372586921">Temi del browser</translation> <translation id="541737483547792035">Ingrandisci lo schermo</translation> <translation id="5419405654816502573">Voice Match</translation> @@ -9339,6 +9340,7 @@ <translation id="939401694733344652">Al momento questi account non vengono utilizzati con le app per Android. Se selezioni un account da utilizzare con questa app per Android, l'account può essere utilizzato anche con altre app per Android. Puoi modificare l'accesso alle app per Android in <ph name="LINK_BEGIN" />Impostazioni > Account<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Inserisci passphrase</translation> <translation id="939736085109172342">Nuova cartella</translation> +<translation id="940212040923880623">&Trova e modifica</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> condivide l'audio e una scheda Chrome.</translation> <translation id="944799160843436808">Si è verificato un problema durante la configurazione di Steam su Chromebook</translation> <translation id="945522503751344254">Invia feedback</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 578818e..34aea63 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4967,6 +4967,7 @@ <translation id="5338503421962489998">אחסון מקומי</translation> <translation id="5339031667684712858">אתרים שהסרת</translation> <translation id="5340638867532133571">מתן הרשאה לאתרים להתקין מעבדי handler לתשלומים (מומלץ)</translation> +<translation id="5340787663756381836">&חיפוש ועריכה</translation> <translation id="5341793073192892252">קובצי ה-Cookie הבאים נחסמו (קובצי Cookie של צד שלישי נחסמים ללא יוצא מן הכלל)</translation> <translation id="5342091991439452114">קוד האימות חייב להיות באורך <ph name="MINIMUM" /> ספרות לפחות</translation> <translation id="5344036115151554031">שחזור Linux</translation> @@ -9366,6 +9367,7 @@ <translation id="939401694733344652">בחשבונות האלה לא נעשה שימוש באפליקציות ל-Android בשלב הזה. אם נבחר חשבון לשימוש עם האפליקציה הזאת ל-Android, ניתן להשתמש בחשבון גם עם אפליקציות אחרות ל-Android. ניתן לשנות את אפשרות הגישה לאפליקציה ל-Android ב<ph name="LINK_BEGIN" />הגדרות > חשבונות<ph name="LINK_END" />.</translation> <translation id="939598580284253335">הזנת ביטוי סיסמה</translation> <translation id="939736085109172342">תיקייה חדשה</translation> +<translation id="940212040923880623">&חיפוש ועריכה</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> משתף כרטיסייה ואודיו של Chrome.</translation> <translation id="944799160843436808">הייתה בעיה בהגדרת Steam ב-Chromebook</translation> <translation id="945522503751344254"> שליחת משוב</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 22634e9..d0f39a7 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -4942,6 +4942,7 @@ <translation id="5338503421962489998">ローカル ストレージ</translation> <translation id="5339031667684712858">削除したサイト</translation> <translation id="5340638867532133571">サイトに支払いハンドラのインストールを許可する(推奨)</translation> +<translation id="5340787663756381836">検索と編集(&F)</translation> <translation id="5341793073192892252">以下の Cookie がブロックされました(サードパーティの Cookie は例外なくブロックされます)</translation> <translation id="5342091991439452114">PIN は <ph name="MINIMUM" /> 桁以上で設定してください</translation> <translation id="5344036115151554031">Linux を復元しています</translation> @@ -9329,6 +9330,7 @@ <translation id="939401694733344652">これらのアカウントは現在、Android アプリで使用されていません。この Android アプリで使用するアカウントを選択した場合、そのアカウントは他の Android アプリでも使用できるようになります。Android アプリのアクセス権限は、<ph name="LINK_BEGIN" />[設定] > [アカウント]<ph name="LINK_END" /> で変更できます。</translation> <translation id="939598580284253335">パスフレーズを入力</translation> <translation id="939736085109172342">新しいフォルダ</translation> +<translation id="940212040923880623">検索と編集(&F)</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> が Chrome タブと音声を共有しています。</translation> <translation id="944799160843436808">Steam on Chromebook のセットアップ中に問題が発生しました</translation> <translation id="945522503751344254">フィードバックを送信</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index 0914495..be58e28 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -4093,6 +4093,7 @@ <translation id="4545759655004063573">ვერ შეინახავს არასაკმარისი ნებართვების გამო. შეინახეთ სხვა დირექტორიაში.</translation> <translation id="4546308221697447294">დაათვალიერეთ ვები სწრაფად Google Chrome-ის მეშვეობით</translation> <translation id="4546345569117159016">მარჯვენა ღილაკი</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" />-ს სურს, გამოიყენოს შემდეგი გაფართოება:</translation> <translation id="4546692474302123343">Google ასისტენტის ხმოვანი შეყვანა</translation> <translation id="4547659257713117923">ჩანართები სხვა მოწყობილობებიდან არ არის</translation> <translation id="4547672827276975204">ავტომატურად დაყენება</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 99f30cd..5f8d98e 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -2147,6 +2147,7 @@ <translation id="2804043232879091219">Балама браузер ашылмады.</translation> <translation id="2804667941345577550">Осы сайттан, оның ішінде ашық қойындылардан шығып кетесіз.</translation> <translation id="2804680522274557040">Камера өшірулі</translation> +<translation id="2804742109948581745">Қатар</translation> <translation id="2805539617243680210">Барлығы дайын!</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Қолданбалар</translation> @@ -4639,6 +4640,7 @@ <translation id="5056950756634735043">Контейнерге қосылуда</translation> <translation id="5057110919553308744">Кеңейтім басылғанда</translation> <translation id="5059241099014281248">Кіруді шектеу</translation> +<translation id="5059429103770496207">Көрсету стилі</translation> <translation id="5059526285558225588">Бөлісілетін контентті таңдаңыз</translation> <translation id="5060332552815861872">1 принтерді сақтауға болады.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Бұл қалтада бетбелгі бар. Оны шынымен жойғыңыз келе ме?}other{Бұл қалтада # бетбелгі бар. Оны шынымен жойғыңыз келе ме?}}</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 01aec061..7ca69e7 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">យ៉ាងហោចណាស់ <ph name="INSTALL_SIZE" /> នៃទំហំផ្ទុកត្រូវបានណែនាំឱ្យប្រើសម្រាប់ Linux។ ដើម្បីបង្កើនទំហំផ្ទុក សូមលុបឯកសារចេញពីឧបករណ៍របស់អ្នក។</translation> <translation id="1038643060055067718">បន្ទាត់៖</translation> <translation id="1039337018183941703">ឯកសារមិនត្រឹមត្រូវ ឬខូច</translation> +<translation id="1040761927998636252">ចំណាំដែលគ្មានឈ្មោះសម្រាប់ <ph name="URL" /></translation> <translation id="1041175011127912238">ទំព័រនេះមិនដំណើរការទេ</translation> <translation id="1041263367839475438">ឧបករណ៍ដែលអាចប្រើបាន</translation> <translation id="1042174272890264476">កុំព្យូទ័ររបស់អ្នកក៏ភ្ជាប់មកជាមួយបណ្តាល័យដែលបំពាក់ RLZ របស់ <ph name="SHORT_PRODUCT_NAME" /> ផងដែរ។ RLZ ចាត់ស្លាកដែលអាចសម្គាល់បានដោយមិនមែនលក្ខណៈបុគ្គល ឬពិសេស ដើម្បីវាស់វែងការស្វែងរក និងការប្រើប្រាស់ <ph name="SHORT_PRODUCT_NAME" /> ដែលដំណើរការដោយយុទ្ធនាការផ្សព្ធផ្សាយជាក់លាក់មួយ។ ជួនកាល ផ្លាកទាំងនេះលេចឡើងនៅក្នុងការសួរ Google ស្វែងរក <ph name="PRODUCT_NAME" />។</translation> @@ -2165,6 +2166,7 @@ <translation id="2804043232879091219">មិនអាចបើកកម្មវិធីរុករកតាមអ៊ីនធឺណិតផ្សេងបានទេ</translation> <translation id="2804667941345577550">អ្នកនឹងត្រូវនាំចេញពីគេហទំព័រនេះ រួមទាំងនៅក្នុងផ្ទាំងបើកផងដែរ</translation> <translation id="2804680522274557040">បានបិទកាមេរ៉ា</translation> +<translation id="2804742109948581745">ទន្ទឹមគ្នា</translation> <translation id="2805539617243680210">រួចរាល់អស់ហើយ!</translation> <translation id="2805646850212350655">ប្រព័ន្ធឯកសារអ៊ីនគ្រីប Microsoft</translation> <translation id="2805756323405976993">កម្មវិធី</translation> @@ -4658,6 +4660,7 @@ <translation id="5056950756634735043">កំពុងភ្ជាប់ជាមួយទម្រង់ផ្ទុក</translation> <translation id="5057110919553308744">នៅពេលអ្នកចុចកម្មវិធីបន្ថែម</translation> <translation id="5059241099014281248">រឹតបន្តឹងការចូលគណនី</translation> +<translation id="5059429103770496207">របៀបបង្ហាញ</translation> <translation id="5059526285558225588">ជ្រើសរើសអ្វីដែលត្រូវចែករំលែក</translation> <translation id="5060332552815861872">មានម៉ាស៊ីនបោះពុម្ព 1 សម្រាប់រក្សាទុក។</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ថតនេះផ្ទុកចំណាំមួយ។ តើអ្នកប្រាកដថាចង់លុបវាឬទេ?}other{ថតនេះផ្ទុកចំណាំ # ។ តើអ្នកប្រាកដថាចង់លុបវាឬទេ?}}</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 720db8e98..d8c75e3 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4102,6 +4102,7 @@ <translation id="4545759655004063573">ಸಾಕಷ್ಟು ಅನುಮತಿಗಳು ಇಲ್ಲದ ಕಾರಣ ಉಳಿಸಲಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು ಮತ್ತೊಂದು ಸ್ಥಾನದಲ್ಲಿ ಉಳಿಸಿ.</translation> <translation id="4546308221697447294">Google Chrome ಮೂಲಕ ವೇಗವಾಗಿ ಬ್ರೌಸ್ ಮಾಡಿ</translation> <translation id="4546345569117159016">ಬಲ ಬಟನ್</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> ಅವರು ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸಲು ಬಯಸುತ್ತಾರೆ:</translation> <translation id="4546692474302123343">Google Assistant ಧ್ವನಿ ಇನ್ಪುಟ್</translation> <translation id="4547659257713117923">ಇತರ ಸಾಧನಗಳಿಂದ ಯಾವುದೇ ಟ್ಯಾಬ್ಗಳಿಲ್ಲ</translation> <translation id="4547672827276975204">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹೊಂದಿಸಿ</translation> @@ -4960,6 +4961,7 @@ <translation id="5338503421962489998">ಸ್ಥಳೀಯ ಸಂಗ್ರಹಣೆ</translation> <translation id="5339031667684712858">ನೀವು ತೆಗೆದುಹಾಕಿದ ಸೈಟ್ಗಳು</translation> <translation id="5340638867532133571">ಪಾವತಿ ಹ್ಯಾಂಡ್ಲರ್ಗಳನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸೈಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅನುಮತಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> +<translation id="5340787663756381836">&ಹುಡುಕಿ ಹಾಗೂ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="5341793073192892252">ಕೆಳಗಿನ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ (ಮೂರನೇ-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಹೊರತುಪಡಿಸದೇ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ)</translation> <translation id="5342091991439452114">ಪಿನ್ ಕನಿಷ್ಠ ಪಕ್ಷ <ph name="MINIMUM" /> ಅಂಕಿಗಳಾಗಿರಬೇಕು</translation> <translation id="5344036115151554031">Linux ಅನ್ನು ಮರುಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ</translation> @@ -9353,6 +9355,7 @@ <translation id="939401694733344652">ಈ ಖಾತೆಗಳನ್ನು ಈಗ Android ಆ್ಯಪ್ಗಳ ಜೊತೆ ಬಳಸಲಾಗುತ್ತಿಲ್ಲ. ಈ Android ಆ್ಯಪ್ಗಳ ಜೊತೆ ಬಳಸಲು ನೀವು ಖಾತೆಯನ್ನು ಆಯ್ಕೆಮಾಡಿದರೆ, ಖಾತೆಯನ್ನು ಇತರ Android ಆ್ಯಪ್ಗಳ ಜೊತೆಗೂ ಸಹ ಬಳಸಬಹುದು. ನೀವು <ph name="LINK_BEGIN" />ಸೆಟ್ಟಿಂಗ್ಗಳು > ಖಾತೆಗಳು<ph name="LINK_END" /> ಎಂಬಲ್ಲಿ Android ಆ್ಯಪ್ಗಳ ಪ್ರವೇಶವನ್ನು ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="939598580284253335">ಪಾಸ್ಫ್ರೇಸ್ ಅನ್ನು ನಮೂದಿಸಿ</translation> <translation id="939736085109172342">ಹೊಸ ಫೋಲ್ಡರ್</translation> +<translation id="940212040923880623">&ಹುಡುಕಿ ಹಾಗೂ ಎಡಿಟ್ ಮಾಡಿ</translation> <translation id="942532530371314860">Chrome ಟ್ಯಾಬ್ ಮತ್ತು ಆಡಿಯೋವನ್ನು <ph name="APP_NAME" /> ಹಂಚಿಕೊಳ್ಳುತ್ತಿದೆ.</translation> <translation id="944799160843436808">Chromebook ನಲ್ಲಿ Steam ಅನ್ನು ಸೆಟಪ್ ಮಾಡುವಾಗ ಸಮಸ್ಯೆ ಉಂಟಾಯಿತು</translation> <translation id="945522503751344254">ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಕಳುಹಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 1980abf..3d8456e 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">권한이 부족하여 저장할 수 없습니다. 다른 위치에 저장하세요.</translation> <translation id="4546308221697447294">Chrome으로 빠르게 탐색</translation> <translation id="4546345569117159016">오른쪽 버튼</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" />님이 다음 확장 프로그램을 사용하려고 함</translation> <translation id="4546692474302123343">Google 어시스턴트 음성 입력</translation> <translation id="4547659257713117923">다른 기기의 탭 없음</translation> <translation id="4547672827276975204">자동 설정</translation> @@ -4966,6 +4967,7 @@ <translation id="5338503421962489998">로컬 저장소</translation> <translation id="5339031667684712858">삭제한 사이트</translation> <translation id="5340638867532133571">사이트에서 결제 핸들러를 설치하도록 허용(권장)</translation> +<translation id="5340787663756381836">찾기 및 수정하기(&F)</translation> <translation id="5341793073192892252">다음 쿠키가 차단됨(타사 쿠키는 예외 없이 차단됨)</translation> <translation id="5342091991439452114">PIN은 <ph name="MINIMUM" />자리 이상이어야 합니다.</translation> <translation id="5344036115151554031">Linux 복원 중</translation> @@ -9358,6 +9360,7 @@ <translation id="939401694733344652">이 계정은 현재 Android 앱에서 사용되지 않습니다. 이 Android 앱에서 사용할 계정을 선택하면 다른 Android 앱에서도 같은 계정을 사용할 수 있습니다. <ph name="LINK_BEGIN" />설정 > 계정<ph name="LINK_END" />에서 Android 앱 액세스를 변경할 수 있습니다.</translation> <translation id="939598580284253335">암호 입력</translation> <translation id="939736085109172342">새 폴더</translation> +<translation id="940212040923880623">찾기 및 수정하기(&F)</translation> <translation id="942532530371314860"><ph name="APP_NAME" />에서 Chrome 탭과 오디오를 공유 중입니다.</translation> <translation id="944799160843436808">Steam on Chromebook을 설정하는 중에 문제가 발생했습니다</translation> <translation id="945522503751344254">의견 보내기</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index d3a22e1..a888a9a6 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -4966,6 +4966,7 @@ <translation id="5338503421962489998">Жергиликтүү сактагыч</translation> <translation id="5339031667684712858">Өчүргөн сайттарыңыз</translation> <translation id="5340638867532133571">Сайттарга төлөм иштеткичтерин орнотууга уруксат берүү (сунушталат)</translation> +<translation id="5340787663756381836">&Таап, түзөтүү</translation> <translation id="5341793073192892252">Төмөнкү кукилер бөгөттөлгөн (үчүнчү тараптардын кукилери жалпы шарттарда бөгөттөлөт)</translation> <translation id="5342091991439452114">PIN код кеминде <ph name="MINIMUM" /> орундуу сандан турушу керек</translation> <translation id="5344036115151554031">Linux калыбына келтирилүүдө</translation> @@ -9357,6 +9358,7 @@ <translation id="939401694733344652">Бул аккаунттар азырынча Android колдонмолору менен колдонулбай турушат. Эгер ушул Android колдонмосу үчүн аккаунтту тандасаңыз, аны башка Android колдонмолорунда да пайдалана аласыз. Android колдонмосуна кирүү мүмкүнчүлүгүн <ph name="LINK_BEGIN" />Параметрлер > Аккаунттар<ph name="LINK_END" /> бөлүмүнөн өзгөртө аласыз.</translation> <translation id="939598580284253335">Купуя сөз айкашын киргизиңиз</translation> <translation id="939736085109172342">Жаңы папка</translation> +<translation id="940212040923880623">&Таап, түзөтүү</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> колдонмосу Chrome өтмөгүн жана аудио файлын бөлүшүп жатат.</translation> <translation id="944799160843436808">Chromebook'та Steam'ди тууралоодо ката кетти</translation> <translation id="945522503751344254">Пикириңизди билдириңиз</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 3dca921..7009e5b0 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">ບໍ່ສາມາດບັນທຶກໄດ້ ເນື່ອງຈາກການອະນຸຍາດບໍ່ພຽງພໍ. ກະລຸນາບັນທຶກໄປໃສ່ທີ່ຕັ້ງອື່ນ.</translation> <translation id="4546308221697447294">ທ່ອງເວັບໄດ້ໄວດ້ວຍ Google Chrome</translation> <translation id="4546345569117159016">ປຸ່ມຂວາ</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> ຕ້ອງການໃຊ້ສ່ວນຂະຫຍາຍນີ້:</translation> <translation id="4546692474302123343">ການປ້ອນຂໍ້ມູນດ້ວຍສຽງໃນຜູ້ຊ່ວຍ Google</translation> <translation id="4547659257713117923">ບໍ່ມີແທັບຈາກອຸປະກອນອື່ນ</translation> <translation id="4547672827276975204">ຕັ້ງຄ່າໂດຍອັດຕະໂນມັດ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index d17c97b..325877d 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4112,6 +4112,7 @@ <translation id="4545759655004063573">Negalima išsaugoti dėl nepakankamų leidimų. Išsaugokite kitoje vietoje.</translation> <translation id="4546308221697447294">Greitai naršykite naudodami „Google Chrome“</translation> <translation id="4546345569117159016">Dešinysis mygtukas</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> nori naudoti šį plėtinį:</translation> <translation id="4546692474302123343">„Google“ padėjėjo įvestis balsu</translation> <translation id="4547659257713117923">Nėra skirtukų iš kitų įrenginių</translation> <translation id="4547672827276975204">Nustatyti automatiškai</translation> @@ -4969,6 +4970,7 @@ <translation id="5338503421962489998">Vietinė atmintinė</translation> <translation id="5339031667684712858">Jūsų pašalintos svetainės</translation> <translation id="5340638867532133571">Leisti svetainėms diegti mokėjimų dorokles (rekomenduojama)</translation> +<translation id="5340787663756381836">&Rasti ir redaguoti</translation> <translation id="5341793073192892252">Užblokuoti toliau nurodyti slapukai (trečiųjų šalių slapukai blokuojami be išimčių)</translation> <translation id="5342091991439452114">PIN kodą turi sudaryti bent <ph name="MINIMUM" /> skaitm.</translation> <translation id="5344036115151554031">Atkuriama „Linux“</translation> @@ -9371,6 +9373,7 @@ <translation id="939401694733344652">Šiuo metu šios paskyros nėra naudojamos „Android“ programose. Jei pasirinksite paskyrą, kurią norite naudoti šioje „Android“ programoje, paskyrą taip pat galėsite naudoti kitose „Android“ programose. Galite pakeisti „Android“ programų prieigą skiltyje <ph name="LINK_BEGIN" />„Nustatymai“ > „Paskyros“<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Įvesti slaptafrazę</translation> <translation id="939736085109172342">Naujas aplankas</translation> +<translation id="940212040923880623">&Rasti ir redaguoti</translation> <translation id="942532530371314860">„<ph name="APP_NAME" />“ bendrina „Chrome“ skirtuką ir garsą.</translation> <translation id="944799160843436808">Nustatant „Steam“ „Chromebook“ įrenginyje kilo problema</translation> <translation id="945522503751344254">Siųsti atsiliepimą</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 676821f..67c960a 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -2149,6 +2149,7 @@ <translation id="2804043232879091219">ഇതര ബ്രൗസർ തുറക്കാനായില്ല</translation> <translation id="2804667941345577550">തുറന്നിരിക്കുന്ന ടാബുകളിൽ നിന്ന് ഉൾപ്പെടെ ഈ സൈറ്റിൽ നിന്ന് നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യപ്പെടും.</translation> <translation id="2804680522274557040">ക്യാമറ ഓഫാക്കി</translation> +<translation id="2804742109948581745">വശങ്ങളിലായി</translation> <translation id="2805539617243680210">നിങ്ങൾ തയ്യാറായിക്കഴിഞ്ഞു!</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">ആപ്പുകൾ</translation> @@ -4640,6 +4641,7 @@ <translation id="5056950756634735043">കണ്ടെയ്നറിലേക്ക് കണക്റ്റ് ചെയ്യുന്നു</translation> <translation id="5057110919553308744">നിങ്ങൾ വിപുലീകരണം ക്ലിക്ക് ചെയ്യുമ്പോൾ</translation> <translation id="5059241099014281248">സൈൻ ഇൻ ചെയ്യൽ നിയന്ത്രിക്കുക</translation> +<translation id="5059429103770496207">ഡിസ്പ്ലേ സ്റ്റൈൽ</translation> <translation id="5059526285558225588">എന്ത് പങ്കിടണമെന്ന് തിരഞ്ഞെടുക്കൂ</translation> <translation id="5060332552815861872">സംരക്ഷിക്കുന്നതിനായി ഒരു പ്രിന്റർ ലഭ്യമാണ്.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ഈ ഫോൾഡറിൽ ഒരു ബുക്ക്മാർക്ക് അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}other{ഈ ഫോൾഡറിൽ # ബുക്ക്മാർക്കുകൾ അടങ്ങിയിരിക്കുന്നു. ഇത് ഇല്ലാതാക്കണമെന്ന് നിങ്ങൾക്കുറപ്പാണോ?}}</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 8163ba89..7da1a18 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -4104,6 +4104,7 @@ <translation id="4545759655004063573">Холбогдох зөвшөөрөл дутуу байаа тул хадгалах боломжгүй байна. Та өөр хэсэгт хадгална уу.</translation> <translation id="4546308221697447294">Google Chrome-р хурдан хайгаарай</translation> <translation id="4546345569117159016">Баруун товч</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> энэ өргөтгөлийг ашиглахыг хүсэж байна:</translation> <translation id="4546692474302123343">Google Туслахын дуу хоолойгоор оруулах</translation> <translation id="4547659257713117923">Бусад төхөөрөмжөөс ирсэн цонх байхгүй байна</translation> <translation id="4547672827276975204">Автоматаар тохируулах</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 0789b9be..3347221ba 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -4106,6 +4106,7 @@ <translation id="4545759655004063573">अपुर्या परवानग्यांमुळे सेव्ह करु शकत नाही. कृपया दुसर्या स्थानावर सेव्ह करा.</translation> <translation id="4546308221697447294">Google Chrome सह जलदगतीने ब्राउझ करा</translation> <translation id="4546345569117159016">उजवीकडील बटण</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> यांना हे एक्स्टेंशन वापरायचे आहे:</translation> <translation id="4546692474302123343">Google Assistant व्हॉइस इनपुट</translation> <translation id="4547659257713117923">अन्य डिव्हाइसेसवरील कोणतेही टॅब नाहीत</translation> <translation id="4547672827276975204">आपोआप सेट करा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 568ecfc..8d02dff 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">Tidak dapat menyimpan kerana kebenaran yang tidak mencukupi. Sila simpan ke lokasi yang lain.</translation> <translation id="4546308221697447294">Semak imbas dengan pantas menggunakan Google Chrome</translation> <translation id="4546345569117159016">Butang kanan</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> mahu menggunakan sambungan ini:</translation> <translation id="4546692474302123343">Input suara Google Assistant</translation> <translation id="4547659257713117923">Tiada Tab daripada Peranti Lain</translation> <translation id="4547672827276975204">Tetapkan secara automatik</translation> @@ -4966,6 +4967,7 @@ <translation id="5338503421962489998">Storan setempat</translation> <translation id="5339031667684712858">Laman yang dialih keluar</translation> <translation id="5340638867532133571">Benarkan tapak untuk memasang pengendali pembayaran (disyorkan)</translation> +<translation id="5340787663756381836">&Cari dan edit</translation> <translation id="5341793073192892252">Kuki berikut telah disekat (kuki pihak ketiga disekat tanpa pengecualian)</translation> <translation id="5342091991439452114">PIN mestilah sekurang-kurangnya <ph name="MINIMUM" /> digit</translation> <translation id="5344036115151554031">Memulihkan Linux</translation> @@ -9359,6 +9361,7 @@ <translation id="939401694733344652">Akaun ini tidak digunakan dengan apl Android pada masa ini. Jika anda memilih akaun untuk digunakan dengan apl Android ini, akaun tersebut juga boleh digunakan dengan apl Android lain. Anda boleh menukar akses apl Android dalam <ph name="LINK_BEGIN" />Tetapan > Akaun<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Masukkan frasa laluan</translation> <translation id="939736085109172342">Folder baharu</translation> +<translation id="940212040923880623">&Cari dan Edit</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> berkongsi tab dan audio Chrome.</translation> <translation id="944799160843436808">Terdapat masalah menyediakan Stim pada Chromebook</translation> <translation id="945522503751344254">Hantar maklum balas</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 6231066..0eab31d 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -552,7 +552,7 @@ <translation id="1470946456740188591">Caret ဖြင့်ရှာကြည့်ခြင်းကို ဖွင့်ရန် သို့မဟုတ် ပိတ်ရန် Ctrl+Search+7 ဖြတ်လမ်းလင့်ခ်ကိုသုံးပါ</translation> <translation id="1471034383866732283">ဖတ်ရှုမုဒ်သည် ဤစာမျက်နှာရှိ အဓိကအကြောင်းအရာကို ရှာမတွေ့ပါ</translation> <translation id="1472675084647422956">ပိုပြပါ</translation> -<translation id="1473223074251193484">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက် ထည့်ရန်</translation> +<translation id="1473223074251193484">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း စီစဉ်သတ်မှတ်ရန်</translation> <translation id="1474785664565228650">မိုက်ခရိုဖုန်းဆက်တင် ပြောင်းလဲမှု အကျိုးသက်ရောက်စေရန် Parallels Desktop ကို ပြန်ဖွင့်ရပါမည်။ ရှေ့ဆက်ရန် Parallels Desktop ကို ပြန်ဖွင့်ပါ။</translation> <translation id="1474893630593443211">သင်မြင်ရသည့် ကြော်ငြာများအား ပိုမိုထိန်းချုပ်နိုင်ခြင်း</translation> <translation id="1475502736924165259">အခြားအုပ်စုများနှင့် ကိုက်ညီမှုမရှိသည့် အသိအမှတ်ပြုလက်မှတ်များ သင့်ထံတွင် ရှိပါသည်</translation> @@ -2031,7 +2031,7 @@ <translation id="2704184184447774363">Microsoft စာတမ်း လက်မှတ်ထိုးနေ</translation> <translation id="2704606927547763573">ကူးယူပြီးပါပြီ</translation> <translation id="270516211545221798">ထိတွေ့ညွှန်ကြားခြင်းကိရိယာ အမြန်နှုန်း</translation> -<translation id="2705736684557713153">စာမျက်နှာအောက်ခြေအထိ လှိမ့်ဆင်းသွားပြီး မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ် တစ်မုဟုတ် အသုံးပြုခြင်းစနစ် ရှိနေလျှင် ဖွင့်ပါ။ မရှိလျှင် သုံးရန် အဆင်သင့်ဖြစ်ပါပြီ။</translation> +<translation id="2705736684557713153">စာမျက်နှာအောက်ခြေအထိ လှိမ့်ဆင်းသွားပြီး အမြန်ချိတ်ဆက်မျှဝေခြင်းစနစ် ရှိနေလျှင် ဖွင့်ပါ။ မရှိလျှင် လုပ်ဆောင်စရာအားလုံး ပြီးပါပြီ။</translation> <translation id="2707024448553392710">အစိတ်အပိုင်းကို ဒေါင်းလုဒ် လုပ်နေ</translation> <translation id="270921614578699633">ပျမ်းမျှထက်ပို</translation> <translation id="2709516037105925701">အလိုအလျောက် ဖြည့်စွက်</translation> @@ -2163,6 +2163,7 @@ <translation id="2804043232879091219">အရန်ဘရောင်ဇာ ဖွင့်၍မရပါ</translation> <translation id="2804667941345577550">ဖွင့်ထားသည့်တဘ်များအပါအဝင် ဤဝဘ်ဆိုက်မှ သင်ထွက်သွားပါမည်</translation> <translation id="2804680522274557040">ကင်မရာ ပိတ်ထားပါသည်</translation> +<translation id="2804742109948581745">ဘေးချင်းယှဉ်လျက်</translation> <translation id="2805539617243680210">အဆင်သင့် ဖြစ်ပါပြီ။</translation> <translation id="2805646850212350655">Microsoft လျှို့ဝှက်ကုဒ်သွင်းရေး ဖိုင် စနစ်</translation> <translation id="2805756323405976993">အက်ပ်များ</translation> @@ -3629,7 +3630,7 @@ <translation id="4102469565336584882">ကုဒ် မမှန်ကန်ပါ။ သင့်ထည့်သွင်းမှုသည် LPA:1$<smdp လိပ်စာ>$<စသုံးရန်ကုဒ်> ပုံစံအတိုင်း ဖြစ်သင့်သည်</translation> <translation id="4102906002417106771">Powerwash ပြုလုပ်ရန်အတွက် ပြန်စရန်</translation> <translation id="4104163789986725820">တင်&ပို့ရန်...</translation> -<translation id="4104944259562794668">ဆက်တင်များ > လုံခြုံရေးနှင့် ကိုယ်ရေးအချက်အလက်လုံခြုံမှု > လော့ခ်မျက်နှာပြင်နှင့် လက်မှတ်ထိုးဝင်ခြင်းတို့၌ နောင်တွင်ဖွင့်နိုင်သည်</translation> +<translation id="4104944259562794668">ဆက်တင်များ > လုံခြုံရေးနှင့် ကိုယ်ရေးဒေတာ > လော့ခ်မျက်နှာပြင်နှင့် လက်မှတ်ထိုးဝင်ခြင်းတို့၌ နောင်တွင်ဖွင့်နိုင်သည်</translation> <translation id="4107048419833779140">သိုလှောင်မှုပစ္စည်းကို ရှာဖွေရွေးထုတ်ပြီး ဖြုတ်ပါ</translation> <translation id="4108314971463891922">လိုက်ကြည့်ရန်</translation> <translation id="4109135793348361820"><ph name="USER_NAME" /> (<ph name="USER_EMAIL" />) သို့ဝင်းဒိုးအား ရွှေ့ရန်</translation> @@ -4092,7 +4093,7 @@ <translation id="4534661889221639075">ထပ်စမ်းကြည့်ပါ။</translation> <translation id="4535127706710932914">ပုံသေ ပရိုဖိုင်</translation> <translation id="4536140153723794651">ကွတ်ကီးများကို အမြဲသုံးနိုင်သည့် ဝဘ်ဆိုက်များ</translation> -<translation id="4536769240747010177">မိုဘိုင်းသုံးတွဲချိတ်မှုဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ-</translation> +<translation id="4536769240747010177">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်းဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ-</translation> <translation id="4538417792467843292">စကားလုံးကို ဖျက်ရန်</translation> <translation id="4538792345715658285">လုပ်ငန်း မူဝါဒဖြင့် တပ်ဆင်ပေးခဲ့သည်။</translation> <translation id="4541123282641193691">သင့်အကောင့်ကို စိစစ်၍ မရပါ။ ထပ်စမ်းကြည့်ပါ (သို့) သင့် Chromebook ကို ပြန်စပါ။</translation> @@ -4655,6 +4656,7 @@ <translation id="5056950756634735043">ကွန်တိန်နာနှင့် ချိတ်ဆက်နေသည်</translation> <translation id="5057110919553308744">နောက်ဆက်တွဲကို သင်နှိပ်သည့်အခါ</translation> <translation id="5059241099014281248">လက်မှတ်ထိုးဝင်မှု ကန့်သတ်ရန်</translation> +<translation id="5059429103770496207">ပြသမှုပုံစံ</translation> <translation id="5059526285558225588">မျှဝေလိုသည်များကို ရွေးပါ</translation> <translation id="5060332552815861872">သိမ်းဆည်းရန် ပရင်တာ ၁ ခုရှိသည်။</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{ဤဖိုင်တွဲတွင် ဝဘ်လိပ်စာ တစ်ခု ပါဝင်သည်။ ဖျက်လိုသည်မှာ သေချာပါသလား။}other{ဤဖိုင်တွဲတွင် ဝဘ်လိပ်စာ # ခု ပါဝင်သည်။ ဖျက်လိုသည်မှာ သေချာပါသလား။}}</translation> @@ -4915,7 +4917,7 @@ <translation id="5294097441441645251">အက္ခရာအသေး သို့မဟုတ် အောက်မျဉ်းဖြင့် စတင်ရမည်</translation> <translation id="5294618183559481278">သင့်စက်ရှေ့တွင် လူရှိနေကြောင်းသိရှိရန် သင်၏ <ph name="DEVICE_TYPE" /> သည် အသင့်ပါသော အာရုံခံကိရိယာကို သုံးသည်။ ဒေတာအားလုံးကို သင့်စက်တွင် ချက်ချင်းလုပ်ဆောင်ပြီး ဖျက်ပစ်သည်။ အာရုံခံစနစ် ဒေတာကို Google သို့ မည်သည့်အခါမျှ မပို့ပါ။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ဖန်သားပြင်ကိုမကြည့်ဘဲ စက်သုံးနိုင်ရန် တုံ့ပြန်မှုများပြောပေးပါသည်။ မျက်မမြင်စာရေးစနစ် အကြံပြုချက်ကို ချိတ်ထားသည့်စက်တွင် ရနိုင်သည်။</translation> -<translation id="5297005732522718715">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက် ပြန်စရန်</translation> +<translation id="5297005732522718715">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း စီစဉ်သတ်မှတ်ချက် ပြန်စရန်</translation> <translation id="5297082477358294722">စကားဝှက်ကို သိမ်းပြီးပါပြီ။ သိမ်းဆည်းထားသည့် စကားဝှက်များကို သင်၏ <ph name="SAVED_PASSWORDS_STORE" /> တွင် ကြည့်ရှုစီမံပါ။</translation> <translation id="5297946558563358707">သင့်ဖန်သားပြင်ကို တစ်စုံတစ်ဦးကြည့်ပါက ဖန်သားပြင် ညာဖက်အောက်တွင် ‘အချက်အလက်လုံခြုံမှု’ မျက်လုံးသင်္ကေတကို ပြသည်</translation> <translation id="5298219193514155779">အပြင်အဆင်ကို ဖန်တီးခဲ့သူ</translation> @@ -5099,7 +5101,7 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” ကို ကူးထည့်ပြီး ရှာဖွေရန်</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />၊ <ph name="PERMISSION_2" /> ကို ပိတ်ထားသည်</translation> <translation id="5468173180030470402">ဖိုင်မျှဝေမှုများကို ရှာနေသည်</translation> -<translation id="5468330507528805311">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း အခြေအနေ-</translation> +<translation id="5468330507528805311">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း အခြေအနေ-</translation> <translation id="5469852975082458401">စာရိုက်သည့်ပုံကာဆာဖြင့် စာမျက်နှာများကို ကြည့်ရှုနိုင်သည်။ ပိတ်ရန် F7 ကို နှိပ်ပါ။</translation> <translation id="5470735824776589490">Powerwash ဖြင့် သင့်စက်ကို ပြင်ဆင်သတ်မှတ်ခြင်းမပြုမီ ပြန်စရန်လိုအပ်သည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> <translation id="5471768120198416576">မင်္ဂလာပါ။ ကျွန်ုပ်သည် သင်၏ စာ-မှ-စကား ပြောင်းပေးသော အသံဖြစ်ပါသည်။</translation> @@ -5411,7 +5413,7 @@ <translation id="5747785204778348146">ပြုစုသူ - မတည်ငြိမ်</translation> <translation id="5747809636523347288">ကူးထည့်ပြီး <ph name="URL" /> သို့ သွားရန်</translation> <translation id="5748137879145720682">ကွန်ပျူတာကို ပလပ်ဖြုတ်ထားသောအခါတွင် ဖွင့်ရန်</translation> -<translation id="5751345516399502412">မိုဘိုင်းသုံးတွဲချိတ်မှု အသင့်ပြင်ခြင်းကို ကြည့်ရန်</translation> +<translation id="5751345516399502412">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း အသင့်ဖြစ်မှုကို ကြည့်ရန်</translation> <translation id="5755022574660047665">Google Photos မှ အမှတ်တရများ</translation> <translation id="5756163054456765343">အကူ&အညီ ဌာန</translation> <translation id="5758631781033351321">သင့်ဖတ်ရန်စာရင်းကို ဤနေရာတွင် ပြပါမည်</translation> @@ -5579,7 +5581,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> ဖြင့် စာမျက်နှာကို ရှာရန်</translation> <translation id="5896436821193322561">ခွင့်မပြုပါ</translation> <translation id="5899860758576822363">ChromeVox စကားပြောနေသည့်အချိန်တွင် အသံတိုးတိုးဖြင့်ဖွင့်ရန်</translation> -<translation id="5900243355162006650">မိုဘိုင်းသုံးတွဲချိတ်ခြင်း စီစဉ်သတ်မှတ်ချက်-</translation> +<translation id="5900243355162006650">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း စီစဉ်သတ်မှတ်ချက်-</translation> <translation id="5900302528761731119">Google ပရိုဖိုင်ဓါတ်ပုံ</translation> <translation id="590036993063074298">စကရင်ပွားခြင်း အရည်အသွေး အသေးစိတ်</translation> <translation id="5901069264981746702">သင့်လက်ဗွေဒေတာကို သင်၏ <ph name="DEVICE_TYPE" /> တွင်သာ လုံခြုံစွာ သိမ်းထားသည်။ <ph name="LINK_BEGIN" />ပိုမိုလေ့လာရန်<ph name="LINK_END" /></translation> @@ -7700,7 +7702,7 @@ <translation id="778330624322499012"><ph name="PLUGIN_NAME" /> အားဖွင့်မရပါ။</translation> <translation id="7784067724422331729">သင့်ကွန်ပျူတာရှိ လုံခြုံရေး ကြိုတင်ချိန်ညှိမှုများသည် ဤဖိုင်အား ပိတ်ဆို့ထားသည်။</translation> <translation id="7784796923038949829">ဝဘ်ဆိုက်၏ဒေတာများကို ဖတ်၍ (သို့) ပြောင်း၍ မရပါ</translation> -<translation id="778480864305029524">မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ် တစ်မုဟုတ်ခြင်းသုံးရန် Google Play ဝန်ဆောင်မှုများအတွက် အကြောင်းကြားချက်များကို ဖွင့်ပါ။</translation> +<translation id="778480864305029524">အမြန်ချိတ်ဆက်မျှဝေခြင်းသုံးရန် Google Play ဝန်ဆောင်မှုများအတွက် အကြောင်းကြားချက်များကို ဖွင့်ပါ။</translation> <translation id="7785471469930192436">သက်ဆိုင်မှုရှိပါက သင်၏ရှာဖွေမှတ်တမ်းကို ဖျက်ရန်အတွက် သင့်ရှာဖွေရေး အင်ဂျင်၏ ညွှန်ကြားချက်များကို ကြည့်ပါ</translation> <translation id="7786889348652477777">အက်ပ်ကို ပြန်စရန်</translation> <translation id="7787308148023287649">အခြားမျက်နှာပြင်တစ်ခုပေါ်တွင် ပြသပါ</translation> @@ -7877,7 +7879,7 @@ <translation id="7939328347457537652">စက်အသိအမှတ်ပြုခြင်းများကို စီမံရန်</translation> <translation id="7939412583708276221">မည်သို့ပင်ဖြစ်စေ သိမ်းရန်</translation> <translation id="7940265372707990269"><ph name="SORT_TYPE" /> အလိုက်စီရန်</translation> -<translation id="7941179291434537290">မိုဘိုင်းသုံးတွဲချိတ်မှု အသင့်ပြင်ခြင်း-</translation> +<translation id="7941179291434537290">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း အသင့်ဖြစ်မှု-</translation> <translation id="7942349550061667556">အနီရောင်</translation> <translation id="7943349879009553083">ဧည့်သည်မုဒ်တွင် မရနိုင်ပါ</translation> <translation id="7943368935008348579">PDF များ ဒေါင်းလုဒ်လုပ်ရန်</translation> @@ -8451,7 +8453,7 @@ <translation id="8439506636278576865">ဒီဘာသာစကားဖြင့် စာမျက်နှာများကို ဘာသာပြန်ပေးရန် ကမ်းလှမ်းပါ</translation> <translation id="8440630305826533614">Linux အက်ပ်များ</translation> <translation id="844063558976952706">ဤဝဘ်ဆိုက်တွင် အမြဲဖွင့်ထားရန်</translation> -<translation id="8441313165929432954">မိုဘိုင်းသုံးတွဲချိတ်မှု ဖွင့်/ပိတ်ခြင်း</translation> +<translation id="8441313165929432954">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်းကို ဖွင့်/ပိတ်ခြင်း</translation> <translation id="8443986842926457191">URL သည် စာလုံးရေ ၂၀၄၈ လုံးထက်များနေသည်</translation> <translation id="8446884382197647889">ပိုမို လေ့လာရန်</translation> <translation id="8447409163267621480">Ctrl သို့မဟုတ် Alt ကို နှိပ်ပါ</translation> @@ -9050,7 +9052,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" နှင့် အခြားတဘ် ၁ ခု}other{"<ph name="TAB_TITLE" />" နှင့် အခြားတဘ် # ခု}}</translation> <translation id="8977811652087512276">စကားဝှက် မမှန်ကန်ပါ သို့မဟုတ် ဖိုင်ပျက်စီးနေသည်</translation> <translation id="8978154919215542464">ဖွင့်ရန် - အားလုံးကို စင့်ခ်လုပ်ရန်</translation> -<translation id="8978670037548431647">မိုဘိုင်းသုံးတွဲချိတ်မှုဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ ပြန်လည်စတင်ရန်</translation> +<translation id="8978670037548431647">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်းဆိုင်ရာ စွမ်းဆောင်နိုင်မှုများ ပြန်လည်စတင်ရန်</translation> <translation id="897939795688207351"><ph name="ORIGIN" /> တွင်</translation> <translation id="8980345560318123814">တုံ့ပြန်ချက် အစီရင်ခံစာများ</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - ရပ်တန့်သွားပါသည်</translation> @@ -9064,7 +9066,7 @@ <translation id="8986362086234534611">မေ့ပစ်လိုက်ပါ</translation> <translation id="8986494364107987395">Google ထံသို့ သုံးစွဲမှု စာရင်းအင်းများ နှင့် ပျက်စီးမှု အစီရင်ခံစာများကို အလိုအလျောက် ပို့ပေးရန်</translation> <translation id="8987927404178983737">လ</translation> -<translation id="8989359959810288806">မိုဘိုင်းသုံးတွဲချိတ်ခြင်းအခြေအနေ ပြန်စရန်</translation> +<translation id="8989359959810288806">မိုဘိုင်းသုံး၍ ချိတ်ဆက်ခြင်း အခြေအနေ ပြန်စရန်</translation> <translation id="8991520179165052608">ဝဘ်ဆိုက်က သင့်မိုက်ခရိုဖုန်းကို အသုံးပြုနိုင်သည်</translation> <translation id="8991694323904646277">ကင်မရာ မရှိပါ</translation> <translation id="8993059306046735527"><ph name="DEVICE_TYPE" /> စကားဝှက် မေ့သွားသော်လည်း သင့်စက်တွင်းဒေတာကို ပြန်ယူနိုင်သေးသည်။ သင့် Google Account ကို လက်မှတ်ထိုးဝင်ရမည် (သို့) အကောင့်ပြန်ရယူခြင်းကို သုံးရမည်။</translation> @@ -9134,7 +9136,7 @@ <translation id="9041692268811217999">သင်၏စီမံအုပ်ချုပ်သူက သင့်စက်အတွင်းရှိဖိုင်များ သုံးခွင့်ကို ပိတ်ထားသည်</translation> <translation id="904224458472510106">ဤလုပ်ဆောင်ချက်ကို ပြန်ပြင်၍မရပါ</translation> <translation id="9042827002460091668">အင်တာနက်ချိတ်ဆက်မှုကို စစ်ဆေးပြီး ထပ်စမ်းကြည့်ပါ</translation> -<translation id="9042893549633094279">ကိုယ်ရေးအချက်အလက်လုံခြုံမှုနှင့် လုံခြုံရေး</translation> +<translation id="9042893549633094279">ကိုယ်ရေးဒေတာနှင့် လုံခြုံရေး</translation> <translation id="9043264199499366189">ChromeOS Flex စနစ်ဖြစ်ရပ်များ ရယူရန် စာရင်းသွင်းပါ</translation> <translation id="9044646465488564462">ကွန်ရက်သို့ ချိတ်ဆက် မရခဲ့ပါ: <ph name="DETAILS" /></translation> <translation id="9045160989383249058">သင့်ဖတ်ရန် စာရင်းကို ဘေးအကန့်အသစ်သို့ ရွှေ့ထားသည်။ ဤနေရာတွင် စမ်းကြည့်ပါ။</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index ddf2ce02..01b5769 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -4090,6 +4090,7 @@ <translation id="4545759655004063573">अपुग्दो अनुमतिहरूको कारणले गर्दा बचत गर्न सक्दैन। कृपया अर्को स्थानमा बचत गर्नुहोस्।</translation> <translation id="4546308221697447294">Google Chrome मार्फत छिटो ब्राउज गर्नुहोस्</translation> <translation id="4546345569117159016">दायाँतिरको बटन</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> यो एक्स्टेन्सन प्रयोग गर्न चाहनुहुन्छ:</translation> <translation id="4546692474302123343">Google सहायकमा बोलेर टाइप गर्ने सुविधा</translation> <translation id="4547659257713117923">अन्य यन्त्रहरूबाट कुनै ट्याबहरू छैनन्</translation> <translation id="4547672827276975204">स्वतः सेट गर्नुहोस्</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 0526c4b..cb95d51 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2150,6 +2150,7 @@ <translation id="2804043232879091219">De alternatieve browser kan niet worden geopend</translation> <translation id="2804667941345577550">Je wordt uitgelogd bij deze site, ook in geopende tabbladen</translation> <translation id="2804680522274557040">Camera staat uit</translation> +<translation id="2804742109948581745">Naast elkaar</translation> <translation id="2805539617243680210">Je bent helemaal klaar</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Apps</translation> @@ -4092,6 +4093,7 @@ <translation id="4545759655004063573">Kan niet opslaan vanwege onvoldoende rechten. Sla op een andere locatie op.</translation> <translation id="4546308221697447294">Snel browsen met Google Chrome</translation> <translation id="4546345569117159016">Rechterknop</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> wil deze extensie gebruiken:</translation> <translation id="4546692474302123343">Google Assistent-spraakinvoer</translation> <translation id="4547659257713117923">Geen tabbladen van andere apparaten</translation> <translation id="4547672827276975204">Automatisch instellen</translation> @@ -4639,6 +4641,7 @@ <translation id="5056950756634735043">Verbinding maken met de container</translation> <translation id="5057110919553308744">Wanneer je op de extensie klikt</translation> <translation id="5059241099014281248">Inloggen beperken</translation> +<translation id="5059429103770496207">Weergavestijl</translation> <translation id="5059526285558225588">Kies wat je wilt delen</translation> <translation id="5060332552815861872">Er kan 1 printer worden opgeslagen.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Deze map bevat een bookmark. Weet je zeker dat je deze wilt verwijderen?}other{Deze map bevat # bookmarks. Weet je zeker dat je deze wilt verwijderen?}}</translation> @@ -4948,6 +4951,7 @@ <translation id="5338503421962489998">Lokale opslag</translation> <translation id="5339031667684712858">Door jou verwijderde sites</translation> <translation id="5340638867532133571">Toestaan dat sites betalingshandlers installeren (aanbevolen)</translation> +<translation id="5340787663756381836">&Zoeken en bewerken</translation> <translation id="5341793073192892252">De volgende cookies zijn geblokkeerd (cookies van derden worden zonder uitzondering geblokkeerd)</translation> <translation id="5342091991439452114">Pincode moet minimaal <ph name="MINIMUM" /> cijfers bevatten</translation> <translation id="5344036115151554031">Linux herstellen</translation> @@ -9333,6 +9337,7 @@ <translation id="939401694733344652">Deze accounts worden momenteel niet met Android-apps gebruikt. Als je een account selecteert dat je met deze Android-app wilt gebruiken, kan het account ook worden gebruikt met andere Android-apps. Je kunt de toegang tot Android-apps wijzigen in <ph name="LINK_BEGIN" />Instellingen > Accounts<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Wachtwoordzin opgeven</translation> <translation id="939736085109172342">Nieuwe map</translation> +<translation id="940212040923880623">&Zoeken en bewerken</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> deelt een Chrome-tabblad en audio.</translation> <translation id="944799160843436808">Er is iets misgegaan bij het instellen van Steam op je Chromebook</translation> <translation id="945522503751344254">Feedback sturen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index b5930c9a..6c648c0 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -2160,6 +2160,7 @@ <translation id="2804043232879091219">Kunne ikke åpne den alternative nettleseren</translation> <translation id="2804667941345577550">Du blir logget av dette nettstedet, også i faner som er åpne</translation> <translation id="2804680522274557040">Kameraet er slått av</translation> +<translation id="2804742109948581745">Side ved side</translation> <translation id="2805539617243680210">Alt er klart!</translation> <translation id="2805646850212350655">Microsoft Encrypting File System</translation> <translation id="2805756323405976993">Apper</translation> @@ -4650,6 +4651,7 @@ <translation id="5056950756634735043">Kobler til beholderen</translation> <translation id="5057110919553308744">Når du klikker på utvidelsen</translation> <translation id="5059241099014281248">Begrens pålogging</translation> +<translation id="5059429103770496207">Visningsstil</translation> <translation id="5059526285558225588">Velg hva du vil dele</translation> <translation id="5060332552815861872">1 skriver er tilgjengelig for lagring.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Denne mappen inneholder et bokmerke. Er du sikker på at du vil slette den?}other{Denne mappen inneholder # bokmerker. Er du sikker på at du vil slette den?}}</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 440c6e5a9..2fe9841 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">ਅਧੂਰੀਆਂ ਇਜਾਜ਼ਤਾਂ ਕਾਰਨ ਰੱਖਿਅਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ। ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਹੋਰ ਟਿਕਾਣਾ ਰੱਖਿਅਤ ਕਰੋ।</translation> <translation id="4546308221697447294">Google Chrome ਨਾਲ ਤੇਜ਼ ਬ੍ਰਾਊਜ਼ ਕਰੋ</translation> <translation id="4546345569117159016">ਸੱਜਾ ਬਟਨ</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> ਦੀ ਇਸ ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਵਰਤਣ ਦੀ ਇੱਛਾ ਹੈ:</translation> <translation id="4546692474302123343">Google Assistant ਵੌਇਸ ਇਨਪੁੱਟ</translation> <translation id="4547659257713117923">ਹੋਰਾਂ ਡਿਵਾਈਸਾਂ ਤੋਂ ਕੋਈ ਟੈਬਸ ਨਹੀਂ</translation> <translation id="4547672827276975204">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਸੈੱਟ ਕਰੋ</translation> @@ -4966,6 +4967,7 @@ <translation id="5338503421962489998">ਸਥਾਨਕ ਸਟੋਰੇਜ</translation> <translation id="5339031667684712858">ਤੁਹਾਡੇ ਵੱਲੋਂ ਹਟਾਈਆਂ ਗਈਆਂ ਸਾਈਟਾਂ</translation> <translation id="5340638867532133571">ਸਾਈਟਾਂ ਨੂੰ ਭੁਗਤਾਨ ਹੈਂਡਲਰ ਸਥਾਪਤ ਕਰਨ ਦਿਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> +<translation id="5340787663756381836">&ਲੱਭੋ ਅਤੇ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="5341793073192892252">ਅੱਗੇ ਦਿੱਤੀਆਂ ਕੁਕੀਜ਼ ਬਲਾਕ ਕੀਤੀਆਂ ਗਈਆਂ (ਤੀਜੀ-ਪਾਰਟੀ ਦੀਆਂ ਕੁਕੀਜ਼ ਬਿਨਾਂ ਅਪਵਾਦ ਦੇ ਬਲਾਕ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ)</translation> <translation id="5342091991439452114">PIN ਘੱਟੋ-ਘੱਟ <ph name="MINIMUM" /> ਅੰਕਾਂ ਦਾ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ</translation> <translation id="5344036115151554031">Linux ਨੂੰ ਮੁੜ-ਬਹਾਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -9360,6 +9362,7 @@ <translation id="939401694733344652">ਫ਼ਿਲਹਾਲ ਇਨ੍ਹਾਂ ਖਾਤਿਆਂ ਦੀ ਵਰਤੋਂ Android ਐਪਾਂ ਨਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ। ਜੇ ਤੁਸੀਂ ਇਸ Android ਐਪ ਨਾਲ ਵਰਤਣ ਲਈ ਕੋਈ ਖਾਤਾ ਚੁਣਦੇ ਹੋ, ਤਾਂ ਖਾਤੇ ਨੂੰ ਹੋਰ Android ਐਪਾਂ ਨਾਲ ਵੀ ਵਰਤਿਆ ਜਾ ਸਕਦਾ ਹੈ। ਤੁਸੀਂ <ph name="LINK_BEGIN" />ਸੈਟਿੰਗਾਂ > ਖਾਤੇ<ph name="LINK_END" /> ਵਿੱਚ ਜਾ ਕੇ Android ਐਪਾਂ ਦੀ ਪਹੁੰਚ ਨੂੰ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="939598580284253335">ਪਾਸਫਰੇਜ਼ ਦਾਖਲ ਕਰੋ</translation> <translation id="939736085109172342">ਨਵਾਂ ਫੋਲਡਰ</translation> +<translation id="940212040923880623">&ਲੱਭੋ ਅਤੇ ਸੰਪਾਦਨ ਕਰੋ</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> Chrome ਟੈਬ ਅਤੇ ਆਡੀਓ ਸਾਂਝੀ ਕਰ ਰਹੀ ਹੈ।</translation> <translation id="944799160843436808">Chromebook 'ਤੇ Steam ਦਾ ਸੈੱਟਅੱਪ ਕਰਨ ਵਿੱਚ ਕੋਈ ਸਮੱਸਿਆ ਆਈ</translation> <translation id="945522503751344254">ਪ੍ਰਤੀਕਰਮ ਭੇਜੋ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 7b010c37..ad8cd348 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -2137,6 +2137,7 @@ <translation id="2804043232879091219">Nie udało się otworzyć alternatywnej przeglądarki</translation> <translation id="2804667941345577550">Wylogujemy Cię z tej strony, także na otwartych kartach</translation> <translation id="2804680522274557040">Kamera wyłączona</translation> +<translation id="2804742109948581745">Obok siebie</translation> <translation id="2805539617243680210">Wszystko gotowe</translation> <translation id="2805646850212350655">System szyfrowania plików firmy Microsoft</translation> <translation id="2805756323405976993">Aplikacje</translation> @@ -4080,6 +4081,7 @@ <translation id="4545759655004063573">Nie można zapisać z powodu niewystarczających uprawnień. Zapisz w innym miejscu.</translation> <translation id="4546308221697447294">Szybkie przeglądanie dzięki Google Chrome</translation> <translation id="4546345569117159016">Prawy przycisk</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> chce używać tego rozszerzenia:</translation> <translation id="4546692474302123343">Głosowe wprowadzanie tekstu w Asystencie Google</translation> <translation id="4547659257713117923">Brak kart z innych urządzeń</translation> <translation id="4547672827276975204">Ustaw automatycznie</translation> @@ -4628,6 +4630,7 @@ <translation id="5056950756634735043">Łączę się z kontenerem</translation> <translation id="5057110919553308744">Gdy klikniesz rozszerzenie</translation> <translation id="5059241099014281248">Ograniczanie logowania się</translation> +<translation id="5059429103770496207">Styl wyświetlania</translation> <translation id="5059526285558225588">Wybierz, co chcesz udostępnić</translation> <translation id="5060332552815861872">Dostępna do zapisania jest jedna drukarka.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Ten folder zawiera zakładkę. Na pewno chcesz go usunąć?}few{Ten folder zawiera # zakładki. Na pewno chcesz go usunąć?}many{Ten folder zawiera # zakładek. Na pewno chcesz go usunąć?}other{Ten folder zawiera # zakładki. Na pewno chcesz go usunąć?}}</translation> @@ -4937,6 +4940,7 @@ <translation id="5338503421962489998">Przechowywanie lokalne</translation> <translation id="5339031667684712858">Usunięte witryny</translation> <translation id="5340638867532133571">Zezwalaj stronom na instalowanie modułów do obsługi płatności (zalecane)</translation> +<translation id="5340787663756381836">&Znajdź i edytuj</translation> <translation id="5341793073192892252">Zablokowano te pliki cookie (pliki cookie innych firm są blokowane bez wyjątków)</translation> <translation id="5342091991439452114">Kod PIN musi się składać co najmniej z <ph name="MINIMUM" /> cyfr</translation> <translation id="5344036115151554031">Przywracanie Linuksa</translation> @@ -9326,6 +9330,7 @@ <translation id="939401694733344652">Te konta nie są obecnie używane z aplikacjami na Androida. Jeśli wybierzesz konto do używania z tą aplikacją na Androida, będzie go też można używać z innymi aplikacjami tego typu. Dostęp do aplikacji na Androida możesz zmienić, klikając <ph name="LINK_BEGIN" />Ustawienia > Konta<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Wpisz hasło</translation> <translation id="939736085109172342">Nowy folder</translation> +<translation id="940212040923880623">&Znajdź i edytuj</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> udostępnia kartę i dźwięk z Chrome.</translation> <translation id="944799160843436808">Wystąpił problem podczas konfigurowania aplikacji Steam na Chromebooka</translation> <translation id="945522503751344254">Prześlij opinię</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index de2ca9d..0d1df6b 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2166,6 +2166,7 @@ <translation id="2804043232879091219">Não foi possível abrir o navegador alternativo</translation> <translation id="2804667941345577550">Sua conta será desconectada desse site, inclusive nas guias abertas</translation> <translation id="2804680522274557040">Câmera desativada</translation> +<translation id="2804742109948581745">Lado a lado</translation> <translation id="2805539617243680210">Tudo pronto</translation> <translation id="2805646850212350655">Sistema de arquivos com criptografia da Microsoft</translation> <translation id="2805756323405976993">Apps</translation> @@ -4660,6 +4661,7 @@ <translation id="5056950756634735043">Conectando ao contêiner</translation> <translation id="5057110919553308744">Quando você clicar na extensão</translation> <translation id="5059241099014281248">Restringir o login</translation> +<translation id="5059429103770496207">Estilo de exibição</translation> <translation id="5059526285558225588">Escolha o que compartilhar</translation> <translation id="5060332552815861872">Há 1 impressora disponível para salvar.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Esta pasta contém um favorito. Você quer mesmo excluí-la?}one{Esta pasta contém # favoritos. Você quer mesmo excluí-la?}other{Esta pasta contém # favoritos. Você quer mesmo excluí-la?}}</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index b51bf28..63dc530e 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -4095,6 +4095,7 @@ <translation id="4545759655004063573">Não é possível guardar devido a permissões insuficientes. Guarde noutra localização.</translation> <translation id="4546308221697447294">Navegue mais depressa com o Google Chrome</translation> <translation id="4546345569117159016">Botão direito</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> quer usar esta extensão:</translation> <translation id="4546692474302123343">Entrada de texto por voz do Assistente Google</translation> <translation id="4547659257713117923">Sem separadores de outros dispositivos</translation> <translation id="4547672827276975204">Definir automaticamente</translation> @@ -4536,7 +4537,7 @@ <translation id="4940845626435830013">Reservar tamanho do disco</translation> <translation id="4941074198479265146">Normalmente, os sites estabelecem ligação a dispositivos MIDI para funcionalidades de criação e edição de música.</translation> <translation id="4941246025622441835">Usar a requisição deste dispositivo ao inscrever o dispositivo para gestão empresarial:</translation> -<translation id="4941627891654116707">Tamanho do tipo de letra</translation> +<translation id="4941627891654116707">Tamanho da letra</translation> <translation id="4941963255146903244">Veja as fotos, os conteúdos multimédia e as apps do telemóvel</translation> <translation id="494286511941020793">Ajuda de configuração de proxy</translation> <translation id="4943368462779413526">Bola de futebol</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 42dd543..ae9e4a8 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -4094,6 +4094,7 @@ <translation id="4545759655004063573">Nu se poate salva din cauza permisiunilor insuficiente. Salvați în altă locație.</translation> <translation id="4546308221697447294">Navighează rapid folosind Google Chrome</translation> <translation id="4546345569117159016">Butonul drept</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> dorește să folosească această extensie:</translation> <translation id="4546692474302123343">Intrare vocală în Asistentul Google</translation> <translation id="4547659257713117923">Nu există file de pe alte dispozitive</translation> <translation id="4547672827276975204">Setează în mod automat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index a6cc3e6f..59d56da 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -2152,6 +2152,7 @@ <translation id="2804043232879091219">Не удалось открыть альтернативный браузер.</translation> <translation id="2804667941345577550">Вы автоматически выйдете из аккаунта на этом сайте (в том числе на открытых вкладках).</translation> <translation id="2804680522274557040">Камера отключена</translation> +<translation id="2804742109948581745">Параллельный</translation> <translation id="2805539617243680210">Все готово!</translation> <translation id="2805646850212350655">Зашифрованная файловая система (EFS) Microsoft</translation> <translation id="2805756323405976993">Сервисы</translation> @@ -4095,6 +4096,7 @@ <translation id="4545759655004063573">Не удается сохранить файл: нет прав. Выберите другой каталог.</translation> <translation id="4546308221697447294">Быстрый и удобный браузер Google Chrome</translation> <translation id="4546345569117159016">Правая кнопка</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> просит разрешить использовать это расширение:</translation> <translation id="4546692474302123343">Голосовой ввод в Google Ассистенте</translation> <translation id="4547659257713117923">Нет вкладок с других устройств</translation> <translation id="4547672827276975204">Автоматическое определение</translation> @@ -4643,6 +4645,7 @@ <translation id="5056950756634735043">Подключение к контейнеру…</translation> <translation id="5057110919553308744">При нажатии на расширение</translation> <translation id="5059241099014281248">Ограниченный вход</translation> +<translation id="5059429103770496207">Стиль показа</translation> <translation id="5059526285558225588">Выберите часть экрана для демонстрации</translation> <translation id="5060332552815861872">Для сохранения доступен 1 принтер.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{В папке есть закладка. Все равно удалить ее?}one{В папке есть # закладка. Все равно удалить ее?}few{В папке есть # закладки. Все равно удалить ее?}many{В папке есть # закладок. Все равно удалить ее?}other{В папке есть # закладки. Все равно удалить ее?}}</translation> @@ -7893,7 +7896,7 @@ <translation id="7952904276017482715">Ожидаемый идентификатор: <ph name="EXPECTED_ID" />, полученный идентификатор: <ph name="NEW_ID" /></translation> <translation id="7953669802889559161">Способы ввода</translation> <translation id="7953955868932471628">Управление ярлыками</translation> -<translation id="7955105108888461311">Запросить доступ лично</translation> +<translation id="7955105108888461311">Попросить лично</translation> <translation id="7955177647836564772">Если функция Smart Lock включена и телефон разблокирован, вводить пароль или PIN-код не нужно.</translation> <translation id="7956373551960864128">Сохраненные принтеры</translation> <translation id="7957074856830851026">Получать данные об устройстве, например серийный номер или идентификатор объекта</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index b7220be..dd6f8b4 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -4098,6 +4098,7 @@ <translation id="4545759655004063573">අප්රමාණවත් අවසර හේතුවෙන් සුරැකීමට නොහැකිය. කරුණාකර වෙනත් පිහිටීමක් වෙත සුරකින්න.</translation> <translation id="4546308221697447294">Google Chrome සමඟ වේගයෙන් බ්රවුස් කරන්න</translation> <translation id="4546345569117159016">දකුණු බොත්තම</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> හට මෙම දිගුව භාවිතා කිරීමට අවශ්යයි:</translation> <translation id="4546692474302123343">Google සහකරු හඬ ආදානය</translation> <translation id="4547659257713117923">වෙනත් උපාංග වෙතින් පටිති නොමැත</translation> <translation id="4547672827276975204">ස්වයංක්රීයව සකසන්න</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index c209b8cf..18f42c87 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2152,6 +2152,7 @@ <translation id="2804043232879091219">Alternatívny prehliadač sa nepodarilo otvoriť</translation> <translation id="2804667941345577550">Systém vás odhlási z tohto webu (aj v otvorených kartách)</translation> <translation id="2804680522274557040">Kamera je vypnutá</translation> +<translation id="2804742109948581745">Vedľa seba</translation> <translation id="2805539617243680210">Všetko je nastavené.</translation> <translation id="2805646850212350655">Systém šifrovania súborov spoločnosti Microsoft</translation> <translation id="2805756323405976993">Aplikácie</translation> @@ -4643,6 +4644,7 @@ <translation id="5056950756634735043">Pripája sa ku kontajneru</translation> <translation id="5057110919553308744">Keď kliknete na rozšírenie</translation> <translation id="5059241099014281248">Obmedziť prihlásenie</translation> +<translation id="5059429103770496207">Štýl zobrazenia</translation> <translation id="5059526285558225588">Vyberte, čo sa má zdieľať</translation> <translation id="5060332552815861872">Môžete si uložiť jednu tlačiareň.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Tento priečinok obsahuje záložku. Naozaj ho chcete odstrániť?}few{Tento priečinok obsahuje # záložky. Naozaj ho chcete odstrániť?}many{Tento priečinok obsahuje # záložky. Naozaj ho chcete odstrániť?}other{Tento priečinok obsahuje # záložiek. Naozaj ho chcete odstrániť?}}</translation> @@ -4952,6 +4954,7 @@ <translation id="5338503421962489998">Miestny ukladací priestor</translation> <translation id="5339031667684712858">Weby, ktoré ste odstránili</translation> <translation id="5340638867532133571">Povoliť webom inštalovať obslužné nástroje platieb (odporúčané)</translation> +<translation id="5340787663756381836">&Nájsť a upraviť</translation> <translation id="5341793073192892252">Nasledujúce súbory cookie boli zablokované (súbory cookie tretej strany sú blokované bez výnimky):</translation> <translation id="5342091991439452114">Minimálny počet číslic kódu PIN: <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Obnovuje sa Linux</translation> @@ -9349,6 +9352,7 @@ <translation id="939401694733344652">Tieto účty sa momentálne s aplikáciami pre Android nepoužívajú. Ak vyberiete účet na používanie s touto aplikáciou pre Android, bude sa dať používať aj s inými aplikáciami pre Android. Prístup do aplikácie pre Android môžete zmeniť v sekcii <ph name="LINK_BEGIN" />Nastavenia > Účty<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Zadať prístupovú frázu</translation> <translation id="939736085109172342">Nový priečinok</translation> +<translation id="940212040923880623">&Nájsť a upraviť</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> zdieľa kartu a zvuk Chromu.</translation> <translation id="944799160843436808">Pri nastavovaní aplikácie Steam v Chromebooku sa vyskytol problém</translation> <translation id="945522503751344254">Odoslať spätnú väzbu</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 2cf6875..19914a6 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -4112,6 +4112,7 @@ <translation id="4545759655004063573">Zaradi nezadostnih dovoljenj tega ni mogoče shraniti. Shranite na drugo mesto.</translation> <translation id="4546308221697447294">Hitro brskanje z Google Chromom</translation> <translation id="4546345569117159016">Desni gumb</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> želi uporabljati to razširitev:</translation> <translation id="4546692474302123343">Glasovni vnos za Pomočnika Google</translation> <translation id="4547659257713117923">Ni zavihkov iz drugih naprav</translation> <translation id="4547672827276975204">Nastavi samodejno</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 21bd1c9..48e9251 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -2149,6 +2149,7 @@ <translation id="2804043232879091219">Nismo uspeli da otvorimo alternativni pregledač</translation> <translation id="2804667941345577550">Odjavićete se sa ovog sajta, uključujući i instance na otvorenim karticama</translation> <translation id="2804680522274557040">Dozvola za kameru je isključena</translation> +<translation id="2804742109948581745">Uporedo</translation> <translation id="2805539617243680210">Spremni ste!</translation> <translation id="2805646850212350655">Microsoft sistem za šifrovanje datoteka</translation> <translation id="2805756323405976993">Aplikacije</translation> @@ -4092,6 +4093,7 @@ <translation id="4545759655004063573">Nije moguće sačuvati zbog nedovoljnog broja dozvola. Sačuvajte na drugu lokaciju.</translation> <translation id="4546308221697447294">Pregledajte brzo uz Google Chrome</translation> <translation id="4546345569117159016">Desno dugme</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> želi da koristi ovaj dodatak:</translation> <translation id="4546692474302123343">Glasovni unos u Google pomoćniku</translation> <translation id="4547659257713117923">Nema kartica sa drugih uređaja</translation> <translation id="4547672827276975204">Podesi automatski</translation> @@ -4640,6 +4642,7 @@ <translation id="5056950756634735043">Povezuje se sa kontejnerom</translation> <translation id="5057110919553308744">Kada kliknete na dodatak</translation> <translation id="5059241099014281248">Ograničite prijavljivanje</translation> +<translation id="5059429103770496207">Stil prikaza</translation> <translation id="5059526285558225588">Odaberite šta ćete deliti</translation> <translation id="5060332552815861872">Dostupan je 1 štampač za čuvanje.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Ovaj folder sadrži obeleživač. Želite li stvarno da ga izbrišete?}one{Ovaj folder sadrži # obeleživač. Želite li stvarno da ga izbrišete?}few{Ovaj folder sadrži # obeleživača. Želite li stvarno da ga izbrišete?}other{Ovaj folder sadrži # obeleživača. Želite li stvarno da ga izbrišete?}}</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 1ceda816..e1b9c88 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2149,6 +2149,7 @@ <translation id="2804043232879091219">Нисмо успели да отворимо алтернативни прегледач</translation> <translation id="2804667941345577550">Одјавићете се са овог сајта, укључујући и инстанце на отвореним картицама</translation> <translation id="2804680522274557040">Дозвола за камеру је искључена</translation> +<translation id="2804742109948581745">Упоредо</translation> <translation id="2805539617243680210">Спремни сте!</translation> <translation id="2805646850212350655">Microsoft систем за шифровање датотека</translation> <translation id="2805756323405976993">Апликације</translation> @@ -4092,6 +4093,7 @@ <translation id="4545759655004063573">Није могуће сачувати због недовољног броја дозвола. Сачувајте на другу локацију.</translation> <translation id="4546308221697447294">Прегледајте брзо уз Google Chrome</translation> <translation id="4546345569117159016">Десно дугме</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> жели да користи овај додатак:</translation> <translation id="4546692474302123343">Гласовни унос у Google помоћнику</translation> <translation id="4547659257713117923">Нема картица са других уређаја</translation> <translation id="4547672827276975204">Подеси аутоматски</translation> @@ -4640,6 +4642,7 @@ <translation id="5056950756634735043">Повезује се са контејнером</translation> <translation id="5057110919553308744">Када кликнете на додатак</translation> <translation id="5059241099014281248">Ограничите пријављивање</translation> +<translation id="5059429103770496207">Стил приказа</translation> <translation id="5059526285558225588">Одаберите шта ћете делити</translation> <translation id="5060332552815861872">Доступан је 1 штампач за чување.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Овај фолдер садржи обележивач. Желите ли стварно да га избришете?}one{Овај фолдер садржи # обележивач. Желите ли стварно да га избришете?}few{Овај фолдер садржи # обележивача. Желите ли стварно да га избришете?}other{Овај фолдер садржи # обележивача. Желите ли стварно да га избришете?}}</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 90e8057..08fbd7d 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">Minst <ph name="INSTALL_SIZE" /> utrymme rekommenderas för Linux. Frigör utrymme genom att radera filer på enheten.</translation> <translation id="1038643060055067718">Rader:</translation> <translation id="1039337018183941703">Ogiltig eller skadad fil</translation> +<translation id="1040761927998636252">Namnlöst bokmärke för <ph name="URL" /></translation> <translation id="1041175011127912238">Sidan svarar inte</translation> <translation id="1041263367839475438">Tillgängliga enheter</translation> <translation id="1042174272890264476">Datorn har även RLZ-biblioteket för <ph name="SHORT_PRODUCT_NAME" /> inbyggt. RLZ tilldelar en icke-unik, icke-personligt identifierbar tagg för att mäta antalet sökningar och användningen av <ph name="SHORT_PRODUCT_NAME" /> som drivs av en viss reklamkampanj. Dessa etiketter visas ibland vid sökningar på Google i <ph name="PRODUCT_NAME" />.</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index b7cb707..fcaeaf0f 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -4104,6 +4104,7 @@ <translation id="4545759655004063573">Haiwezi kuhifadhi kwa sababu ya idhini isiyotosha. Tafadhali hifadhi katika eneo jingine.</translation> <translation id="4546308221697447294">Vinjari kwa kasi kwa kutumia Google Chrome</translation> <translation id="4546345569117159016">Kitufe cha kulia</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> angependa kutumia kiendelezi hiki:</translation> <translation id="4546692474302123343">Kuweka data kwa kutamka ukitumia programu ya Mratibu wa Google</translation> <translation id="4547659257713117923">Hakuna Vichupo Kutoka Kwenye Vifaa Vingine</translation> <translation id="4547672827276975204">Weka saa kiotomatiki</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index a52603e..10cd7a7 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1249,7 +1249,7 @@ <translation id="2048554637254265991">கண்டெய்னர் நிர்வாகியைத் தொடங்குவதில் பிழை. மீண்டும் முயலவும்.</translation> <translation id="2048653237708779538">இச்செயலைச் செய்ய இயலாது</translation> <translation id="204914487372604757">ஷார்ட்கட்டை உருவாக்குக</translation> -<translation id="2050339315714019657">செங்குத்து நிலை</translation> +<translation id="2050339315714019657">போர்ட்ரெய்ட்</translation> <translation id="2051555741181591333">ஹாட்ஸ்பாட்டைத் தானாக முடக்குதல்</translation> <translation id="2052572566310583903">உங்களின் பிற சாதனங்களில் நிறுவப்பட்டுள்ளது</translation> <translation id="2053105195397337973">விளம்பர ஸ்பேம் & மோசடியைத் தடுப்பதற்குத் தளங்களை அனுமதிப்பதுடன், கண்காணிப்பைத் தடுப்பதற்கான வழிகளையும் நாங்கள் கண்டறிந்து வருகிறோம்.</translation> @@ -4109,6 +4109,7 @@ <translation id="4545759655004063573">போதிய அனுமதிகள் இல்லாத காரணத்தால் சேமிக்க முடியவில்லை. மற்றொரு இடத்தில் சேமிக்கவும்.</translation> <translation id="4546308221697447294">Google Chromeஐப் பயன்படுத்தி, விரைவாக உலாவவும்</translation> <translation id="4546345569117159016">வலது பட்டன்</translation> +<translation id="4546509872654834602">இந்த நீடிப்பை <ph name="SUPERVISED_USER_NAME" /> பயன்படுத்த விரும்புகிறார்:</translation> <translation id="4546692474302123343">Google Assistant குரல் உள்ளீடு</translation> <translation id="4547659257713117923">பிற சாதனங்களின் தாவல்கள் எதுவுமில்லை</translation> <translation id="4547672827276975204">தானாக அமை</translation> @@ -4966,6 +4967,7 @@ <translation id="5338503421962489998">அக சேமிப்பகம்</translation> <translation id="5339031667684712858">நீங்கள் அகற்றிய தளங்கள்</translation> <translation id="5340638867532133571">பேமண்ட் ஹேண்ட்லர்களை நிறுவுவதற்குத் தளங்களை அனுமதிக்கும் (பரிந்துரைக்கப்படுவது)</translation> +<translation id="5340787663756381836">&தேடி திருத்து</translation> <translation id="5341793073192892252">பின்வரும் குக்கீகள் தடுக்கப்பட்டன (மூன்றாம் தரப்புக் குக்கீகள் எந்த விதிவிலக்கும் இன்றி தடுக்கப்படுகின்றன):</translation> <translation id="5342091991439452114">பின்னில் குறைந்தது <ph name="MINIMUM" /> இலக்கங்கள் இருக்க வேண்டும்</translation> <translation id="5344036115151554031">Linuxஸை மீட்டெடுக்கிறது</translation> @@ -9359,6 +9361,7 @@ <translation id="939401694733344652">இந்தக் கணக்குகள் தற்போது Android ஆப்ஸிற்குப் பயன்படுத்தப்படவில்லை. இந்த Android ஆப்ஸிற்குப் பயன்படுத்த ஒரு கணக்கைத் தேர்ந்தெடுத்தால் பிற Android ஆப்ஸிற்கும் அந்தக் கணக்கு பயன்படுத்தப்படும். <ph name="LINK_BEGIN" />அமைப்புகள் > கணக்குகள்<ph name="LINK_END" /> என்பதற்குச் சென்று Android ஆப்ஸிற்கான அணுகலை மாற்றலாம்.</translation> <translation id="939598580284253335">கடவுச்சொற்றொடரை உள்ளிடுக</translation> <translation id="939736085109172342">புதிய ஃபோல்டர்</translation> +<translation id="940212040923880623">&தேடி திருத்து</translation> <translation id="942532530371314860">Chrome தாவலையும் ஆடியோவையும் <ph name="APP_NAME" /> பகிர்கிறது.</translation> <translation id="944799160843436808">Chromebookகில் Steam ஆப்ஸை அமைப்பதில் சிக்கல் ஏற்பட்டது</translation> <translation id="945522503751344254">கருத்தை அனுப்பு</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 532afce..578e79c4 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -4965,6 +4965,7 @@ <translation id="5338503421962489998">స్థానిక స్టోరేజ్</translation> <translation id="5339031667684712858">మీరు తీసివేసిన సైట్లు</translation> <translation id="5340638867532133571">చెల్లింపు హ్యాండ్లర్లను ఇన్స్టాల్ చేయడానికి సైట్లను అనుమతించండి (సిఫార్సు చేస్తున్నాము)</translation> +<translation id="5340787663756381836">&కనుగొని, ఎడిట్ చేయండి</translation> <translation id="5341793073192892252">కింది కుక్కీలు బ్లాక్ చేయబడ్డాయి (మూడవ-పక్ష కుక్కీలన్నీ, మినహాయింపు లేకుండా బ్లాక్ చేయబడుతున్నాయి)</translation> <translation id="5342091991439452114">PIN తప్పనిసరిగా కనీసం <ph name="MINIMUM" /> అంకెలు ఉండాలి</translation> <translation id="5344036115151554031">Linux రీస్టోర్ చేయబడుతోంది</translation> @@ -9353,6 +9354,7 @@ <translation id="939401694733344652">Android యాప్లతో ఈ ఖాతాలను ప్రస్తుతం ఉపయోగించడం లేదు. ఈ Android యాప్తో ఉపయోగించడానికి మీరు ఒక ఖాతాను ఎంచుకుంటే, ఆ ఖాతాను ఇతర Android యాప్లతో కూడా ఉపయోగించవచ్చు. మీరు Android యాప్ యాక్సెస్ను <ph name="LINK_BEGIN" />సెట్టింగ్లు > ఖాతాలు<ph name="LINK_END" /> లింక్లో మార్చవచ్చు.</translation> <translation id="939598580284253335">రహస్య పదబంధాన్ని నమోదు చేయండి</translation> <translation id="939736085109172342">కొత్త ఫోల్డర్</translation> +<translation id="940212040923880623">&కనుగొని, ఎడిట్ చేయండి</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> ఒక Chrome ట్యాబ్ను మరియు ఆడియోను షేర్ చేస్తోంది.</translation> <translation id="944799160843436808">Chromebookలో Steamను సెటప్ చేయడంలో సమస్య ఏర్పడింది</translation> <translation id="945522503751344254">ఫీడ్బ్యాక్ పంపండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index ed15f04..d50351d 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">ขอแนะนำให้เตรียมพื้นที่ว่างอย่างน้อย <ph name="INSTALL_SIZE" /> สำหรับ Linux หากต้องการเพิ่มพื้นที่ว่าง ให้ลบไฟล์ออกจากอุปกรณ์</translation> <translation id="1038643060055067718">จำนวนบรรทัด:</translation> <translation id="1039337018183941703">ไฟล์ไม่ถูกต้องหรือเสียหาย</translation> +<translation id="1040761927998636252">บุ๊กมาร์กที่ไม่มีชื่อสําหรับ <ph name="URL" /></translation> <translation id="1041175011127912238">หน้านี้ไม่ตอบสนอง</translation> <translation id="1041263367839475438">อุปกรณ์ที่ใช้ได้</translation> <translation id="1042174272890264476">คอมพิวเตอร์ของคุณมาพร้อมกับไลบรารี RLZ ของ <ph name="SHORT_PRODUCT_NAME" /> ในตัว โดย RLZ จะระบุแท็กที่ซ้ำกันได้และไม่สามารถระบุตัวบุคคลเพื่อวัดการค้นหาและการใช้งาน <ph name="SHORT_PRODUCT_NAME" /> ที่ทำงานโดยแคมเปญส่งเสริมการขายบางรายการ บางครั้งป้ายกำกับจะปรากฏในคำค้นหาของ Google Search ใน <ph name="PRODUCT_NAME" /></translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 3fbdfb0..90860ee 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4091,6 +4091,7 @@ <translation id="4545759655004063573">İzinler yetersiz olduğundan kaydedilemiyor. Lütfen başka bir yere kaydedin.</translation> <translation id="4546308221697447294">Google Chrome ile hızlı göz atın</translation> <translation id="4546345569117159016">Sağ düğme</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> şu uzantıyı kullanmak istiyor:</translation> <translation id="4546692474302123343">Google Asistan ses girişi</translation> <translation id="4547659257713117923">Diğer Cihazlardan Sekme Yok</translation> <translation id="4547672827276975204">Otomatik olarak ayarla</translation> @@ -4948,6 +4949,7 @@ <translation id="5338503421962489998">Yerel depolama</translation> <translation id="5339031667684712858">Kaldırdığınız siteler</translation> <translation id="5340638867532133571">Sitelerin ödeme işleyici yüklemesine izin ver (önerilir)</translation> +<translation id="5340787663756381836">&Bul ve düzenle</translation> <translation id="5341793073192892252">Aşağıdaki çerezler engellendi (üçüncü taraf çerezleri istisnasız engelleniyor)</translation> <translation id="5342091991439452114">PIN en az <ph name="MINIMUM" /> basamaklı olmalıdır</translation> <translation id="5344036115151554031">Linux'u geri yükleme</translation> @@ -9340,6 +9342,7 @@ <translation id="939401694733344652">Bu hesaplar şu anda Android uygulamalarıyla kullanılmıyor. Bu Android uygulamasıyla kullanmak üzere bir hesap seçerseniz ilgili hesap diğer Android uygulamalarıyla da kullanılabilir. Android uygulamasının erişim ayarlarını <ph name="LINK_BEGIN" />Ayarlar > Hesaplar<ph name="LINK_END" />'dan değiştirebilirsiniz.</translation> <translation id="939598580284253335">Parolayı girin</translation> <translation id="939736085109172342">Yeni klasör</translation> +<translation id="940212040923880623">&Bul ve Düzenle</translation> <translation id="942532530371314860"><ph name="APP_NAME" />, bir Chrome sekmesini ve sesi paylaşıyor.</translation> <translation id="944799160843436808">Chromebook'ta Steam kurulurken bir sorun oluştu</translation> <translation id="945522503751344254">Geri bildirim gönder</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 566e56c..0e1447ab 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -4969,6 +4969,7 @@ <translation id="5338503421962489998">Локальна пам’ять</translation> <translation id="5339031667684712858">Вилучені сайти</translation> <translation id="5340638867532133571">Дозволити сайтам встановлювати обробники платежів (рекомендується)</translation> +<translation id="5340787663756381836">&Знайти й змінити</translation> <translation id="5341793073192892252">Заблоковані файли cookie (сторонні файли cookie блокуються без винятку)</translation> <translation id="5342091991439452114">Мінімальна кількість цифр у PIN-коді: <ph name="MINIMUM" /></translation> <translation id="5344036115151554031">Відновлення Linux</translation> @@ -9366,6 +9367,7 @@ <translation id="939401694733344652">Ці облікові записи зараз не використовуються в додатках для Android. Якщо ви виберете обліковий запис для цього додатка для Android, він може також використовуватися в інших. Доступ до додатка для Android можна змінити в меню <ph name="LINK_BEGIN" />Налаштування > Облікові записи<ph name="LINK_END" />.</translation> <translation id="939598580284253335">Ввести парольну фразу</translation> <translation id="939736085109172342">Нова папка</translation> +<translation id="940212040923880623">&Знайти й змінити</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> транслює вкладку Chrome і аудіо.</translation> <translation id="944799160843436808">Не вдалося налаштувати додаток Steam на Chromebook</translation> <translation id="945522503751344254">Надіслати відгук</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index d5cc4959..20bae9ad 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -4095,6 +4095,7 @@ <translation id="4545759655004063573">ناکافی اجازتوں کے سبب محفوظ نہیں کیا جا سکتا ہے۔ براہ کرم دوسرے مقام میں محفوظ کریں۔</translation> <translation id="4546308221697447294">Google Chrome کے ساتھ تیزی سے براؤز کریں</translation> <translation id="4546345569117159016">دایاں بٹن</translation> +<translation id="4546509872654834602"><ph name="SUPERVISED_USER_NAME" /> اس ایکسٹینشن کا استعمال کرنا چاہتا ہے:</translation> <translation id="4546692474302123343">Google اسسٹنٹ صوتی ان پٹ</translation> <translation id="4547659257713117923">دوسرے آلات سے کوئی ٹیبز نہیں ہیں</translation> <translation id="4547672827276975204">خودکار طور پر سیٹ کریں</translation> @@ -4952,6 +4953,7 @@ <translation id="5338503421962489998">مقامی اسٹوریج</translation> <translation id="5339031667684712858">وہ سائٹس جنہیں آپ نے ہٹا دیا</translation> <translation id="5340638867532133571">سائٹس کو ادائیگی کے ہینڈلرز انسٹال کرنے کی اجازت دیں (تجویز کردہ)</translation> +<translation id="5340787663756381836">&تلاش اور ترمیم کریں</translation> <translation id="5341793073192892252">مندرجہ ذیل کوکیز کو مسدود کر دیا گیا (فریق ثالث کوکیز کو استثناء کے بغیر مسدود کیا جا رہا ہے)</translation> <translation id="5342091991439452114">PIN کا کم از کم <ph name="MINIMUM" /> ہندسے کا ہونا ضروری ہے</translation> <translation id="5344036115151554031">Linux بحال کیا جا رہا ہے</translation> @@ -9342,6 +9344,7 @@ <translation id="939401694733344652">یہ اکاؤنٹس ابھی Android ایپس کے ساتھ استعمال نہیں ہو رہے ہیں۔ اگر آپ اس Android ایپ کے ساتھ استعمال کرنے کے لیے کوئی اکاؤنٹ منتخب کرتے ہیں تو اس اکاؤنٹ کو دیگر Android ایپس کے ساتھ بھی استعمال کیا جا سکتا ہے۔ آپ <ph name="LINK_BEGIN" />ترتیبات > اکاؤنٹس<ph name="LINK_END" /> میں Android ایپ کی رسائی کو تبدیل کر سکتے ہیں۔</translation> <translation id="939598580284253335">پاس فریز درج کریں</translation> <translation id="939736085109172342">نیا فولڈر</translation> +<translation id="940212040923880623">&تلاش اور ترمیم کریں</translation> <translation id="942532530371314860"><ph name="APP_NAME" /> ایک Chrome ٹیب اور آڈیو کا اشتراک کر رہی ہے۔</translation> <translation id="944799160843436808">Chromebook پر Steam کو سیٹ اپ کرنے میں ایک مسئلہ تھا</translation> <translation id="945522503751344254">تاثرات بھیجیں</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 96c60a3c..d32bbd42 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -2152,6 +2152,7 @@ <translation id="2804043232879091219">Muqobil brauzer ochilmadi</translation> <translation id="2804667941345577550">Bu saytdagi hisobingizdan avtomatik chiqarilasiz (shuningdek, ochiq varaqlardan ham)</translation> <translation id="2804680522274557040">Kamera faolsizlantirilgan</translation> +<translation id="2804742109948581745">Yonma-yon</translation> <translation id="2805539617243680210">Tayyor!</translation> <translation id="2805646850212350655">Microsoft (EFS) shifrlangan fayl tizimi</translation> <translation id="2805756323405976993">Ilovalar</translation> @@ -4644,6 +4645,7 @@ <translation id="5056950756634735043">Konteynerga ulanmoqda</translation> <translation id="5057110919553308744">Kengaytma bosilganda</translation> <translation id="5059241099014281248">Kirishni taqiqlash</translation> +<translation id="5059429103770496207">Displey uslubi</translation> <translation id="5059526285558225588">Nimani ulashishni tanlang</translation> <translation id="5060332552815861872">Saqlash uchun 1 ta printer topildi.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Bu jildda xatcho‘p bor. Uni o‘chirishni xohlaysizmi?}other{Bu jildda # ta xatcho‘p bor. Uni o‘chirishni xohlaysizmi?}}</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 9bf31e8..3dd2cbd 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -46,6 +46,7 @@ <translation id="1038462104119736705">Linux nên có dung lượng tối thiểu là <ph name="INSTALL_SIZE" />. Để tăng dung lượng trống, hãy xóa bớt tệp khỏi thiết bị.</translation> <translation id="1038643060055067718">Dòng:</translation> <translation id="1039337018183941703">Tệp lỗi hoặc không hợp lệ</translation> +<translation id="1040761927998636252">Dấu trang chưa có tên cho <ph name="URL" /></translation> <translation id="1041175011127912238">Trang này hiện không phản hồi</translation> <translation id="1041263367839475438">Thiết bị hiện có</translation> <translation id="1042174272890264476">Máy tính của bạn cũng đi kèm với thư viện RLZ của <ph name="SHORT_PRODUCT_NAME" /> được tích hợp sẵn. RLZ chỉ định thẻ không thể nhận dạng cá nhân, không duy nhất để đo lường các tìm kiếm và mức độ sử dụng <ph name="SHORT_PRODUCT_NAME" /> mà một chiến dịch quảng cáo cụ thể mang lại. Đôi khi các nhãn này xuất hiện trong truy vấn Google Tìm kiếm trong <ph name="PRODUCT_NAME" />.</translation> @@ -2165,6 +2166,7 @@ <translation id="2804043232879091219">Không thể mở trình duyệt thay thế</translation> <translation id="2804667941345577550">Bạn sẽ bị đăng xuất khỏi trang web này, bao gồm cả các thẻ đang mở</translation> <translation id="2804680522274557040">Đã tắt máy ảnh</translation> +<translation id="2804742109948581745">Cạnh nhau</translation> <translation id="2805539617243680210">Bạn đã hoàn tất!</translation> <translation id="2805646850212350655">Hệ thống Tệp Mã hóa của Microsoft</translation> <translation id="2805756323405976993">Ứng dụng</translation> @@ -4657,6 +4659,7 @@ <translation id="5056950756634735043">Đang kết nối với vùng chứa</translation> <translation id="5057110919553308744">Khi bạn nhấp vào tiện ích</translation> <translation id="5059241099014281248">Hạn chế khả năng đăng nhập</translation> +<translation id="5059429103770496207">Kiểu hiển thị</translation> <translation id="5059526285558225588">Chọn nội dung bạn muốn chia sẻ</translation> <translation id="5060332552815861872">Hiện có 1 máy in để bạn lưu.</translation> <translation id="5061347216700970798">{NUM_BOOKMARKS,plural, =1{Thư mục này chứa một dấu trang. Bạn có chắc chắn muốn xóa thư mục không?}other{Thư mục này chứa # dấu trang. Bạn có chắc chắn muốn xóa thư mục không?}}</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index b8247b4..d786552 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -52,7 +52,7 @@ <translation id="1860536484129686729">Chrome necesita permiso para acceder á cámara neste sitio</translation> <translation id="1873233029667955273">Google Chrome non é o teu navegador predeterminado</translation> <translation id="1874309113135274312">Google Chrome Beta (mDNS-In)</translation> -<translation id="1877026089748256423">Chromium está desactualizado</translation> +<translation id="1877026089748256423">Chrome está desactualizado</translation> <translation id="1919130412786645364">Permitir inicio de sesión en Chrome</translation> <translation id="1953553007165777902">Descargando… Tempo restante: <ph name="MINUTE" /> min</translation> <translation id="2018528049276128029">En cada perfil gárdase a información de Chrome que lle corresponde (por exemplo, os marcadores, o historial ou os contrasinais)</translation> @@ -395,7 +395,7 @@ <translation id="8669527147644353129">Axudante de Google Chrome</translation> <translation id="8679801911857917785">Tamén controla a páxina que se mostra ao iniciar Chrome.</translation> <translation id="8684875378076460854">Chrome recomenda analizar este ficheiro porque pode ser perigoso</translation> -<translation id="8686817260976772516">Cos perfís de Chromium podes separar todo o contido que teñas neste navegador. Crea perfís para os amigos e a familia ou ben crea un para o traballo e outro para o lecer.</translation> +<translation id="8686817260976772516">Cos perfís de Chrome podes separar todo o contido que teñas neste navegador. Crea perfís para os amigos e a familia ou ben crea un para o traballo e outro para o lecer.</translation> <translation id="8712767363896337380">A actualización está a piques de rematar. Para que finalice, reinicia Chrome.</translation> <translation id="873133009373065397">Google Chrome non pode determinar nin establecer o navegador predeterminado</translation> <translation id="8765470054473112089">Cando escribes algo na barra de enderezos ou na caixa de busca, Chrome envíallo ao motor de busca predeterminado para obter mellores suxestións. Esta opción está desactivada no modo de incógnito.</translation>
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index c29d2dc1..df1cb312 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1479,6 +1479,9 @@ <message name="IDS_SETTINGS_OPEN_FILE_TYPES_AUTOMATICALLY" desc="The information label for the 'Clear auto-opening settings' button"> Open certain file types automatically after downloading </message> + <message name="IDS_SETTINGS_DOWNLOADS_SHOW_WHEN_FINISHED" desc="Label for the setting which enables the automatic showing of downloads when the downloads finish."> + Show downloads when they're done + </message> <!-- On Startup Page --> <message name="IDS_SETTINGS_ON_STARTUP" desc="Name of the on startup page.">
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_DOWNLOADS_SHOW_WHEN_FINISHED.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_DOWNLOADS_SHOW_WHEN_FINISHED.png.sha1 new file mode 100644 index 0000000..910ea5a5 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_DOWNLOADS_SHOW_WHEN_FINISHED.png.sha1
@@ -0,0 +1 @@ +dfcd8cdf4fe96dea709c85eed7dc009688a2b36b \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 5782a948..8f91c97 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2957,8 +2957,6 @@ "fast_checkout/fast_checkout_capabilities_fetcher_factory.h", "fast_checkout/fast_checkout_capabilities_fetcher_impl.cc", "fast_checkout/fast_checkout_capabilities_fetcher_impl.h", - "fast_checkout/fast_checkout_client.cc", - "fast_checkout/fast_checkout_client.h", "fast_checkout/fast_checkout_client_impl.cc", "fast_checkout/fast_checkout_client_impl.h", "fast_checkout/fast_checkout_enums.h", @@ -3851,8 +3849,6 @@ "metrics/power/process_metrics_recorder_util.h", "metrics/power/process_monitor.cc", "metrics/power/process_monitor.h", - "metrics/power/usage_scenario.cc", - "metrics/power/usage_scenario.h", "metrics/tab_stats/tab_stats_data_store.cc", "metrics/tab_stats/tab_stats_data_store.h", "metrics/tab_stats/tab_stats_observer.h", @@ -3862,6 +3858,8 @@ "metrics/usage_scenario/system_event_provider.h", "metrics/usage_scenario/tab_usage_scenario_tracker.cc", "metrics/usage_scenario/tab_usage_scenario_tracker.h", + "metrics/usage_scenario/usage_scenario.cc", + "metrics/usage_scenario/usage_scenario.h", "metrics/usage_scenario/usage_scenario_data_store.cc", "metrics/usage_scenario/usage_scenario_data_store.h", "metrics/usage_scenario/usage_scenario_tracker.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index d7be5402..b2c9494b 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1054,16 +1054,6 @@ crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepAll}, }; -const FeatureEntry::FeatureParam kTimeOfDayScreenSaverNewMexico = { - "FeatureManagementTimeOfDayScreenSaverVideo", "new_mexico"}; - -const FeatureEntry::FeatureParam kTimeOfDayScreenSaverClouds = { - "FeatureManagementTimeOfDayScreenSaverVideo", "clouds"}; - -const FeatureEntry::FeatureVariation kTimeOfDayScreenSaverVideoVariations[] = { - {"New Mexico", &kTimeOfDayScreenSaverNewMexico, 1, nullptr}, - {"Clouds", &kTimeOfDayScreenSaverClouds, 1, nullptr}}; - #endif // BUILDFLAG(IS_CHROMEOS_ASH) const FeatureEntry::Choice kForceUIDirectionChoices[] = { @@ -1597,17 +1587,17 @@ constexpr FeatureEntry::FeatureVariation kOmniboxInspireMeVariants[] = { {"5 Trends", kOmniboxInspireMeWith5Trends, - std::size(kOmniboxInspireMeWith5Trends), nullptr}, + std::size(kOmniboxInspireMeWith5Trends), "t3363415"}, {"5 Related", kOmniboxInspireMeWith5Related, - std::size(kOmniboxInspireMeWith5Related), nullptr}, + std::size(kOmniboxInspireMeWith5Related), "t3363415"}, {"3 Related + 2 Trends", kOmniboxInspireMeWith5Mixed, - std::size(kOmniboxInspireMeWith5Mixed), nullptr}, + std::size(kOmniboxInspireMeWith5Mixed), "t3363415"}, {"10 Trends", kOmniboxInspireMeWith10Trends, - std::size(kOmniboxInspireMeWith10Trends), nullptr}, + std::size(kOmniboxInspireMeWith10Trends), "t3363415"}, {"10 Related", kOmniboxInspireMeWith10Related, - std::size(kOmniboxInspireMeWith10Related), nullptr}, + std::size(kOmniboxInspireMeWith10Related), "t3363415"}, {"5 Related + 5 Trends", kOmniboxInspireMeWith10Mixed, - std::size(kOmniboxInspireMeWith10Mixed), nullptr}}; + std::size(kOmniboxInspireMeWith10Mixed), "t3363415"}}; #endif // BUILDFLAG(IS_ANDROID) const FeatureEntry::FeatureParam kOmniboxSquareSuggestionIconFavicons[] = { @@ -3196,48 +3186,6 @@ }; #if !BUILDFLAG(IS_ANDROID) -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable5Seconds[] = { - {"time_before_discard", "5s"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable30Seconds[] = { - {"time_before_discard", "30s"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable2Minutes[] = { - {"time_before_discard", "2m"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable1Hour[] = { - {"time_before_discard", "1h"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable4Hour[] = { - {"time_before_discard", "4h"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable6Hour[] = { - {"time_before_discard", "6h"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeAvailable12Hour[] = { - {"time_before_discard", "12h"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeDefaultOn[] = { - {"default_state", "true"}}; -const FeatureEntry::FeatureParam kHighEfficiencyModeDefaultOnAnd30Seconds[] = { - {"default_state", "true"}, - {"time_before_discard", "30s"}}; -const FeatureEntry::FeatureVariation kHighEfficiencyModeAvailableVariations[] = - { - {"With 5 Second Discard", kHighEfficiencyModeAvailable5Seconds, - std::size(kHighEfficiencyModeAvailable5Seconds), nullptr}, - {"With 30 Second Discard", kHighEfficiencyModeAvailable30Seconds, - std::size(kHighEfficiencyModeAvailable30Seconds), nullptr}, - {"With 2 Minute Discard", kHighEfficiencyModeAvailable2Minutes, - std::size(kHighEfficiencyModeAvailable2Minutes), nullptr}, - {"With 1 Hour Discard", kHighEfficiencyModeAvailable1Hour, - std::size(kHighEfficiencyModeAvailable1Hour), nullptr}, - {"With 4 Hour Discard", kHighEfficiencyModeAvailable4Hour, - std::size(kHighEfficiencyModeAvailable4Hour), nullptr}, - {"With 6 Hour Discard", kHighEfficiencyModeAvailable6Hour, - std::size(kHighEfficiencyModeAvailable6Hour), nullptr}, - {"With 12 Hour Discard", kHighEfficiencyModeAvailable12Hour, - std::size(kHighEfficiencyModeAvailable12Hour), nullptr}, - {"With Default On", kHighEfficiencyModeDefaultOn, - std::size(kHighEfficiencyModeDefaultOn), nullptr}, - {"With Default On and 30 Second Discard", - kHighEfficiencyModeDefaultOnAnd30Seconds, - std::size(kHighEfficiencyModeDefaultOnAnd30Seconds), nullptr}, -}; - const FeatureEntry::FeatureParam kHeuristicMemorySaverAggressive[] = { {"threshold_percent", "30"}, {"minimum_minutes_in_background", "30"}}; @@ -3370,6 +3318,8 @@ {privacy_sandbox::kPrivacySandboxSettings4NoticeRequiredName, "true"}}; const FeatureEntry::FeatureParam kPrivacySandboxSettings4ConsentRequired[] = { {privacy_sandbox::kPrivacySandboxSettings4ConsentRequiredName, "true"}}; +const FeatureEntry::FeatureParam kPrivacySandboxSettings4RestrictedNotice[] = { + {privacy_sandbox::kPrivacySandboxSettings4RestrictedNoticeName, "true"}}; const FeatureEntry::FeatureParam kPrivacySandboxSettings4ForceShowConsentForTesting[] = { {privacy_sandbox:: @@ -3392,8 +3342,12 @@ kPrivacySandboxSettings4ForceShowRestrictedNoticeForTesting[] = { {privacy_sandbox:: kPrivacySandboxSettings4ForceShowNoticeRestrictedForTestingName, - "true"}, - {privacy_sandbox::kPrivacySandboxSettings4NoticeRequiredName, "true"}}; + "true"}}; +const FeatureEntry::FeatureParam + kPrivacySandboxSettings4ForceRestrictedUserForTesting[] = { + {privacy_sandbox:: + kPrivacySandboxSettings4ForceRestrictedUserForTestingName, + "true"}}; const FeatureEntry::FeatureVariation kPrivacySandboxSettings4Variations[] = { {"Sample Data", kPrivacySandboxSettings4ShowSampleDataForTesting, @@ -3402,6 +3356,8 @@ std::size(kPrivacySandboxSettings4NoticeRequired), nullptr}, {"Consent Required", kPrivacySandboxSettings4ConsentRequired, std::size(kPrivacySandboxSettings4ConsentRequired), nullptr}, + {"Restricted notice", kPrivacySandboxSettings4RestrictedNotice, + std::size(kPrivacySandboxSettings4ConsentRequired), nullptr}, {"Force show consent", kPrivacySandboxSettings4ForceShowConsentForTesting, std::size(kPrivacySandboxSettings4ForceShowConsentForTesting), nullptr}, {"Force show ROW notice", @@ -3414,6 +3370,9 @@ kPrivacySandboxSettings4ForceShowRestrictedNoticeForTesting, std::size(kPrivacySandboxSettings4ForceShowRestrictedNoticeForTesting), nullptr}, + {"Force restricted user", + kPrivacySandboxSettings4ForceRestrictedUserForTesting, + std::size(kPrivacySandboxSettings4ForceRestrictedUserForTesting), nullptr}, }; #if BUILDFLAG(ENABLE_EXTENSIONS) @@ -4057,9 +4016,7 @@ {kTimeOfDayScreenSaverInternalName, flag_descriptions::kTimeOfDayScreenSaverName, flag_descriptions::kTimeOfDayScreenSaverDescription, kOsCrOS, - FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kTimeOfDayScreenSaver, - kTimeOfDayScreenSaverVideoVariations, - "FeatureManagementTimeOfDayScreenSaver")}, + FEATURE_VALUE_TYPE(ash::features::kTimeOfDayScreenSaver)}, {kTimeOfDayWallpaperInternalName, flag_descriptions::kTimeOfDayWallpaperName, flag_descriptions::kTimeOfDayWallpaperDescription, kOsCrOS, @@ -4803,6 +4760,9 @@ flag_descriptions::kBackGestureRefactorActivityAndroidDescription, kOsAndroid, FEATURE_VALUE_TYPE(chrome::android::kBackGestureRefactorActivityAndroid)}, + {"draw-edge-to-edge", flag_descriptions::kDrawEdgeToEdgeName, + flag_descriptions::kDrawEdgeToEdgeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kDrawEdgeToEdge)}, {"infobar-scroll-optimization", flag_descriptions::kInfobarScrollOptimizationName, flag_descriptions::kInfobarScrollOptimizationDescription, kOsAndroid, @@ -4963,10 +4923,10 @@ "ForceDarkVariations")}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_ANDROID) - {"enable-accessibility-form-controls-mode", - flag_descriptions::kAccessibilityFormControlsModeName, - flag_descriptions::kAccessibilityFormControlsModeDescription, kOsAndroid, - FEATURE_VALUE_TYPE(features::kAccessibilityFormControlsMode)}, + {"enable-accessibility-ax-modes", + flag_descriptions::kAccessibilityAXModesName, + flag_descriptions::kAccessibilityAXModesDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAccessibilityAXModes)}, {"enable-accessibility-page-zoom", flag_descriptions::kAccessibilityPageZoomName, flag_descriptions::kAccessibilityPageZoomDescription, kOsAndroid, @@ -9487,13 +9447,6 @@ flag_descriptions::kBatterySaverModeAvailableDescription, kOsDesktop, FEATURE_VALUE_TYPE( performance_manager::features::kBatterySaverModeAvailable)}, - {"high-efficiency-mode-available", - flag_descriptions::kHighEfficiencyModeAvailableName, - flag_descriptions::kHighEfficiencyModeAvailableDescription, kOsDesktop, - FEATURE_WITH_PARAMS_VALUE_TYPE( - performance_manager::features::kHighEfficiencyModeAvailable, - kHighEfficiencyModeAvailableVariations, - "HighEfficiencyModeAvailable")}, {"heuristic-memory-saver-mode", flag_descriptions::kHeuristicMemorySaverName, flag_descriptions::kHeuristicMemorySaverDescription, kOsDesktop,
diff --git a/chrome/browser/about_flags_unittest.cc b/chrome/browser/about_flags_unittest.cc index 7655e280..3b05132a 100644 --- a/chrome/browser/about_flags_unittest.cc +++ b/chrome/browser/about_flags_unittest.cc
@@ -167,7 +167,8 @@ } // Ensures that all variation IDs specified are well-formed and unique. -TEST(AboutFlagsTest, VariationIdsAreValid) { +// Disabled - please see https://crbug.com/1432436. +TEST(AboutFlagsTest, DISABLED_VariationIdsAreValid) { std::set<int> variation_ids; for (const std::string& variation_id : GetAllVariationIds()) {
diff --git a/chrome/browser/android/resource_id.h b/chrome/browser/android/resource_id.h index 0f0e4c66..446b77c7 100644 --- a/chrome/browser/android/resource_id.h +++ b/chrome/browser/android/resource_id.h
@@ -122,6 +122,8 @@ // Icon displayed in the save address message on Android. DECLARE_RESOURCE_ID(IDR_ANDROID_AUTOFILL_ADDRESS, R.drawable.gm_filled_location_on_24) +DECLARE_RESOURCE_ID(IDR_ANDROID_AUTOFILL_UPLOAD_ADDRESS, + R.drawable.ic_cloud_upload_24dp) // We use PNG files for the following images. LINK_RESOURCE_ID(IDR_CREDIT_CARD_CVC_HINT_BACK, R.drawable.cvc_icon)
diff --git a/chrome/browser/app_mode/test/accelerator_helpers.cc b/chrome/browser/app_mode/test/accelerator_helpers.cc new file mode 100644 index 0000000..879f567 --- /dev/null +++ b/chrome/browser/app_mode/test/accelerator_helpers.cc
@@ -0,0 +1,27 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/app_mode/test/accelerator_helpers.h" + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "ui/base/accelerators/accelerator.h" +#include "ui/events/event_constants.h" +#include "ui/events/keycodes/keyboard_codes_posix.h" + +namespace chrome { + +bool PressCloseTabAccelerator(Browser* browser) { + // Ctrl + W. + return BrowserView::GetBrowserViewForBrowser(browser)->AcceleratorPressed( + ui::Accelerator(ui::VKEY_W, ui::EF_CONTROL_DOWN)); +} + +bool PressCloseWindowAccelerator(Browser* browser) { + // Ctrl + Shift + W. + return BrowserView::GetBrowserViewForBrowser(browser)->AcceleratorPressed( + ui::Accelerator(ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN)); +} + +} // namespace chrome
diff --git a/chrome/browser/app_mode/test/accelerator_helpers.h b/chrome/browser/app_mode/test/accelerator_helpers.h new file mode 100644 index 0000000..0c54a1c --- /dev/null +++ b/chrome/browser/app_mode/test/accelerator_helpers.h
@@ -0,0 +1,20 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_APP_MODE_TEST_ACCELERATOR_HELPERS_H_ +#define CHROME_BROWSER_APP_MODE_TEST_ACCELERATOR_HELPERS_H_ + +#include "chrome/browser/ui/browser.h" + +namespace chrome { + +// Presses Ctrl + W using |browser|'s view as the accelerator target. +[[nodiscard]] bool PressCloseTabAccelerator(Browser* browser); + +// Presses Ctrl + Shift + W using |browser|'s view as the accelerator target. +[[nodiscard]] bool PressCloseWindowAccelerator(Browser* browser); + +} // namespace chrome + +#endif // CHROME_BROWSER_APP_MODE_TEST_ACCELERATOR_HELPERS_H_
diff --git a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc index 7775ed7..df9c2db0 100644 --- a/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc +++ b/chrome/browser/apps/app_service/metrics/app_platform_metrics_utils.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/ash/guest_os/guest_os_shelf_utils.h" +#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" @@ -369,6 +370,10 @@ } bool ShouldRecordUkm(Profile* profile) { + // Bypass AppKM App Sync check for Demo Mode devices to collect app metrics. + if (ash::DemoSession::IsDeviceInDemoMode()) { + return true; + } switch (syncer::GetUploadToGoogleState( SyncServiceFactory::GetForProfile(profile), syncer::ModelType::APPS)) { case syncer::UploadState::NOT_ACTIVE:
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc index 745644ed..38aee7f 100644 --- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -647,7 +647,8 @@ } // flaky http://crbug.com/412086 -#if defined(SUPPORTS_SYNC_MOUSE_UTILS) && !BUILDFLAG(IS_CHROMEOS) +#if defined(SUPPORTS_SYNC_MOUSE_UTILS) && !BUILDFLAG(IS_CHROMEOS) && \ + !BUILDFLAG(IS_MAC) && defined(NDEBUG) #define MAYBE_PointerLockFocus PointerLockFocus #else #define MAYBE_PointerLockFocus DISABLED_PointerLockFocus @@ -980,17 +981,8 @@ ASSERT_TRUE(done_listener.WaitUntilSatisfied()); } -// Trips over a DCHECK in content::MouseLockDispatcher::OnLockMouseACK; see -// https://crbug.com/761783. -#if BUILDFLAG(IS_WIN) -#define MAYBE_PointerLock_PointerLockLostWithFocus \ - PointerLock_PointerLockLostWithFocus -#else -#define MAYBE_PointerLock_PointerLockLostWithFocus \ - DISABLED_PointerLock_PointerLockLostWithFocus -#endif IN_PROC_BROWSER_TEST_F(WebViewPointerLockInteractiveTest, - MAYBE_PointerLock_PointerLockLostWithFocus) { + PointerLock_PointerLockLostWithFocus) { TestHelper("testPointerLockLostWithFocus", "web_view/pointerlock", NO_TEST_SERVER); }
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index 8b2ab2b..d3044de 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1716,8 +1716,6 @@ "login/screens/active_directory_password_change_screen.h", "login/screens/app_downloading_screen.cc", "login/screens/app_downloading_screen.h", - "login/screens/arc_terms_of_service_screen.cc", - "login/screens/arc_terms_of_service_screen.h", "login/screens/arc_vm_data_migration_screen.cc", "login/screens/arc_vm_data_migration_screen.h", "login/screens/assistant_optin_flow_screen.cc", @@ -2134,6 +2132,8 @@ "notifications/kiosk_external_update_notification.h", "notifications/low_disk_notification.cc", "notifications/low_disk_notification.h", + "notifications/multi_capture_login_notification.cc", + "notifications/multi_capture_login_notification.h", "notifications/multi_capture_notification.cc", "notifications/multi_capture_notification.h", "notifications/request_system_proxy_credentials_view.cc", @@ -5381,6 +5381,7 @@ "notifications/low_disk_notification_unittest.cc", "notifications/mock_adb_sideloading_policy_change_notification.cc", "notifications/mock_adb_sideloading_policy_change_notification.h", + "notifications/multi_capture_login_notification_unittest.cc", "notifications/multi_capture_notification_unittest.cc", "notifications/request_system_proxy_credentials_view_unittest.cc", "notifications/update_required_notification_unittest.cc",
diff --git a/chrome/browser/ash/app_list/search/ranking/best_match_ranker.cc b/chrome/browser/ash/app_list/search/ranking/best_match_ranker.cc index 53e66c3a..43323ad 100644 --- a/chrome/browser/ash/app_list/search/ranking/best_match_ranker.cc +++ b/chrome/browser/ash/app_list/search/ranking/best_match_ranker.cc
@@ -23,6 +23,7 @@ case ProviderType::kZeroStateApp: case ProviderType::kZeroStateFile: case ProviderType::kZeroStateDrive: + case ProviderType::kDesksAdminTemplate: // Low-intent providers: case ProviderType::kPlayStoreReinstallApp: case ProviderType::kPlayStoreApp: @@ -51,7 +52,6 @@ case ProviderType::kOpenTab: case ProviderType::kOsSettings: case ProviderType::kSystemInfo: - case ProviderType::kDesksAdminTemplate: return false; } }
diff --git a/chrome/browser/ash/app_list/search/ranking/continue_ranker.cc b/chrome/browser/ash/app_list/search/ranking/continue_ranker.cc index bbb9f8a..0fe8b5c 100644 --- a/chrome/browser/ash/app_list/search/ranking/continue_ranker.cc +++ b/chrome/browser/ash/app_list/search/ranking/continue_ranker.cc
@@ -17,17 +17,29 @@ const auto it = results.find(provider); DCHECK(it != results.end()); - // Always rank zero-state Drive files higher than zero-state local files by - // giving them a higher continue_rank. - if (provider == ProviderType::kZeroStateFile) { - for (auto& result : it->second) - result->scoring().set_continue_rank(1); - } else if (provider == ProviderType::kZeroStateDrive) { - for (auto& result : it->second) - result->scoring().set_continue_rank(2); - } else if (provider == ProviderType::kZeroStateHelpApp) { - for (auto& result : it->second) - result->scoring().set_continue_rank(3); + // Note: Always rank desks admin templates higher than any other type of + // providers in the continue section view. Always rank zero-state Drive files + // higher than zero-state local files by giving them a higher continue_rank. + int continue_rank = -1; + switch (provider) { + case ProviderType::kZeroStateFile: + continue_rank = 1; + break; + case ProviderType::kZeroStateDrive: + continue_rank = 2; + break; + case ProviderType::kZeroStateHelpApp: + continue_rank = 3; + break; + case ProviderType::kDesksAdminTemplate: + continue_rank = 4; + break; + default: + break; + } + + for (auto& result : it->second) { + result->scoring().set_continue_rank(continue_rank); } }
diff --git a/chrome/browser/ash/app_list/search/search_controller_unittest.cc b/chrome/browser/ash/app_list/search/search_controller_unittest.cc index 235c486af..1a1db52 100644 --- a/chrome/browser/ash/app_list/search/search_controller_unittest.cc +++ b/chrome/browser/ash/app_list/search/search_controller_unittest.cc
@@ -718,6 +718,43 @@ ExpectIdOrder({"drive_a", "drive_b", "local_a", "local_b"}); } +// Tests that the desks admin templates always higher than any other type of +// providers. +TEST_F(SearchControllerTest, ContinueRanksAdminTemplateAboveHelpAppAndDrive) { + // Use the full ranking stack. + search_controller_->set_ranker_manager_for_test( + std::make_unique<RankerManager>(&profile_, search_controller_.get())); + + auto desks_admin_template = std::make_unique<TestSearchProvider>( + Result::kDesksAdminTemplate, base::Seconds(0)); + auto zero_state_help_app = std::make_unique<TestSearchProvider>( + Result::kZeroStateHelpApp, base::Seconds(0)); + auto drive_provider = std::make_unique<TestSearchProvider>( + Result::kZeroStateDrive, base::Seconds(0)); + + desks_admin_template->SetNextResults(MakeResults( + {"template_a", "template_b"}, + {DisplayType::kContinue, DisplayType::kContinue}, + {Category::kUnknown, Category::kUnknown}, {-1, -1}, {0.2, 0.1})); + zero_state_help_app->SetNextResults( + MakeResults({"explore_a", "explore_b"}, + {DisplayType::kContinue, DisplayType::kContinue}, + {Category::kHelp, Category::kHelp}, {-1, -1}, {0.5, 0.4})); + drive_provider->SetNextResults(MakeResults( + {"drive_a", "drive_b"}, {DisplayType::kContinue, DisplayType::kContinue}, + {Category::kFiles, Category::kFiles}, {-1, -1}, {0.5, 0.4})); + + search_controller_->AddProvider(std::move(drive_provider)); + search_controller_->AddProvider(std::move(zero_state_help_app)); + search_controller_->AddProvider(std::move(desks_admin_template)); + + search_controller_->StartZeroState(base::DoNothing(), base::Seconds(1)); + + Wait(); + ExpectIdOrder({"template_a", "template_b", "explore_a", "explore_b", + "drive_a", "drive_b"}); +} + TEST_F(SearchControllerTest, FindSearchResultByIdAndOpenIt) { auto results_1 = MakeListResults( {"a", "b", "c", "d"},
diff --git a/chrome/browser/ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc index 775d31b..5d3ea95 100644 --- a/chrome/browser/ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc +++ b/chrome/browser/ash/app_mode/web_app/web_kiosk_app_launcher_unittest.cc
@@ -315,7 +315,8 @@ fake_user_manager_(new FakeChromeUserManager()), scoped_user_manager_(base::WrapUnique(fake_user_manager_)), wm_helper_(std::make_unique<exo::WMHelper>()) { - scoped_feature_list_.InitAndEnableFeature(features::kWebKioskEnableLacros); + scoped_feature_list_.InitAndEnableFeature( + ::features::kWebKioskEnableLacros); } void LoginWebKioskUser() {
diff --git a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc index 355c135..4775a6cc 100644 --- a/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc +++ b/chrome/browser/ash/arc/session/arc_session_manager_unittest.cc
@@ -55,7 +55,6 @@ #include "chrome/browser/prefs/pref_service_syncable_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/ash/components/dbus/arc/arcvm_data_migrator_client.h"
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index 7a097ec..f7d717a 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -127,6 +127,7 @@ #include "chrome/browser/ash/notifications/debugd_notification_handler.h" #include "chrome/browser/ash/notifications/gnubby_notification.h" #include "chrome/browser/ash/notifications/low_disk_notification.h" +#include "chrome/browser/ash/notifications/multi_capture_login_notification.h" #include "chrome/browser/ash/notifications/multi_capture_notification.h" #include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h" #include "chrome/browser/ash/pcie_peripheral/ash_usb_detector.h" @@ -1021,6 +1022,9 @@ // Needs to be initialized after crosapi_manager_. metrics::structured::ChromeStructuredMetricsRecorder::Get()->Initialize(); + multi_capture_login_notification_ = + std::make_unique<MultiCaptureLoginNotification>(); + if (immediate_login) { const user_manager::CryptohomeId cryptohome_id( base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( @@ -1596,6 +1600,7 @@ lacros_data_backward_migration_mode_policy_observer_.reset(); multi_capture_notification_.reset(); + multi_capture_login_notification_.reset(); // vc_app_service_client_ has to be destructed before PostMainMessageLoopRun. vc_app_service_client_.reset();
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.h b/chrome/browser/ash/chrome_browser_main_parts_ash.h index 2ba97bb..29916e3 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.h +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.h
@@ -77,6 +77,7 @@ class LoginScreenExtensionsStorageCleaner; class LowDiskNotification; class AuthMetricsRecorder; +class MultiCaptureLoginNotification; class MultiCaptureNotification; class NetworkChangeManagerClient; class NetworkPrefStateObserver; @@ -218,6 +219,8 @@ std::unique_ptr<WebKioskAppManager> web_kiosk_app_manager_; std::unique_ptr<KioskAppManager> kiosk_app_manager_; std::unique_ptr<MultiCaptureNotification> multi_capture_notification_; + std::unique_ptr<MultiCaptureLoginNotification> + multi_capture_login_notification_; std::unique_ptr<ShortcutMappingPrefService> shortcut_mapping_pref_service_; std::unique_ptr<ChromeKeyboardControllerClient>
diff --git a/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.cc b/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.cc new file mode 100644 index 0000000..80306ca9 --- /dev/null +++ b/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.cc
@@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h" + +#include "ash/accelerators/accelerator_controller_impl.h" +#include "ash/shell.h" +#include "ui/base/accelerators/accelerator.h" +#include "ui/events/event_constants.h" +#include "ui/events/keycodes/keyboard_codes_posix.h" + +namespace ash { + +bool PressSignOutAccelerator() { + // Ctrl + Shift + Q twice. + ash::AcceleratorControllerImpl* controller = + ash::Shell::Get()->accelerator_controller(); + ui::Accelerator signOutAccelerator = + ui::Accelerator(ui::VKEY_Q, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN); + return controller->AcceleratorPressed(signOutAccelerator) && + controller->AcceleratorPressed(signOutAccelerator); +} + +} // namespace ash
diff --git a/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h b/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h new file mode 100644 index 0000000..ab685dd --- /dev/null +++ b/chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h
@@ -0,0 +1,15 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_ASH_ACCELERATOR_HELPERS_H_ +#define CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_ASH_ACCELERATOR_HELPERS_H_ + +namespace ash { + +// Presses Ctrl + Shift + Q twice using the system shell as accelerator target. +[[nodiscard]] bool PressSignOutAccelerator(); + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_LOGIN_APP_MODE_TEST_ASH_ACCELERATOR_HELPERS_H_
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_browsertest.cc new file mode 100644 index 0000000..59db22f7 --- /dev/null +++ b/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_browsertest.cc
@@ -0,0 +1,65 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/accelerators/accelerator_controller_impl.h" +#include "ash/shell.h" +#include "base/run_loop.h" +#include "chrome/browser/app_mode/test/accelerator_helpers.h" +#include "chrome/browser/ash/app_mode/app_session_ash.h" +#include "chrome/browser/ash/app_mode/kiosk_app_types.h" +#include "chrome/browser/ash/app_mode/web_app/web_kiosk_app_manager.h" +#include "chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h" +#include "chrome/browser/ash/login/app_mode/test/test_browser_closed_waiter.h" +#include "chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "content/public/test/browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +// Verify accelerators do not work in Kiosk sessions in Ash. +class WebKioskAcceleratorTest : public WebKioskBaseTest {}; + +IN_PROC_BROWSER_TEST_F(WebKioskAcceleratorTest, AcceleratorsDontCloseSession) { + InitializeRegularOnlineKiosk(); + SelectFirstBrowser(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_FALSE(chrome::PressCloseTabAccelerator(browser())); + ASSERT_FALSE(chrome::PressCloseWindowAccelerator(browser())); + ASSERT_FALSE(ash::PressSignOutAccelerator()); + base::RunLoop loop; + loop.RunUntilIdle(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_FALSE(WebKioskAppManager::Get()->app_session()->is_shutting_down()); +} + +// Verify accelerators work in regular non-kiosk sessions in Ash. +class NonKioskAcceleratorTest : public InProcessBrowserTest {}; + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorTest, CloseTabAccelerator) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_TRUE(chrome::PressCloseTabAccelerator(browser())); + TestBrowserClosedWaiter settings_browser_closed_waiter{browser()}; + settings_browser_closed_waiter.WaitUntilClosed(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 0u); +} + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorTest, CloseWindowAccelerator) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_TRUE(chrome::PressCloseWindowAccelerator(browser())); + TestBrowserClosedWaiter settings_browser_closed_waiter{browser()}; + settings_browser_closed_waiter.WaitUntilClosed(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 0u); +} + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorTest, SignOutAccelerator) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_TRUE(ash::PressSignOutAccelerator()); + TestBrowserClosedWaiter settings_browser_closed_waiter{browser()}; + settings_browser_closed_waiter.WaitUntilClosed(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 0u); +} + +} // namespace ash
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_lacros_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_lacros_browsertest.cc new file mode 100644 index 0000000..fe08e8c --- /dev/null +++ b/chrome/browser/ash/login/app_mode/test/kiosk_accelerator_lacros_browsertest.cc
@@ -0,0 +1,156 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/constants/ash_switches.h" +#include "base/run_loop.h" +#include "base/test/test_future.h" +#include "chrome/browser/ash/crosapi/browser_service_host_ash.h" +#include "chrome/browser/ash/crosapi/browser_util.h" +#include "chrome/browser/ash/crosapi/crosapi_ash.h" +#include "chrome/browser/ash/crosapi/crosapi_manager.h" +#include "chrome/browser/ash/login/app_mode/test/ash_accelerator_helpers.h" +#include "chrome/browser/ash/login/app_mode/test/web_kiosk_base_test.h" +#include "chrome/test/base/chromeos/ash_browser_test_starter.h" +#include "components/policy/policy_constants.h" +#include "content/public/test/browser_test.h" + +namespace ash { + +namespace { + +// Helper based on AshBrowserTestStarter, sets up Lacros in a kiosk session. +class KioskAshBrowserTestStarter { + public: + bool HasLacrosArgument() { + return base::CommandLine::ForCurrentProcess()->HasSwitch( + ash::switches::kLacrosChromePath); + } + // Must be called in SetUpInProcessBrowserTestFixture. + void PrepareEnvironmentForKioskLacros() { + DCHECK(HasLacrosArgument()); + std::unique_ptr<base::Environment> env(base::Environment::Create()); + ASSERT_TRUE(scoped_temp_dir_xdg_.CreateUniqueTempDir()); + env->SetVar("XDG_RUNTIME_DIR", + scoped_temp_dir_xdg_.GetPath().AsUTF8Unsafe()); + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + ash::switches::kAshEnableWaylandServer); + } + + // Must be called in SetUpOnMainThread. + void SetLacrosAvailabilityPolicy() { + DCHECK(HasLacrosArgument()); + policy::PolicyMap policy; + policy.Set(policy::key::kLacrosAvailability, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, + base::Value(GetLacrosAvailabilityPolicyName( + ash::standalone_browser::LacrosAvailability::kLacrosOnly)), + /*external_data_fetcher=*/nullptr); + crosapi::browser_util::CacheLacrosAvailability(policy); + } + + private: + base::ScopedTempDir scoped_temp_dir_xdg_; +}; + +// Observes BrowserServiceHostAsh and blocks until a BrowserService disconnects. +class BrowserServiceDisconnectedWaiter + : public crosapi::BrowserServiceHostObserver { + public: + BrowserServiceDisconnectedWaiter() { + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->browser_service_host_ash() + ->AddObserver(this); + } + + ~BrowserServiceDisconnectedWaiter() override { + crosapi::CrosapiManager::Get() + ->crosapi_ash() + ->browser_service_host_ash() + ->RemoveObserver(this); + } + + [[nodiscard]] bool Wait() { return future_.Wait(); } + + private: + void OnBrowserServiceDisconnected(crosapi::CrosapiId id, + mojo::RemoteSetElementId mojo_id) override { + future_.SetValue(); + } + + base::test::TestFuture<void> future_; +}; + +[[nodiscard]] bool WaitUntilBrowserServiceDisconnected() { + BrowserServiceDisconnectedWaiter waiter; + return waiter.Wait(); +} + +} // namespace + +// Tests system accelerators (ash-side) do not work with Lacros in kiosk. +class WebKioskAcceleratorLacrosTest : public WebKioskBaseTest { + void SetUpInProcessBrowserTestFixture() override { + if (kiosk_ash_starter_.HasLacrosArgument()) { + kiosk_ash_starter_.PrepareEnvironmentForKioskLacros(); + } + WebKioskBaseTest::SetUpInProcessBrowserTestFixture(); + } + + void SetUpOnMainThread() override { + WebKioskBaseTest::SetUpOnMainThread(); + if (kiosk_ash_starter_.HasLacrosArgument()) { + kiosk_ash_starter_.SetLacrosAvailabilityPolicy(); + } + } + + protected: + KioskAshBrowserTestStarter kiosk_ash_starter_; +}; + +IN_PROC_BROWSER_TEST_F(WebKioskAcceleratorLacrosTest, SignOutDoesNotWork) { + if (!kiosk_ash_starter_.HasLacrosArgument()) { + return; + } + + InitializeRegularOnlineKiosk(); + ASSERT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); + ASSERT_FALSE(ash::PressSignOutAccelerator()); + base::RunLoop loop; + loop.RunUntilIdle(); + EXPECT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); +} + +// Tests system accelerators (ash-side) work with Lacros when not in kiosk. +class NonKioskAcceleratorLacrosTest : public InProcessBrowserTest { + void SetUpInProcessBrowserTestFixture() override { + if (ash_starter_.HasLacrosArgument()) { + ASSERT_TRUE(ash_starter_.PrepareEnvironmentForLacros()); + } + } + + void SetUpOnMainThread() override { + if (ash_starter_.HasLacrosArgument()) { + ash_starter_.StartLacros(this); + } + } + + protected: + ::test::AshBrowserTestStarter ash_starter_; +}; + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorLacrosTest, SignOutWorks) { + if (!ash_starter_.HasLacrosArgument()) { + return; + } + + // crosapi::BrowserManager::Get()->NewTab(); + ASSERT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); + ASSERT_TRUE(ash::PressSignOutAccelerator()); + ASSERT_TRUE(WaitUntilBrowserServiceDisconnected()); + EXPECT_FALSE(crosapi::BrowserManager::Get()->IsRunning()); +} + +} // namespace ash
diff --git a/chrome/browser/ash/login/debug_overlay_browsertest.cc b/chrome/browser/ash/login/debug_overlay_browsertest.cc index f8fe1f02..4135237 100644 --- a/chrome/browser/ash/login/debug_overlay_browsertest.cc +++ b/chrome/browser/ash/login/debug_overlay_browsertest.cc
@@ -21,8 +21,8 @@ constexpr char kDebugOverlay[] = "debuggerOverlay"; constexpr char kScreensPanel[] = "DebuggerPanelScreens"; -constexpr int kOobeScreensCount = 47; -constexpr int kLoginScreensCount = 45; +constexpr int kOobeScreensCount = 46; +constexpr int kLoginScreensCount = 44; constexpr int kOsInstallScreensCount = 2; std::string ElementsInPanel(const std::string& panel) {
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc index 87bf3cb..b11af77 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc
@@ -161,10 +161,6 @@ return false; } -bool EasyUnlockService::IsChromeOSLoginEnabled() const { - return false; -} - SmartLockState EasyUnlockService::GetInitialSmartLockState() const { if (IsAllowed() && IsEnabled() && proximity_auth_system_ != nullptr) return SmartLockState::kConnectingToPhone;
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h index 74c3c37..45c8170 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h
@@ -81,11 +81,6 @@ // override for testing. virtual bool IsEnabled() const; - // Returns true if ChromeOS login is enabled by the user. - // TODO(b/227674947): Delete this method and deprecate related pref now that - // sign in with Smart Lock is deprecated. - virtual bool IsChromeOSLoginEnabled() const; - // To be called when EasyUnlockService is "warming up", for example, on screen // lock, after suspend, when the login screen is starting up, etc. During a // period like this, not all sub-systems are fully initialized, particularly
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc index e31ec35d..8a2d505 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
@@ -242,10 +242,6 @@ multidevice_setup::mojom::FeatureState::kEnabledByUser; } -bool EasyUnlockServiceRegular::IsChromeOSLoginEnabled() const { - return pref_manager_ && pref_manager_->IsChromeOSLoginEnabled(); -} - void EasyUnlockServiceRegular::OnSuspendDoneInternal() { lock_screen_last_shown_timestamp_ = base::TimeTicks::Now(); }
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h index 0dec7d4..13b4ee36 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h
@@ -77,7 +77,6 @@ void ShutdownInternal() override; bool IsAllowedInternal() const override; bool IsEnabled() const override; - bool IsChromeOSLoginEnabled() const override; void OnSuspendDoneInternal() override;
diff --git a/chrome/browser/ash/login/screens/arc_terms_of_service_screen.cc b/chrome/browser/ash/login/screens/arc_terms_of_service_screen.cc deleted file mode 100644 index 0978eac..0000000 --- a/chrome/browser/ash/login/screens/arc_terms_of_service_screen.cc +++ /dev/null
@@ -1,233 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h" - -#include "ash/constants/ash_features.h" -#include "base/feature_list.h" -#include "base/memory/weak_ptr.h" -#include "base/metrics/histogram_functions.h" -#include "chrome/browser/ash/arc/arc_util.h" -#include "chrome/browser/ash/login/wizard_controller.h" -#include "chrome/browser/metrics/metrics_reporting_state.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "chrome/browser/ui/settings_window_manager_chromeos.h" -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" -#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h" -#include "chrome/common/pref_names.h" -#include "chrome/common/webui_url_constants.h" -#include "components/prefs/pref_service.h" - -namespace ash { -namespace { - -constexpr char kUserActionAcceptButtonClicked[] = "accept"; -constexpr char kUserActionNextButtonClicked[] = "next"; -constexpr char kUserActionRetryButtonClicked[] = "retry"; -constexpr char kUserActionBackButtonClicked[] = "go-back"; - -constexpr char kUserActionMetricsLearnMoreClicked[] = "metrics-learn-more"; -constexpr char kUserActionBackupRestoreLearnMoreClicked[] = - "backup-restore-learn-more"; -constexpr char kUserActionLocationServiceLearnMoreClicked[] = - "location-service-learn-more"; -constexpr char kUserActionPlayAutoInstallLearnMoreClicked[] = - "play-auto-install-learn-more"; -constexpr char kUserActionPolicyLinkClicked[] = "policy-link"; - -struct ArcTosUserAction { - const char* name_; - ArcTermsOfServiceScreen::UserAction uma_name_; -}; - -const ArcTosUserAction actions[] = { - {kUserActionAcceptButtonClicked, - ArcTermsOfServiceScreen::UserAction::kAcceptButtonClicked}, - {kUserActionNextButtonClicked, - ArcTermsOfServiceScreen::UserAction::kNextButtonClicked}, - {kUserActionRetryButtonClicked, - ArcTermsOfServiceScreen::UserAction::kRetryButtonClicked}, - {kUserActionBackButtonClicked, - ArcTermsOfServiceScreen::UserAction::kBackButtonClicked}, - - {kUserActionMetricsLearnMoreClicked, - ArcTermsOfServiceScreen::UserAction::kMetricsLearnMoreClicked}, - {kUserActionBackupRestoreLearnMoreClicked, - ArcTermsOfServiceScreen::UserAction::kBackupRestoreLearnMoreClicked}, - - {kUserActionLocationServiceLearnMoreClicked, - ArcTermsOfServiceScreen::UserAction::kLocationServiceLearnMoreClicked}, - {kUserActionPlayAutoInstallLearnMoreClicked, - ArcTermsOfServiceScreen::UserAction::kPlayAutoInstallLearnMoreClicked}, - {kUserActionPolicyLinkClicked, - ArcTermsOfServiceScreen::UserAction::kPolicyLinkClicked} - -}; - -void RecordArcTosScreenAction(ArcTermsOfServiceScreen::UserAction value) { - base::UmaHistogramEnumeration("OOBE.ArcTermsOfServiceScreen.UserActions", - value); -} - -bool IsArcTosUserAction(const std::string& action_id) { - for (const auto& el : actions) { - if (action_id == el.name_) - return true; - } - return false; -} - -void RecordUserAction(const std::string& action_id) { - for (const auto& el : actions) { - if (action_id == el.name_) { - RecordArcTosScreenAction(el.uma_name_); - return; - } - } - NOTREACHED() << "Unexpected action id: " << action_id; -} - -} // namespace - -// static -std::string ArcTermsOfServiceScreen::GetResultString(Result result) { - switch (result) { - case Result::ACCEPTED: - case Result::ACCEPTED_DEMO_ONLINE: - return "Accepted"; - case Result::BACK: - return "Back"; - case Result::NOT_APPLICABLE: - case Result::NOT_APPLICABLE_DEMO_ONLINE: - case Result::NOT_APPLICABLE_CONSOLIDATED_CONSENT_ARC_ENABLED: - return BaseScreen::kNotApplicable; - } -} - -// static -void ArcTermsOfServiceScreen::MaybeLaunchArcSettings(Profile* profile) { - if (profile->GetPrefs()->GetBoolean(prefs::kShowArcSettingsOnSessionStart)) { - profile->GetPrefs()->ClearPref(prefs::kShowArcSettingsOnSessionStart); - // TODO(jhorwich) Handle the case where the user chooses to review both ARC - // settings and sync settings - currently the Settings window will only - // show one settings page. See crbug.com/901184#c4 for details. - chrome::SettingsWindowManager::GetInstance()->ShowOSSettings( - profile, chromeos::settings::mojom::kGooglePlayStoreSubpagePath); - } -} - -ArcTermsOfServiceScreen::ArcTermsOfServiceScreen( - base::WeakPtr<ArcTermsOfServiceScreenView> view, - const ScreenExitCallback& exit_callback) - : BaseScreen(ArcTermsOfServiceScreenView::kScreenId, - OobeScreenPriority::DEFAULT), - view_(std::move(view)), - exit_callback_(exit_callback) { - DCHECK(view_); - view_->AddObserver(this); -} - -ArcTermsOfServiceScreen::~ArcTermsOfServiceScreen() { - if (view_) { - view_->RemoveObserver(this); - } -} - -bool ArcTermsOfServiceScreen::MaybeSkip(WizardContext& context) { - if (context.skip_post_login_screens_for_tests) { - exit_callback_.Run(Result::NOT_APPLICABLE); - return true; - } - - if (features::IsOobeConsolidatedConsentEnabled()) { - // In demo mode, the ARC-ToS screen is skipped and shown later in the - // consolidated consent screen, - const auto* const demo_setup_controller = - WizardController::default_controller()->demo_setup_controller(); - if (demo_setup_controller) { - exit_callback_.Run(Result::NOT_APPLICABLE_DEMO_ONLINE); - return true; - } - - // In regular flow, if ARC is enabled, then the user has already accepted - // ARC-ToS in the consolidated consent screen earlier in the flow. - Profile* const profile = ProfileManager::GetActiveUserProfile(); - if (arc::IsArcPlayStoreEnabledForProfile(profile)) { - exit_callback_.Run( - Result::NOT_APPLICABLE_CONSOLIDATED_CONSENT_ARC_ENABLED); - } else { - exit_callback_.Run(Result::NOT_APPLICABLE); - } - return true; - } - - if (!arc::IsArcTermsOfServiceOobeNegotiationNeeded()) { - const auto* const demo_setup_controller = - WizardController::default_controller()->demo_setup_controller(); - - if (!demo_setup_controller) { - exit_callback_.Run(Result::NOT_APPLICABLE); - } else { - exit_callback_.Run(Result::NOT_APPLICABLE_DEMO_ONLINE); - } - return true; - } - return false; -} - -void ArcTermsOfServiceScreen::ShowImpl() { - if (!view_) - return; - - // Show the screen. - view_->Show(); -} - -void ArcTermsOfServiceScreen::HideImpl() { - if (view_) - view_->Hide(); -} - -void ArcTermsOfServiceScreen::OnUserAction(const base::Value::List& args) { - const std::string& action_id = args[0].GetString(); - if (!IsArcTosUserAction(action_id)) { - BaseScreen::OnUserAction(args); - return; - } - RecordUserAction(action_id); - if (action_id == kUserActionBackButtonClicked) - exit_callback_.Run(Result::BACK); -} - -void ArcTermsOfServiceScreen::OnAccept(bool review_arc_settings) { - if (is_hidden()) - return; - base::UmaHistogramBoolean("OOBE.ArcTermsOfServiceScreen.ReviewFollowingSetup", - review_arc_settings); - if (review_arc_settings) { - Profile* const profile = ProfileManager::GetActiveUserProfile(); - CHECK(profile); - profile->GetPrefs()->SetBoolean(prefs::kShowArcSettingsOnSessionStart, - true); - } - - const DemoSetupController* const demo_setup_controller = - WizardController::default_controller()->demo_setup_controller(); - - if (!demo_setup_controller) { - exit_callback_.Run(Result::ACCEPTED); - } else { - exit_callback_.Run(Result::ACCEPTED_DEMO_ONLINE); - } -} - -void ArcTermsOfServiceScreen::OnViewDestroyed( - ArcTermsOfServiceScreenView* view) { - DCHECK_EQ(view, view_.get()); - view_->RemoveObserver(this); - view_ = nullptr; -} - -} // namespace ash
diff --git a/chrome/browser/ash/login/screens/arc_terms_of_service_screen.h b/chrome/browser/ash/login/screens/arc_terms_of_service_screen.h deleted file mode 100644 index c8d11da..0000000 --- a/chrome/browser/ash/login/screens/arc_terms_of_service_screen.h +++ /dev/null
@@ -1,91 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_ASH_LOGIN_SCREENS_ARC_TERMS_OF_SERVICE_SCREEN_H_ -#define CHROME_BROWSER_ASH_LOGIN_SCREENS_ARC_TERMS_OF_SERVICE_SCREEN_H_ - -#include <string> - -#include "base/functional/callback.h" -#include "base/memory/weak_ptr.h" -#include "chrome/browser/ash/login/screens/base_screen.h" -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" - -class Profile; - -namespace ash { - -class ArcTermsOfServiceScreen : public BaseScreen, - public ArcTermsOfServiceScreenViewObserver { - public: - enum class Result { - ACCEPTED, - ACCEPTED_DEMO_ONLINE, - BACK, - NOT_APPLICABLE, - NOT_APPLICABLE_DEMO_ONLINE, - NOT_APPLICABLE_CONSOLIDATED_CONSENT_ARC_ENABLED, - }; - - // This enum is tied directly to a UMA enum defined in - // //tools/metrics/histograms/enums.xml, and should always reflect it (do not - // change one without changing the other). Entries should be never modified - // or deleted. Only additions possible. - enum class UserAction { - kAcceptButtonClicked = 0, - kNextButtonClicked = 1, - kRetryButtonClicked = 2, - kBackButtonClicked = 3, - kMetricsLearnMoreClicked = 4, - kBackupRestoreLearnMoreClicked = 5, - kLocationServiceLearnMoreClicked = 6, - kPlayAutoInstallLearnMoreClicked = 7, - kPolicyLinkClicked = 8, - kMaxValue = kPolicyLinkClicked - }; - - static std::string GetResultString(Result result); - - // Launches the ARC settings page if the user requested to review them after - // completing OOBE. - static void MaybeLaunchArcSettings(Profile* profile); - - using ScreenExitCallback = base::RepeatingCallback<void(Result result)>; - ArcTermsOfServiceScreen(base::WeakPtr<ArcTermsOfServiceScreenView> view, - const ScreenExitCallback& exit_callback); - - ArcTermsOfServiceScreen(const ArcTermsOfServiceScreen&) = delete; - ArcTermsOfServiceScreen& operator=(const ArcTermsOfServiceScreen&) = delete; - - ~ArcTermsOfServiceScreen() override; - - void set_exit_callback_for_testing(const ScreenExitCallback& exit_callback) { - exit_callback_ = exit_callback; - } - - const ScreenExitCallback& get_exit_callback_for_testing() { - return exit_callback_; - } - - // ArcTermsOfServiceScreenViewObserver: - void OnAccept(bool review_arc_settings) override; - void OnViewDestroyed(ArcTermsOfServiceScreenView* view) override; - - protected: - // BaseScreen: - bool MaybeSkip(WizardContext& context) override; - void ShowImpl() override; - void HideImpl() override; - void OnUserAction(const base::Value::List& args) override; - - ScreenExitCallback* exit_callback() { return &exit_callback_; } - - private: - base::WeakPtr<ArcTermsOfServiceScreenView> view_; - ScreenExitCallback exit_callback_; -}; - -} // namespace ash - -#endif // CHROME_BROWSER_ASH_LOGIN_SCREENS_ARC_TERMS_OF_SERVICE_SCREEN_H_
diff --git a/chrome/browser/ash/login/screens/recommend_apps_screen.cc b/chrome/browser/ash/login/screens/recommend_apps_screen.cc index 54b784f2..07a5c90 100644 --- a/chrome/browser/ash/login/screens/recommend_apps_screen.cc +++ b/chrome/browser/ash/login/screens/recommend_apps_screen.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/apps/app_discovery_service/app_discovery_service_factory.h" #include "chrome/browser/apps/app_discovery_service/play_extras.h" #include "chrome/browser/ash/app_list/arc/arc_fast_app_reinstall_starter.h" +#include "chrome/browser/ash/arc/arc_util.h" #include "chrome/browser/ash/arc/session/arc_session_manager.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/profiles/profile.h" @@ -113,9 +114,14 @@ const user_manager::UserManager* user_manager = user_manager::UserManager::Get(); DCHECK(user_manager->IsUserLoggedIn()); - bool is_managed_account = ProfileManager::GetActiveUserProfile() - ->GetProfilePolicyConnector() - ->IsManaged(); + + Profile* profile = ProfileManager::GetActiveUserProfile(); + if (!arc::IsArcPlayStoreEnabledForProfile(profile)) { + exit_callback_.Run(Result::NOT_APPLICABLE); + return true; + } + + bool is_managed_account = profile->GetProfilePolicyConnector()->IsManaged(); bool is_child_account = user_manager->IsLoggedInAsChildUser(); if (is_managed_account || is_child_account || skip_for_testing_) { exit_callback_.Run(Result::NOT_APPLICABLE);
diff --git a/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc b/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc index 2e40495..0b01252 100644 --- a/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc
@@ -8,6 +8,7 @@ #include <vector> #include "ash/components/arc/arc_prefs.h" +#include "ash/constants/ash_switches.h" #include "base/functional/bind.h" #include "base/json/json_reader.h" #include "base/strings/string_piece.h" @@ -133,8 +134,17 @@ ~RecommendAppsScreenTest() override = default; // OobeBaseTest: + void SetUpCommandLine(base::CommandLine* command_line) override { + OobeBaseTest::SetUpCommandLine(command_line); + command_line->AppendSwitchASCII(switches::kArcAvailability, + "officially-supported"); + } + void SetUpOnMainThread() override { OobeBaseTest::SetUpOnMainThread(); + LoginDisplayHost::default_host()->GetWizardContext()->is_branded_build = + true; + recommend_apps_fetcher_factory_ = std::make_unique<ScopedTestRecommendAppsFetcherFactory>( base::BindRepeating(
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc index e7e9b05d..9b4a0ea 100644 --- a/chrome/browser/ash/login/session/user_session_manager.cc +++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -68,7 +68,6 @@ #include "chrome/browser/ash/login/quick_unlock/pin_backend.h" #include "chrome/browser/ash/login/saml/password_sync_token_verifier.h" #include "chrome/browser/ash/login/saml/password_sync_token_verifier_factory.h" -#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h" #include "chrome/browser/ash/login/screens/sync_consent_screen.h" #include "chrome/browser/ash/login/security_token_session_controller_factory.h" #include "chrome/browser/ash/login/session/user_session_initializer.h" @@ -2045,7 +2044,6 @@ } void UserSessionManager::MaybeLaunchSettings(Profile* profile) { - ArcTermsOfServiceScreen::MaybeLaunchArcSettings(profile); SyncConsentScreen::MaybeLaunchSyncConsentSettings(profile); }
diff --git a/chrome/browser/ash/login/users/chrome_user_manager.h b/chrome/browser/ash/login/users/chrome_user_manager.h index 02f5cbd..829829a 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager.h +++ b/chrome/browser/ash/login/users/chrome_user_manager.h
@@ -72,22 +72,6 @@ virtual bool IsFullManagementDisclosureNeeded( policy::DeviceLocalAccountPolicyBroker* broker) const = 0; - // Temporarily stores a record of a user being moved. This is used for - // reporting on managed devices. Users are cached since it is possible for - // them to be removed just before the user removal reporter is created - // when the device has its users cleared in the admin console. - virtual void CacheRemovedUser(const std::string& user_email, - user_manager::UserRemovalReason) = 0; - - // Gets the temporarily removes users stores by CacheRemovedUser. - virtual std::vector<std::pair<std::string, user_manager::UserRemovalReason>> - GetRemovedUserCache() const = 0; - - // Marks that the user added/removed reporter has been initialized. This - // indicates that removed users no longer need to be cached and will result - // in the cache being cleared. - virtual void MarkReporterInitialized() = 0; - private: LoginState::LoggedInUserType GetLoggedInUserType( const user_manager::User& active_user,
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc index ae7384d..b4724af 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc +++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -585,40 +585,9 @@ g_browser_process->profile_manager() ->GetProfileAttributesStorage() .RemoveProfileByAccountId(account_id); - if (!user_added_removed_reporter_intialized_) { - CacheRemovedUser(account_id.GetUserEmail(), reason); - } RemoveNonOwnerUserInternal(account_id, reason); } -void ChromeUserManagerImpl::CacheRemovedUser( - const std::string& user_email, - user_manager::UserRemovalReason reason) { - // There is only a need to cache removed users if they should be reported. - bool reporting_enabled = false; - CrosSettings::Get()->GetBoolean(kReportDeviceLoginLogout, &reporting_enabled); - if (!reporting_enabled) { - return; - } - - // Unaffiliated users should not have their email reported. - if (ShouldReportUser(user_email)) { - removed_user_cache_.push_back(std::make_pair(user_email, reason)); - } else { - removed_user_cache_.push_back(std::make_pair("", reason)); - } -} - -std::vector<std::pair<std::string, user_manager::UserRemovalReason>> -ChromeUserManagerImpl::GetRemovedUserCache() const { - return removed_user_cache_; -} - -void ChromeUserManagerImpl::MarkReporterInitialized() { - removed_user_cache_.clear(); - user_added_removed_reporter_intialized_ = true; -} - void ChromeUserManagerImpl::SaveUserOAuthStatus( const AccountId& account_id, user_manager::User::OAuthTokenStatus oauth_token_status) {
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.h b/chrome/browser/ash/login/users/chrome_user_manager_impl.h index b43cee91..db56361 100644 --- a/chrome/browser/ash/login/users/chrome_user_manager_impl.h +++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.h
@@ -140,11 +140,6 @@ const AffiliationIDSet& user_affiliation_ids) override; bool IsFullManagementDisclosureNeeded( policy::DeviceLocalAccountPolicyBroker* broker) const override; - void CacheRemovedUser(const std::string& user_email, - user_manager::UserRemovalReason) override; - std::vector<std::pair<std::string, user_manager::UserRemovalReason>> - GetRemovedUserCache() const override; - void MarkReporterInitialized() override; protected: const std::string& GetApplicationLocale() const override; @@ -280,14 +275,9 @@ std::vector<std::unique_ptr<policy::CloudExternalDataPolicyHandler>> cloud_external_data_policy_handlers_; - std::vector<std::pair<std::string, user_manager::UserRemovalReason>> - removed_user_cache_; - base::ScopedObservation<ProfileManager, ProfileManagerObserver> profile_manager_observation_{this}; - bool user_added_removed_reporter_intialized_ = false; - base::RepeatingClosure remove_non_cryptohome_data_barrier_; std::unique_ptr<MountPerformer> mount_performer_;
diff --git a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc index 8726e16..99758501c 100644 --- a/chrome/browser/ash/login/users/fake_chrome_user_manager.cc +++ b/chrome/browser/ash/login/users/fake_chrome_user_manager.cc
@@ -732,21 +732,6 @@ return true; } -void FakeChromeUserManager::CacheRemovedUser( - const std::string& user_email, - user_manager::UserRemovalReason reason) { - removed_user_cache_.push_back(std::make_pair(user_email, reason)); -} - -std::vector<std::pair<std::string, user_manager::UserRemovalReason>> -FakeChromeUserManager::GetRemovedUserCache() const { - return removed_user_cache_; -} - -void FakeChromeUserManager::MarkReporterInitialized() { - removed_user_cache_.clear(); -} - user_manager::User* FakeChromeUserManager::GetActiveUserInternal() const { if (active_user_ != nullptr) return active_user_;
diff --git a/chrome/browser/ash/login/users/fake_chrome_user_manager.h b/chrome/browser/ash/login/users/fake_chrome_user_manager.h index ddd7b03..1fd1321 100644 --- a/chrome/browser/ash/login/users/fake_chrome_user_manager.h +++ b/chrome/browser/ash/login/users/fake_chrome_user_manager.h
@@ -180,11 +180,6 @@ const AffiliationIDSet& user_affiliation_ids) override; bool IsFullManagementDisclosureNeeded( policy::DeviceLocalAccountPolicyBroker* broker) const override; - void CacheRemovedUser(const std::string& user_email, - user_manager::UserRemovalReason) override; - std::vector<std::pair<std::string, user_manager::UserRemovalReason>> - GetRemovedUserCache() const override; - void MarkReporterInitialized() override; void set_ephemeral_mode_config(EphemeralModeConfig ephemeral_mode_config) { fake_ephemeral_mode_config_ = std::move(ephemeral_mode_config); @@ -269,10 +264,6 @@ // User avatar managers. UserImageManagerMap user_image_managers_; - - // Fake cache of removed users. Used for reporting testing. - std::vector<std::pair<std::string, user_manager::UserRemovalReason>> - removed_user_cache_; }; } // namespace ash
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc index 183ae39..d1176c4 100644 --- a/chrome/browser/ash/login/wizard_controller.cc +++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -54,7 +54,6 @@ #include "chrome/browser/ash/login/screens/active_directory_login_screen.h" #include "chrome/browser/ash/login/screens/active_directory_password_change_screen.h" #include "chrome/browser/ash/login/screens/app_downloading_screen.h" -#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h" #include "chrome/browser/ash/login/screens/arc_vm_data_migration_screen.h" #include "chrome/browser/ash/login/screens/assistant_optin_flow_screen.h" #include "chrome/browser/ash/login/screens/base_screen.h" @@ -134,7 +133,6 @@ #include "chrome/browser/ui/webui/ash/login/active_directory_password_change_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_downloading_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_launch_splash_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/arc_vm_data_migration_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/assistant_optin_flow_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/auto_enrollment_check_screen_handler.h" @@ -260,7 +258,6 @@ HWDataCollectionView::kScreenId, FingerprintSetupScreenView::kScreenId, GestureNavigationScreenView::kScreenId, - ArcTermsOfServiceScreenView::kScreenId, RecommendAppsScreenView::kScreenId, PinSetupScreenView::kScreenId, MarketingOptInScreenView::kScreenId, @@ -306,7 +303,6 @@ // Some screens had multiple different names in the past (they have since been // unified). We need to always use the same name for UMA stats, though. constexpr const Entry kLegacyUmaOobeScreenNames[] = { - {ArcTermsOfServiceScreenView::kScreenId, "arc_tos"}, {EnrollmentScreenView::kScreenId, "enroll"}, {WelcomeView::kScreenId, "network"}, {TermsOfServiceScreenView::kScreenId, "tos"}}; @@ -671,10 +667,6 @@ oobe_ui->GetView<SyncConsentScreenHandler>()->AsWeakPtr(), base::BindRepeating(&WizardController::OnSyncConsentScreenExit, weak_factory_.GetWeakPtr()))); - append(std::make_unique<ArcTermsOfServiceScreen>( - oobe_ui->GetView<ArcTermsOfServiceScreenHandler>()->AsWeakPtr(), - base::BindRepeating(&WizardController::OnArcTermsOfServiceScreenExit, - weak_factory_.GetWeakPtr()))); append(std::make_unique<RecommendAppsScreen>( oobe_ui->GetView<RecommendAppsScreenHandler>()->AsWeakPtr(), base::BindRepeating(&WizardController::OnRecommendAppsScreenExit, @@ -1033,10 +1025,6 @@ SetCurrentScreen(GetScreen(MarketingOptInScreenView::kScreenId)); } -void WizardController::ShowArcTermsOfServiceScreen() { - SetCurrentScreen(GetScreen(ArcTermsOfServiceScreenView::kScreenId)); -} - void WizardController::ShowRecommendAppsScreen() { SetCurrentScreen(GetScreen(RecommendAppsScreenView::kScreenId)); } @@ -1915,35 +1903,7 @@ OnScreenExit(PinSetupScreenView::kScreenId, PinSetupScreen::GetResultString(result)); - ShowArcTermsOfServiceScreen(); -} - -void WizardController::OnArcTermsOfServiceScreenExit( - ArcTermsOfServiceScreen::Result result) { - OnScreenExit(ArcTermsOfServiceScreenView::kScreenId, - ArcTermsOfServiceScreen::GetResultString(result)); - - switch (result) { - case ArcTermsOfServiceScreen::Result::ACCEPTED: - case ArcTermsOfServiceScreen::Result:: - NOT_APPLICABLE_CONSOLIDATED_CONSENT_ARC_ENABLED: - DCHECK(!demo_setup_controller_); - ShowRecommendAppsScreen(); - break; - case ArcTermsOfServiceScreen::Result::NOT_APPLICABLE: - ShowAssistantOptInFlowScreen(); - break; - case ArcTermsOfServiceScreen::Result::ACCEPTED_DEMO_ONLINE: - case ArcTermsOfServiceScreen::Result::NOT_APPLICABLE_DEMO_ONLINE: - DCHECK(demo_setup_controller_); - InitiateOOBEUpdate(); - break; - case ArcTermsOfServiceScreen::Result::BACK: - DCHECK(demo_setup_controller_); - DCHECK(StartupUtils::IsEulaAccepted()); - ShowDemoModePreferencesScreen(); - break; - } + ShowRecommendAppsScreen(); } void WizardController::OnRecommendAppsScreenExit( @@ -2379,8 +2339,6 @@ ShowDemoModePreferencesScreen(); } else if (screen_id == TermsOfServiceScreenView::kScreenId) { ShowTermsOfServiceScreen(); - } else if (screen_id == ArcTermsOfServiceScreenView::kScreenId) { - ShowArcTermsOfServiceScreen(); } else if (screen_id == SyncConsentScreenView::kScreenId) { ShowSyncConsentScreen(); } else if (screen_id == RecommendAppsScreenView::kScreenId) {
diff --git a/chrome/browser/ash/login/wizard_controller.h b/chrome/browser/ash/login/wizard_controller.h index 7ac4bb1..cea9ce1 100644 --- a/chrome/browser/ash/login/wizard_controller.h +++ b/chrome/browser/ash/login/wizard_controller.h
@@ -23,7 +23,6 @@ #include "chrome/browser/ash/login/oobe_screen.h" #include "chrome/browser/ash/login/screen_manager.h" #include "chrome/browser/ash/login/screens/active_directory_login_screen.h" -#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h" #include "chrome/browser/ash/login/screens/assistant_optin_flow_screen.h" #include "chrome/browser/ash/login/screens/choobe_screen.h" #include "chrome/browser/ash/login/screens/consolidated_consent_screen.h" @@ -298,7 +297,6 @@ void ShowTermsOfServiceScreen(); void ShowSyncConsentScreen(); void ShowFingerprintSetupScreen(); - void ShowArcTermsOfServiceScreen(); void ShowRecommendAppsScreen(); void ShowAppDownloadingScreen(); void ShowWrongHWIDScreen(); @@ -374,7 +372,6 @@ void OnFingerprintSetupScreenExit(FingerprintSetupScreen::Result result); void OnSyncConsentScreenExit(SyncConsentScreen::Result result); void OnPinSetupScreenExit(PinSetupScreen::Result result); - void OnArcTermsOfServiceScreenExit(ArcTermsOfServiceScreen::Result result); void OnRecommendAppsScreenExit(RecommendAppsScreen::Result result); void OnAppDownloadingScreenExit(); void OnAssistantOptInFlowScreenExit(AssistantOptInFlowScreen::Result result);
diff --git a/chrome/browser/ash/notifications/multi_capture_login_notification.cc b/chrome/browser/ash/notifications/multi_capture_login_notification.cc new file mode 100644 index 0000000..d3b0dfa --- /dev/null +++ b/chrome/browser/ash/notifications/multi_capture_login_notification.cc
@@ -0,0 +1,104 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/notifications/multi_capture_login_notification.h" + +#include "ash/public/cpp/notification_utils.h" +#include "ash/resources/vector_icons/vector_icons.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" +#include "base/memory/scoped_refptr.h" +#include "chrome/browser/media/webrtc/capture_policy_utils.h" +#include "chrome/browser/notifications/system_notification_helper.h" +#include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/browser_context_helper/browser_context_helper.h" +#include "components/user_manager/user.h" +#include "components/user_manager/user_manager.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notifier_id.h" + +namespace { + +absl::optional<bool> g_is_multi_capture_allowed_for_testing; + +constexpr char kMultiCaptureOnLoginId[] = "multi_capture_on_login"; +constexpr char kNotifierMultiCaptureOnLogin[] = "ash.multi_capture_on_login"; + +bool IsMultiCaptureAllowed() { + if (g_is_multi_capture_allowed_for_testing) { + return *g_is_multi_capture_allowed_for_testing; + } + + auto* active_user = user_manager::UserManager::Get()->GetActiveUser(); + if (!active_user) { + return false; + } + auto* browser_context = + ash::BrowserContextHelper::Get()->GetBrowserContextByUser(active_user); + if (!browser_context) { + return false; + } + return capture_policy::IsGetDisplayMediaSetSelectAllScreensAllowedForAnySite( + browser_context); +} + +void CreateAndShowNotification(bool is_multi_capture_allowed) { + if (!is_multi_capture_allowed) { + return; + } + message_center::NotifierId notifier_id( + message_center::NotifierType::SYSTEM_COMPONENT, + kNotifierMultiCaptureOnLogin, + ash::NotificationCatalogName::kMultiCaptureOnLogin); + + message_center::Notification notification = ash::CreateSystemNotification( + message_center::NOTIFICATION_TYPE_SIMPLE, kMultiCaptureOnLoginId, + /*title=*/ + l10n_util::GetStringUTF16(IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_TITLE), + /*message=*/ + l10n_util::GetStringUTF16( + IDS_MULTI_CAPTURE_NOTIFICATION_ON_LOGIN_MESSAGE), + /*display_source=*/std::u16string(), /*origin_url=*/GURL(), notifier_id, + /*optional_fields=*/message_center::RichNotificationData(), + /*delegate=*/ + base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( + message_center::HandleNotificationClickDelegate::ButtonClickCallback( + base::DoNothing())), + ash::kShelfEnterpriseIcon, + message_center::SystemNotificationWarningLevel::NORMAL); + SystemNotificationHelper::GetInstance()->Display(notification); +} + +} // namespace + +namespace ash { + +MultiCaptureLoginNotification::MultiCaptureLoginNotification() { + login_state_observation_.Observe(ash::LoginState::Get()); +} + +MultiCaptureLoginNotification::~MultiCaptureLoginNotification() = default; + +void MultiCaptureLoginNotification::LoggedInStateChanged() { + if (ash::LoginState::Get()->IsUserLoggedIn()) { + user_manager::User* active_user = + user_manager::UserManager::Get()->GetActiveUser(); + if (!active_user) { + return; + } + + active_user->AddProfileCreatedObserver( + base::BindOnce(&IsMultiCaptureAllowed) + .Then(base::BindOnce(&CreateAndShowNotification))); + } +} + +void SetIsMultiCaptureAllowedCallbackForTesting(bool is_multi_capture_allowed) { + g_is_multi_capture_allowed_for_testing = is_multi_capture_allowed; +} + +} // namespace ash
diff --git a/chrome/browser/ash/notifications/multi_capture_login_notification.h b/chrome/browser/ash/notifications/multi_capture_login_notification.h new file mode 100644 index 0000000..57880d9 --- /dev/null +++ b/chrome/browser/ash/notifications/multi_capture_login_notification.h
@@ -0,0 +1,34 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ASH_NOTIFICATIONS_MULTI_CAPTURE_LOGIN_NOTIFICATION_H_ +#define CHROME_BROWSER_ASH_NOTIFICATIONS_MULTI_CAPTURE_LOGIN_NOTIFICATION_H_ + +#include "base/scoped_observation.h" +#include "chromeos/ash/components/login/login_state/login_state.h" + +namespace ash { + +// Notification that is shown on user login if multi capture is enabled. +class MultiCaptureLoginNotification : public LoginState::Observer { + public: + MultiCaptureLoginNotification(); + MultiCaptureLoginNotification(const MultiCaptureLoginNotification&) = delete; + MultiCaptureLoginNotification& operator=( + const MultiCaptureLoginNotification&) = delete; + ~MultiCaptureLoginNotification() override; + + // LoginState::Observer: + void LoggedInStateChanged() override; + + private: + base::ScopedObservation<LoginState, LoginState::Observer> + login_state_observation_{this}; +}; + +void SetIsMultiCaptureAllowedCallbackForTesting(bool is_multi_capture_allowed); + +} // namespace ash + +#endif // CHROME_BROWSER_ASH_NOTIFICATIONS_MULTI_CAPTURE_LOGIN_NOTIFICATION_H_
diff --git a/chrome/browser/ash/notifications/multi_capture_login_notification_unittest.cc b/chrome/browser/ash/notifications/multi_capture_login_notification_unittest.cc new file mode 100644 index 0000000..60fdbab0 --- /dev/null +++ b/chrome/browser/ash/notifications/multi_capture_login_notification_unittest.cc
@@ -0,0 +1,140 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ash/notifications/multi_capture_login_notification.h" + +#include <memory> + +#include "ash/test/ash_test_base.h" +#include "ash/test_shell_delegate.h" +#include "base/functional/bind.h" +#include "base/test/task_environment.h" +#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" +#include "chrome/browser/notifications/notification_display_service_tester.h" +#include "chrome/browser/notifications/system_notification_helper.h" +#include "chrome/test/base/testing_browser_process.h" +#include "components/account_id/account_id.h" +#include "components/user_manager/scoped_user_manager.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/test/browser_task_environment.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/message_center/public/cpp/notification.h" +#include "url/origin.h" + +namespace ash { + +class MultiCaptureLoginNotificationTest : public AshTestBase { + public: + MultiCaptureLoginNotificationTest() + : ash::AshTestBase(std::unique_ptr<base::test::TaskEnvironment>( + std::make_unique<content::BrowserTaskEnvironment>())), + active_user_account_id_( + AccountId::FromUserEmail(/*user_email=*/"sample_user@gmail.com")) {} + ~MultiCaptureLoginNotificationTest() override = default; + + void SetUp() override { + AshTestBase::SetUp(); + std::unique_ptr<FakeChromeUserManager> user_manager = + std::make_unique<FakeChromeUserManager>(); + user_manager_ = user_manager.get(); + scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( + std::move(user_manager)); + user_manager_->AddUser(active_user_account_id_); + + CreateUserSessions(1); + + LoginState::Get()->SetLoggedInState(LoginState::LOGGED_IN_NONE, + LoginState::LOGGED_IN_USER_NONE); + multi_capture_login_notification_ = + std::make_unique<MultiCaptureLoginNotification>(); + notification_count_ = 0u; + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( + std::make_unique<SystemNotificationHelper>()); + tester_ = std::make_unique<NotificationDisplayServiceTester>( + /*profile=*/nullptr); + tester_->SetNotificationAddedClosure(base::BindRepeating( + &MultiCaptureLoginNotificationTest::OnNotificationAdded, + base::Unretained(this))); + } + + void TearDown() override { + multi_capture_login_notification_.reset(); + AshTestBase::TearDown(); + } + + absl::optional<message_center::Notification> GetNotification() { + return tester_->GetNotification("multi_capture_on_login"); + } + + void OnNotificationAdded() { notification_count_++; } + + protected: + std::unique_ptr<NotificationDisplayServiceTester> tester_; + std::unique_ptr<MultiCaptureLoginNotification> + multi_capture_login_notification_; + AccountId active_user_account_id_; + std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + FakeChromeUserManager* user_manager_; + + unsigned int notification_count_; +}; + +TEST_F(MultiCaptureLoginNotificationTest, NotificationTriggeredOnLogin) { + LoginState* login_state = LoginState::Get(); + SetIsMultiCaptureAllowedCallbackForTesting( + /*is_multi_capture_allowed=*/true); + EXPECT_EQ(0u, notification_count_); + + user_manager_->SwitchActiveUser(active_user_account_id_); + user_manager_->SimulateUserProfileLoad(active_user_account_id_); + login_state->SetLoggedInState( + LoginState::LoggedInState::LOGGED_IN_ACTIVE, + LoginState::LoggedInUserType::LOGGED_IN_USER_REGULAR); + + absl::optional<message_center::Notification> notification = GetNotification(); + ASSERT_TRUE(notification); + EXPECT_EQ(u"Your screen might be recorded", notification->title()); + EXPECT_EQ( + u"You'll see a notification if recording starts on this managed device", + notification->message()); + EXPECT_EQ(1u, notification_count_); +} + +TEST_F(MultiCaptureLoginNotificationTest, + FeatureDisabledNotificationNotTriggeredOnLogin) { + LoginState* login_state = LoginState::Get(); + SetIsMultiCaptureAllowedCallbackForTesting( + /*is_multi_capture_allowed=*/false); + EXPECT_EQ(0u, notification_count_); + + user_manager_->SwitchActiveUser(active_user_account_id_); + user_manager_->SimulateUserProfileLoad(active_user_account_id_); + login_state->SetLoggedInState( + LoginState::LoggedInState::LOGGED_IN_ACTIVE, + LoginState::LoggedInUserType::LOGGED_IN_USER_REGULAR); + + absl::optional<message_center::Notification> notification = GetNotification(); + ASSERT_FALSE(notification); + EXPECT_EQ(0u, notification_count_); +} + +TEST_F(MultiCaptureLoginNotificationTest, NotLoggedInNoNotification) { + LoginState* login_state = LoginState::Get(); + SetIsMultiCaptureAllowedCallbackForTesting( + /*is_multi_capture_allowed=*/true); + EXPECT_EQ(0u, notification_count_); + + user_manager_->SwitchActiveUser(active_user_account_id_); + user_manager_->SimulateUserProfileLoad(active_user_account_id_); + login_state->SetLoggedInState( + LoginState::LoggedInState::LOGGED_IN_NONE, + LoginState::LoggedInUserType::LOGGED_IN_USER_NONE); + + absl::optional<message_center::Notification> notification = GetNotification(); + ASSERT_FALSE(notification); + EXPECT_EQ(0u, notification_count_); +} + +} // namespace ash
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc index 8affe03..a6d8d4c1f 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc
@@ -93,7 +93,9 @@ external_data_manager_(std::move(external_data_manager)), state_keys_broker_(state_keys_broker), task_runner_(task_runner), - local_state_(nullptr) {} + local_state_(nullptr), + helper_(std::make_unique<reporting::UserEventReporterHelper>( + reporting::Destination::UNDEFINED_DESTINATION)) {} DeviceCloudPolicyManagerAsh::~DeviceCloudPolicyManagerAsh() = default; @@ -278,6 +280,59 @@ NotifyGotRegistry(); } +void DeviceCloudPolicyManagerAsh::OnUserManagerCreated( + user_manager::UserManager* user_manager) { + user_manager_observation_.Observe(user_manager); +} + +void DeviceCloudPolicyManagerAsh::OnUserManagerWillBeDestroyed( + user_manager::UserManager* user_manager) { + user_manager_observation_.Reset(); +} + +void DeviceCloudPolicyManagerAsh::OnUserToBeRemoved( + const AccountId& account_id) { + // This logic needs to be consistent with UserAddedRemovedReporter. + if (!helper_->ReportingEnabled(ash::kReportDeviceLoginLogout)) { + return; + } + const user_manager::User* user = + user_manager::UserManager::Get()->FindUser(account_id); + if (!user || user->IsKioskType() || + user->GetType() == user_manager::USER_TYPE_PUBLIC_ACCOUNT || + user->GetType() == user_manager::USER_TYPE_GUEST) { + return; + } + + const std::string email = account_id.GetUserEmail(); + users_to_be_removed_.insert_or_assign(account_id, + helper_->ShouldReportUser(email)); +} + +void DeviceCloudPolicyManagerAsh::OnUserRemoved( + const AccountId& account_id, + user_manager::UserRemovalReason reason) { + // This logic needs to be consistent with UserAddedRemovedReporter. + auto it = users_to_be_removed_.find(account_id); + if (it == users_to_be_removed_.end()) { + return; + } + + bool is_affiliated_user = it->second; + users_to_be_removed_.erase(it); + + // Check the pref, after we update the tracking map. + if (!helper_->ReportingEnabled(ash::kReportDeviceLoginLogout)) { + return; + } + + // Unlike UserAddedRemovedReporter, instead of reporting, we cache + // the removed user here. + // They're going to be reported, once the reporter instance is created. + removed_users_.emplace_back( + RemovedUser{is_affiliated_user ? account_id.GetUserEmail() : "", reason}); +} + void DeviceCloudPolicyManagerAsh::OnStateKeysUpdated() { // TODO(b/181140445): If we had a separate state keys upload request to DM // Server we should call it here. @@ -311,11 +366,21 @@ return; } + if (auto* user_manager = user_manager::UserManager::Get()) { + user_manager->RemoveObserver(this); + } + managed_session_service_ = std::make_unique<ManagedSessionService>(); login_logout_reporter_ = ash::reporting::LoginLogoutReporter::Create( managed_session_service_.get()); + user_added_removed_reporter_ = ::reporting::UserAddedRemovedReporter::Create( - managed_session_service_.get()); + std::move(users_to_be_removed_), managed_session_service_.get()); + for (const auto& [user_email, reason] : removed_users_) { + user_added_removed_reporter_->ProcessRemovedUser(user_email, reason); + } + removed_users_.clear(); + lock_unlock_reporter_ = ash::reporting::LockUnlockReporter::Create( managed_session_service_.get()); }
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h index 8f04913..a96ccae 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h +++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h
@@ -10,15 +10,18 @@ #include <vector> #include "base/observer_list.h" +#include "base/scoped_observation.h" #include "base/scoped_observation_traits.h" #include "chrome/browser/ash/policy/server_backed_state/server_backed_state_keys_broker.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/cloud_policy_manager.h" +#include "components/user_manager/user_manager.h" namespace reporting { class MetricReportingManager; -class UserAddedRemovedReporter; class OsUpdatesReporter; +class UserAddedRemovedReporter; +class UserEventReporterHelper; } // namespace reporting namespace ash { @@ -57,7 +60,8 @@ enum class ZeroTouchEnrollmentMode { DISABLED, ENABLED, FORCED, HANDS_OFF }; // CloudPolicyManager specialization for device policy in Ash. -class DeviceCloudPolicyManagerAsh : public CloudPolicyManager { +class DeviceCloudPolicyManagerAsh : public CloudPolicyManager, + public user_manager::UserManager::Observer { public: class Observer { public: @@ -146,6 +150,16 @@ return machine_certificate_uploader_.get(); } + // Called when UserManager is created. + void OnUserManagerCreated(user_manager::UserManager* user_manager); + // Called just before UserManager is destroyed. + void OnUserManagerWillBeDestroyed(user_manager::UserManager* user_manager); + + // user_manager::UserManager::Observer: + void OnUserToBeRemoved(const AccountId& account_id) override; + void OnUserRemoved(const AccountId& account_id, + user_manager::UserRemovalReason reason) override; + protected: // Object that monitors managed session related events used by reporting // services, protected for testing. @@ -169,6 +183,12 @@ std::unique_ptr<reporting::OsUpdatesReporter> os_updates_reporter_; private: + // Caches removed users. Passed to the reporter, when it is created. + struct RemovedUser { + std::string user_email; // Maybe empty, if the user should not be reported. + user_manager::UserRemovalReason reason; + }; + // Saves the state keys received from |session_manager_client_|. void OnStateKeysUpdated(); @@ -237,7 +257,18 @@ // component cloud policy service creation). bool component_policy_disabled_for_testing_ = false; + // Caches users being removed. + base::flat_map<AccountId, bool> users_to_be_removed_; + + std::vector<RemovedUser> removed_users_; + + std::unique_ptr<reporting::UserEventReporterHelper> helper_; + base::ObserverList<Observer, true>::Unchecked observers_; + + base::ScopedObservation<user_manager::UserManager, + DeviceCloudPolicyManagerAsh> + user_manager_observation_{this}; }; } // namespace policy
diff --git a/chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc b/chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc index 18367fd..43efd297 100644 --- a/chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc +++ b/chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc
@@ -50,11 +50,9 @@ "This feature is controlled by enterprise policies, and cannot" "be overridden by users. It is disabled by default." chrome_policy { - subProto1 { + ScreensaverLockScreenImages { ScreensaverLockScreenImages { - ScreensaverLockScreenImages { - entries: "" - } + entries: "" } } }
diff --git a/chrome/browser/ash/policy/handlers/screensaver_image_downloader_unittest.cc b/chrome/browser/ash/policy/handlers/screensaver_image_downloader_unittest.cc index f260008e..9659998d 100644 --- a/chrome/browser/ash/policy/handlers/screensaver_image_downloader_unittest.cc +++ b/chrome/browser/ash/policy/handlers/screensaver_image_downloader_unittest.cc
@@ -11,6 +11,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" @@ -91,13 +92,7 @@ std::unique_ptr<ScreensaverImageDownloader> screensaver_image_downloader_; }; -// crbug.com/1430802: flaky on Linux and Chrome OS -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -#define MAYBE_DownloadImagesTest DISABLED_DownloadImagesTest -#else -#define MAYBE_DownloadImagesTest DownloadImagesTest -#endif -TEST_F(ScreensaverImageDownloaderTest, MAYBE_DownloadImagesTest) { +TEST_F(ScreensaverImageDownloaderTest, DownloadImagesTest) { // Test successful download. { url_loader_factory()->AddResponse(kImageUrl1, kFileContents); @@ -134,10 +129,14 @@ QueueNewJobWithFuture(kImageUrl3, kImageFileName3); // Wait until the request have been made to delete the tmp folder - EXPECT_TRUE(url_loader_factory()->IsPending(kImageUrl3)); - DeleteTempFolder(); - url_loader_factory()->AddResponse(kImageUrl3, kFileContents); + url_loader_factory()->SetInterceptor(base::BindLambdaForTesting( + [&](const network::ResourceRequest& request) { + ASSERT_TRUE(request.url.is_valid()); + EXPECT_EQ(kImageUrl3, request.url); + DeleteTempFolder(); + url_loader_factory()->AddResponse(kImageUrl3, kFileContents); + })); EXPECT_EQ(ScreensaverImageDownloadResult::kFileSaveError, result_future->Get<0>()); EXPECT_FALSE(result_future->Get<1>().has_value());
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.h b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.h index 09df8fb..8d13167 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.h +++ b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.h
@@ -17,22 +17,6 @@ // on the device. class DeviceCommandResetEuiccJob : public RemoteCommandJob { public: - DeviceCommandResetEuiccJob(); - DeviceCommandResetEuiccJob(const DeviceCommandResetEuiccJob&) = delete; - DeviceCommandResetEuiccJob& operator=(const DeviceCommandResetEuiccJob&) = - delete; - ~DeviceCommandResetEuiccJob() override; - - static const char kResetEuiccNotificationId[]; - - // RemoteCommandJob: - enterprise_management::RemoteCommand_Type GetType() const override; - - private: - friend class DeviceCommandResetEuiccJobTest; - FRIEND_TEST_ALL_PREFIXES(DeviceCommandResetEuiccJobTest, ResetEuicc); - FRIEND_TEST_ALL_PREFIXES(DeviceCommandResetEuiccJobTest, ResetEuiccFailure); - // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class ResetEuiccResult { @@ -41,6 +25,19 @@ kHermesResetFailed = 2, kMaxValue = kHermesResetFailed }; + + static const char kResetEuiccNotificationId[]; + + DeviceCommandResetEuiccJob(); + DeviceCommandResetEuiccJob(const DeviceCommandResetEuiccJob&) = delete; + DeviceCommandResetEuiccJob& operator=(const DeviceCommandResetEuiccJob&) = + delete; + ~DeviceCommandResetEuiccJob() override; + + // RemoteCommandJob: + enterprise_management::RemoteCommand_Type GetType() const override; + + private: static void RecordResetEuiccResult(ResetEuiccResult result); // RemoteCommandJob:
diff --git a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc index ddfbdc8..1f2627c6 100644 --- a/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc +++ b/chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job_unittest.cc
@@ -4,7 +4,9 @@ #include "chrome/browser/ash/policy/remote_commands/device_command_reset_euicc_job.h" +#include "ash/constants/ash_features.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" #include "chrome/browser/notifications/notification_display_service_tester.h" @@ -51,8 +53,11 @@ ash::HermesEuiccClient::Properties* euicc_properties = ash::HermesEuiccClient::Get()->GetProperties( dbus::ObjectPath(kTestEuiccPath)); - EXPECT_EQ(expected_count, - euicc_properties->installed_carrier_profiles().value().size()); + const std::vector<dbus::ObjectPath>& profile_paths = + ash::features::IsSmdsDbusMigrationEnabled() + ? euicc_properties->profiles().value() + : euicc_properties->installed_carrier_profiles().value(); + EXPECT_EQ(expected_count, profile_paths.size()); } void VerifyJobResult(const RemoteCommandJob& job, @@ -66,10 +71,16 @@ class DeviceCommandResetEuiccJobTest : public ChromeAshTestBase { public: - DeviceCommandResetEuiccJobTest() + explicit DeviceCommandResetEuiccJobTest(bool enable_dbus_migration) : ChromeAshTestBase(std::unique_ptr<base::test::TaskEnvironment>( std::make_unique<content::BrowserTaskEnvironment>( - base::test::TaskEnvironment::TimeSource::MOCK_TIME))) {} + base::test::TaskEnvironment::TimeSource::MOCK_TIME))) { + if (enable_dbus_migration) { + feature_list_.InitAndEnableFeature(ash::features::kSmdsDbusMigration); + } else { + feature_list_.InitAndDisableFeature(ash::features::kSmdsDbusMigration); + } + } DeviceCommandResetEuiccJobTest(const DeviceCommandResetEuiccJobTest&) = delete; DeviceCommandResetEuiccJobTest& operator=( @@ -85,9 +96,11 @@ AddFakeESimProfile(); AddFakeESimProfile(); + // Wait for all pending Hermes and Shill change notifications to be handled // so that new EUICC and profile states are reflected correctly. base::RunLoop().RunUntilIdle(); + VerifyEuiccProfileCount(/*expected_count=*/2u); } @@ -113,12 +126,37 @@ kAddProfileWithService); } + base::test::ScopedFeatureList feature_list_; base::HistogramTester histogram_tester_; std::unique_ptr<ash::NetworkHandlerTestHelper> helper_; base::TimeTicks test_start_time_ = base::TimeTicks::Now(); }; -TEST_F(DeviceCommandResetEuiccJobTest, ResetEuicc) { +class DeviceCommandResetEuiccJobTest_DBusMigrationDisabled + : public DeviceCommandResetEuiccJobTest { + public: + DeviceCommandResetEuiccJobTest_DBusMigrationDisabled() + : DeviceCommandResetEuiccJobTest(/*enable_dbus_migration=*/false) {} + DeviceCommandResetEuiccJobTest_DBusMigrationDisabled( + const DeviceCommandResetEuiccJobTest_DBusMigrationDisabled&) = delete; + DeviceCommandResetEuiccJobTest_DBusMigrationDisabled& operator=( + const DeviceCommandResetEuiccJobTest_DBusMigrationDisabled&) = delete; + ~DeviceCommandResetEuiccJobTest_DBusMigrationDisabled() override = default; +}; + +class DeviceCommandResetEuiccJobTest_DBusMigrationEnabled + : public DeviceCommandResetEuiccJobTest { + public: + DeviceCommandResetEuiccJobTest_DBusMigrationEnabled() + : DeviceCommandResetEuiccJobTest(/*enable_dbus_migration=*/true) {} + DeviceCommandResetEuiccJobTest_DBusMigrationEnabled( + const DeviceCommandResetEuiccJobTest_DBusMigrationEnabled&) = delete; + DeviceCommandResetEuiccJobTest_DBusMigrationEnabled& operator=( + const DeviceCommandResetEuiccJobTest_DBusMigrationEnabled&) = delete; + ~DeviceCommandResetEuiccJobTest_DBusMigrationEnabled() override = default; +}; + +TEST_F(DeviceCommandResetEuiccJobTest_DBusMigrationDisabled, ResetEuicc) { TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( std::make_unique<SystemNotificationHelper>()); NotificationDisplayServiceTester tester(/*profile=*/nullptr); @@ -135,7 +173,7 @@ // Verify that the notification should be displayed. EXPECT_TRUE(tester.GetNotification( DeviceCommandResetEuiccJob::kResetEuiccNotificationId)); - // Verfiy that appropriate metrics have been logged. + // Verify that appropriate metrics have been logged. histogram_tester_.ExpectTotalCount(kResetEuiccOperationResultHistogram, 1); histogram_tester_.ExpectBucketCount( kResetEuiccOperationResultHistogram, @@ -144,7 +182,8 @@ histogram_tester_.ExpectTotalCount(kResetEuiccDurationHistogram, 1); } -TEST_F(DeviceCommandResetEuiccJobTest, ResetEuiccFailure) { +TEST_F(DeviceCommandResetEuiccJobTest_DBusMigrationDisabled, + ResetEuiccFailure) { // Simulate a failure by removing the cellular device. ash::ShillManagerClient::Get()->GetTestInterface()->ClearDevices(); TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( @@ -162,7 +201,60 @@ // Verify that the notification was not displayed. EXPECT_FALSE(tester.GetNotification( DeviceCommandResetEuiccJob::kResetEuiccNotificationId)); - // Verfiy that appropriate metrics have been logged. + // Verify that appropriate metrics have been logged. + histogram_tester_.ExpectTotalCount(kResetEuiccOperationResultHistogram, 1); + histogram_tester_.ExpectBucketCount( + kResetEuiccOperationResultHistogram, + DeviceCommandResetEuiccJob::ResetEuiccResult::kHermesResetFailed, + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount(kResetEuiccDurationHistogram, 0); +} + +TEST_F(DeviceCommandResetEuiccJobTest_DBusMigrationEnabled, ResetEuicc) { + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( + std::make_unique<SystemNotificationHelper>()); + NotificationDisplayServiceTester tester(/*profile=*/nullptr); + + std::unique_ptr<RemoteCommandJob> job = CreateResetEuiccJob(test_start_time_); + base::test::TestFuture<void> job_finished_future; + EXPECT_TRUE(job->Run(base::Time::Now(), base::TimeTicks::Now(), + job_finished_future.GetCallback())); + ASSERT_TRUE(job_finished_future.Wait()) << "Job did not finish."; + VerifyJobResult(*job, RemoteCommandJob::Status::SUCCEEDED, + /*expected_profile_count=*/0u); + + task_environment()->FastForwardBy(kNetworkListWaitTimeout); + // Verify that the notification should be displayed. + EXPECT_TRUE(tester.GetNotification( + DeviceCommandResetEuiccJob::kResetEuiccNotificationId)); + // Verify that appropriate metrics have been logged. + histogram_tester_.ExpectTotalCount(kResetEuiccOperationResultHistogram, 1); + histogram_tester_.ExpectBucketCount( + kResetEuiccOperationResultHistogram, + DeviceCommandResetEuiccJob::ResetEuiccResult::kSuccess, + /*expected_count=*/1); + histogram_tester_.ExpectTotalCount(kResetEuiccDurationHistogram, 1); +} + +TEST_F(DeviceCommandResetEuiccJobTest_DBusMigrationEnabled, ResetEuiccFailure) { + // Simulate a failure by removing the cellular device. + ash::ShillManagerClient::Get()->GetTestInterface()->ClearDevices(); + TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper( + std::make_unique<SystemNotificationHelper>()); + NotificationDisplayServiceTester tester(/*profile=*/nullptr); + base::test::TestFuture<void> job_finished_future; + + std::unique_ptr<RemoteCommandJob> job = CreateResetEuiccJob(test_start_time_); + EXPECT_TRUE(job->Run(base::Time::Now(), base::TimeTicks::Now(), + job_finished_future.GetCallback())); + ASSERT_TRUE(job_finished_future.Wait()) << "Job did not finish."; + VerifyJobResult(*job, RemoteCommandJob::Status::FAILED, + /*expected_profile_count=*/2u); + + // Verify that the notification was not displayed. + EXPECT_FALSE(tester.GetNotification( + DeviceCommandResetEuiccJob::kResetEuiccNotificationId)); + // Verify that appropriate metrics have been logged. histogram_tester_.ExpectTotalCount(kResetEuiccOperationResultHistogram, 1); histogram_tester_.ExpectBucketCount( kResetEuiccOperationResultHistogram,
diff --git a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc index bdbc949..ee1dd50 100644 --- a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc +++ b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc
@@ -7,7 +7,6 @@ #include <utility> #include "base/memory/ptr_util.h" -#include "chrome/browser/ash/login/users/chrome_user_manager.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" @@ -22,20 +21,23 @@ // static std::unique_ptr<UserAddedRemovedReporter> UserAddedRemovedReporter::Create( + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service) { - return base::WrapUnique( - new UserAddedRemovedReporter(std::make_unique<UserEventReporterHelper>( - Destination::ADDED_REMOVED_EVENTS), - managed_session_service)); + return base::WrapUnique(new UserAddedRemovedReporter( + std::make_unique<UserEventReporterHelper>( + Destination::ADDED_REMOVED_EVENTS), + std::move(users_to_be_removed), managed_session_service)); } // static std::unique_ptr<UserAddedRemovedReporter> UserAddedRemovedReporter::CreateForTesting( std::unique_ptr<UserEventReporterHelper> helper, + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service) { - return base::WrapUnique( - new UserAddedRemovedReporter(std::move(helper), managed_session_service)); + return base::WrapUnique(new UserAddedRemovedReporter( + std::move(helper), std::move(users_to_be_removed), + managed_session_service)); } UserAddedRemovedReporter::~UserAddedRemovedReporter() = default; @@ -115,22 +117,13 @@ reason); } -void UserAddedRemovedReporter::ProcessRemoveUserCache() { - ash::ChromeUserManager* user_manager = ash::ChromeUserManager::Get(); - auto users = user_manager->GetRemovedUserCache(); - - for (const auto& user : users) { - ProcessRemovedUser(user.first, user.second); - } - - user_manager->MarkReporterInitialized(); -} - UserAddedRemovedReporter::UserAddedRemovedReporter( std::unique_ptr<UserEventReporterHelper> helper, + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service) - : helper_(std::move(helper)) { - ProcessRemoveUserCache(); + : helper_(std::move(helper)), + users_to_be_removed_(std::move(users_to_be_removed)) { managed_session_observation_.Observe(managed_session_service); } + } // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.h b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.h index 399b39a9..54893c6 100644 --- a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.h +++ b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.h
@@ -25,11 +25,13 @@ public: // For prod. Uses the default implementation of UserEventReporterHelper. static std::unique_ptr<UserAddedRemovedReporter> Create( + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service); // For use in testing only. Allows user to pass in a test helper. static std::unique_ptr<UserAddedRemovedReporter> CreateForTesting( std::unique_ptr<UserEventReporterHelper> helper, + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service); UserAddedRemovedReporter(const UserAddedRemovedReporter& other) = delete; @@ -59,6 +61,7 @@ private: UserAddedRemovedReporter( std::unique_ptr<UserEventReporterHelper> helper, + base::flat_map<AccountId, bool> users_to_be_removed, policy::ManagedSessionService* managed_session_service); std::unique_ptr<UserEventReporterHelper> helper_;
diff --git a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc index 7bf841f..4b75e79c 100644 --- a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc +++ b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc
@@ -174,7 +174,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); LoginRegularProfile(user_email, managed_session_service.get()); @@ -212,7 +213,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); LoginRegularProfile(user_email, managed_session_service.get()); @@ -242,7 +244,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); auto profile = LoginRegularProfile(user_email, managed_session_service.get()); managed_session_service->OnUserToBeRemoved(account_id); @@ -267,7 +270,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); LoginRegularProfile(user_email, managed_session_service.get()); } @@ -288,7 +292,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); LoginGuestProfile(managed_session_service.get()); } @@ -312,7 +317,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); LoginKioskProfile(user_email, managed_session_service.get()); } @@ -346,7 +352,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); auto profile = LoginRegularProfile(user_email, managed_session_service.get()); managed_session_service->OnUserToBeRemoved(account_id); @@ -392,7 +399,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); auto profile = LoginRegularProfile(user_email, managed_session_service.get()); managed_session_service->OnUserToBeRemoved(account_id); @@ -426,7 +434,8 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); auto profile = LoginKioskProfile(user_email, managed_session_service.get()); managed_session_service->OnUserToBeRemoved(account_id); @@ -436,8 +445,6 @@ TEST_F(UserAddedRemovedReporterTest, TestRemoteRemoval) { static constexpr char user_email[] = "user@managed.org"; - ash::ChromeUserManager::Get()->CacheRemovedUser( - user_email, user_manager::UserRemovalReason::REMOTE_ADMIN_INITIATED); auto dummy_queue = std::unique_ptr<::reporting::ReportQueue, base::OnTaskRunnerDeleter>( @@ -464,7 +471,10 @@ std::make_unique<policy::ManagedSessionService>(); auto reporter = UserAddedRemovedReporter::CreateForTesting( - std::move(test_helper), managed_session_service.get()); + std::move(test_helper), /*users_to_be_removed=*/{}, + managed_session_service.get()); + reporter->ProcessRemovedUser( + user_email, user_manager::UserRemovalReason::REMOTE_ADMIN_INITIATED); EXPECT_THAT(priority, testing::Eq(::reporting::Priority::IMMEDIATE)); EXPECT_TRUE(record.has_event_timestamp_sec());
diff --git a/chrome/browser/ash/printing/zeroconf_printer_detector.cc b/chrome/browser/ash/printing/zeroconf_printer_detector.cc index 49d59cb1..59e7984 100644 --- a/chrome/browser/ash/printing/zeroconf_printer_detector.cc +++ b/chrome/browser/ash/printing/zeroconf_printer_detector.cc
@@ -55,8 +55,14 @@ // context. constexpr auto kIppRejectList = base::MakeFixedFlatSet<base::StringPiece>({ "brother mfc-9340cdw", - "canon mx490 series", + "canon e480 series", + "canon ib4000 series", + "canon mb2000 series", + "canon mb2300 series", + "canon mb5000 series", + "canon mb5300 series", "canon mg3000 series", + "canon mx490 series", }); namespace {
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java index 6dc33de..7290883 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -482,6 +482,10 @@ mOrigin = origin; } + public void setSource(@Source int source) { + mSource = source; + } + public void setHonorificPrefix(String honorificPrefix) { mHonorificPrefix = new ValueWithStatus(honorificPrefix, VerificationStatus.USER_VERIFIED); @@ -1171,6 +1175,15 @@ } /** + * Determines whether the logged in user (if any) is eligible to store + * Autofill address profiles to their account. + */ + public boolean isEligibleForAddressAccountStorage() { + return PersonalDataManagerJni.get().isEligibleForAddressAccountStorage( + mPersonalDataManagerAndroid, PersonalDataManager.this); + } + + /** * Starts loading the address validation rules for the specified {@code regionCode}. * * @param regionCode The code of the region for which to load the rules. @@ -1432,6 +1445,8 @@ boolean includeOrganizationInLabel, boolean includeCountryInLabel); AutofillProfile getProfileByGUID( long nativePersonalDataManagerAndroid, PersonalDataManager caller, String guid); + boolean isEligibleForAddressAccountStorage( + long nativePersonalDataManagerAndroid, PersonalDataManager caller); String setProfile(long nativePersonalDataManagerAndroid, PersonalDataManager caller, AutofillProfile profile); String setProfileToLocal(long nativePersonalDataManagerAndroid, PersonalDataManager caller,
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc index db381b7..ee44b66c 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.cc +++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -382,6 +382,12 @@ return PersonalDataManagerAndroid::CreateJavaProfileFromNative(env, *profile); } +jboolean PersonalDataManagerAndroid::IsEligibleForAddressAccountStorage( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& unused_obj) { + return personal_data_manager_->IsEligibleForAddressAccountStorage(); +} + ScopedJavaLocalRef<jstring> PersonalDataManagerAndroid::SetProfile( JNIEnv* env, const JavaParamRef<jobject>& unused_obj,
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h index fb9ef4547..9dbc113 100644 --- a/chrome/browser/autofill/android/personal_data_manager_android.h +++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -67,6 +67,12 @@ const base::android::JavaParamRef<jobject>& unused_obj, const base::android::JavaParamRef<jstring>& jguid); + // Determines whether the logged in user (if any) is eligible to store + // Autofill address profiles to their account. + jboolean IsEligibleForAddressAccountStorage( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& unused_obj); + // Adds or modifies a profile. If |jguid| is an empty string, we are creating // a new profile. Else we are updating an existing profile. Always returns // the GUID for this profile; the GUID it may have just been created.
diff --git a/chrome/browser/autofill/android/save_update_address_profile_message_controller.cc b/chrome/browser/autofill/android/save_update_address_profile_message_controller.cc index bd87fe370..a8dde41 100644 --- a/chrome/browser/autofill/android/save_update_address_profile_message_controller.cc +++ b/chrome/browser/autofill/android/save_update_address_profile_message_controller.cc
@@ -71,8 +71,9 @@ message_->SetDescription(GetDescription()); message_->SetDescriptionMaxLines(kDescriptionMaxLines); message_->SetPrimaryButtonText(GetPrimaryButtonText()); - message_->SetIconResourceId( - ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_AUTOFILL_ADDRESS)); + message_->SetIconResourceId(ResourceMapper::MapToJavaDrawableId( + is_migration_to_account ? IDR_ANDROID_AUTOFILL_UPLOAD_ADDRESS + : IDR_ANDROID_AUTOFILL_ADDRESS)); messages::MessageDispatcherBridge::Get()->EnqueueMessage( message_.get(), web_contents, messages::MessageScopeType::WEB_CONTENTS, @@ -155,7 +156,7 @@ CHECK(UserSignedIn()) << "Received is_migration_to_account=true option " "when user is not logged in"; return l10n_util::GetStringUTF16( - IDS_AUTOFILL_SAVE_ADDRESS_MIGRATION_PROMPT_TITLE); + IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE); } return l10n_util::GetStringUTF16(IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_TITLE); @@ -191,11 +192,12 @@ << "The user's address profile is going to be saved in their Google " "Account, but user is not signed in"; - return l10n_util::GetStringFUTF16( - is_migration_to_account_ - ? IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE - : IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_SOURCE_NOTICE, - base::UTF8ToUTF16(primary_account_info.email)); + return is_migration_to_account_ + ? l10n_util::GetStringUTF16( + IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE) + : l10n_util::GetStringFUTF16( + IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_SOURCE_NOTICE, + base::UTF8ToUTF16(primary_account_info.email)); } std::u16string
diff --git a/chrome/browser/autofill/android/save_update_address_profile_message_controller_unittest.cc b/chrome/browser/autofill/android/save_update_address_profile_message_controller_unittest.cc index a9a9589..3044a98e 100644 --- a/chrome/browser/autofill/android/save_update_address_profile_message_controller_unittest.cc +++ b/chrome/browser/autofill/android/save_update_address_profile_message_controller_unittest.cc
@@ -199,12 +199,11 @@ save_callback_.Get(), action_callback_.Get()); EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_AUTOFILL_SAVE_ADDRESS_MIGRATION_PROMPT_TITLE), + IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE), GetMessageWrapper()->GetTitle()); EXPECT_EQ( - l10n_util::GetStringFUTF16( - IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE, - base::ASCIIToUTF16(TestingProfile::kDefaultProfileUserName)), + l10n_util::GetStringUTF16( + IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE), GetMessageWrapper()->GetDescription()); EXPECT_EQ(l10n_util::GetStringUTF16( @@ -212,8 +211,9 @@ GetMessageWrapper()->GetPrimaryButtonText()); EXPECT_EQ(SaveUpdateAddressProfileMessageController::kDescriptionMaxLines, GetMessageWrapper()->GetDescriptionMaxLines()); - EXPECT_EQ(ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_AUTOFILL_ADDRESS), - GetMessageWrapper()->GetIconResourceId()); + EXPECT_EQ( + ResourceMapper::MapToJavaDrawableId(IDR_ANDROID_AUTOFILL_UPLOAD_ADDRESS), + GetMessageWrapper()->GetIconResourceId()); TriggerMessageDismissedCallback(messages::DismissReason::UNKNOWN); }
diff --git a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller.cc b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller.cc index 76faa78..dfc63c6 100644 --- a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller.cc +++ b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller.cc
@@ -73,7 +73,7 @@ return l10n_util::GetStringUTF16( is_migration_to_account_ - ? IDS_AUTOFILL_SAVE_ADDRESS_MIGRATION_PROMPT_TITLE + ? IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE : IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_TITLE); }
diff --git a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc index 4f5c216..1cbe25f1 100644 --- a/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc +++ b/chrome/browser/autofill/android/save_update_address_profile_prompt_controller_unittest.cc
@@ -233,7 +233,7 @@ ShouldReturnDataToDisplayWhenSave) { if (is_migration_to_account()) { EXPECT_EQ(l10n_util::GetStringUTF16( - IDS_AUTOFILL_SAVE_ADDRESS_MIGRATION_PROMPT_TITLE), + IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE), controller_->GetTitle()); EXPECT_EQ(l10n_util::GetStringUTF16( IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_MIGRATION_OK_BUTTON_LABEL),
diff --git a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc index 7ea09400..b198e92 100644 --- a/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_captured_sites_interactive_uitest.cc
@@ -67,9 +67,13 @@ namespace { +// The timeout for actions like bringing up the Autofill popup or showing the +// preview of suggestions. constexpr base::TimeDelta kAutofillWaitForActionInterval = base::Seconds(5); -constexpr base::TimeDelta kAutofillWaitForFormToFillWithCvcInterval = - base::Seconds(30); +// The timeout for autofilling a form. This is much higher than for other +// actions because autofilling may trigger expensive JavaScript activity. +// It may also be expensive due to CVC validation. +constexpr base::TimeDelta kAutofillWaitForFillInterval = base::Seconds(60); base::FilePath GetReplayFilesRootDirectory() { base::FilePath src_dir; @@ -172,6 +176,7 @@ int tries = 0; while (tries < attempts) { tries++; + LOG(INFO) << "Autofill attempt " << tries << " of " << attempts; // Translation bubbles and address-save prompts and others may overlap // with and thus prevent the Autofill popup, so we preemptively close all @@ -182,9 +187,11 @@ autofill_manager->client()->HideAutofillPopup( autofill::PopupHidingReason::kViewDestroyed); - if (!ShowAutofillSuggestion(focus_element_css_selector, iframe_path, - frame)) { - LOG(WARNING) << "Failed to bring up the autofill suggestion drop down."; + testing::AssertionResult suggestions_shown = ShowAutofillSuggestion( + focus_element_css_selector, iframe_path, frame); + if (!suggestions_shown) { + LOG(WARNING) << "Failed to bring up the autofill suggestion drop down: " + << suggestions_shown.message(); continue; } @@ -193,9 +200,11 @@ test_delegate()->SetExpectations({ObservedUiEvents::kPreviewFormData}, kAutofillWaitForActionInterval); SendKeyToPopup(frame, ui::DomKey::ARROW_DOWN); - if (!test_delegate()->Wait()) { + testing::AssertionResult preview_shown = test_delegate()->Wait(); + if (!preview_shown) { LOG(WARNING) << "Failed to select an option from the " - << "autofill suggestion drop down."; + << "autofill suggestion drop down: " + << preview_shown.message(); continue; } @@ -210,10 +219,8 @@ bool should_cvc_dialog_pop_up = is_credit_card_field && cvc; // Press the enter key to invoke autofill using the first suggestion. - test_delegate()->SetExpectations( - {ObservedUiEvents::kFormDataFilled}, - should_cvc_dialog_pop_up ? kAutofillWaitForFormToFillWithCvcInterval - : kAutofillWaitForActionInterval); + test_delegate()->SetExpectations({ObservedUiEvents::kFormDataFilled}, + kAutofillWaitForFillInterval); TestCardUnmaskPromptWaiter test_card_unmask_prompt_waiter( web_contents, user_prefs::UserPrefs::Get(web_contents->GetBrowserContext())); @@ -229,8 +236,9 @@ } } } - if (!test_delegate()->Wait()) { - LOG(WARNING) << "Failed to fill the form."; + testing::AssertionResult form_filled = test_delegate()->Wait(); + if (!form_filled) { + LOG(WARNING) << "Failed to fill the form: " << form_filled.message(); continue; } @@ -347,9 +355,10 @@ } private: - bool ShowAutofillSuggestion(const std::string& target_element_xpath, - const std::vector<std::string> iframe_path, - content::RenderFrameHost* frame) { + [[nodiscard]] testing::AssertionResult ShowAutofillSuggestion( + const std::string& target_element_xpath, + const std::vector<std::string> iframe_path, + content::RenderFrameHost* frame) { // First, automation should focus on the frame containing the autofill form. // Doing so ensures that Chrome scrolls the element into view if the // element is off the page. @@ -357,21 +366,28 @@ kAutofillWaitForActionInterval); if (!captured_sites_test_utils::TestRecipeReplayer::PlaceFocusOnElement( target_element_xpath, iframe_path, frame)) { - return false; + return testing::AssertionFailure() + << "PlaceFocusOnElement() failed in " << FROM_HERE.ToString(); + } + if (test_delegate()->Wait()) { + return testing::AssertionSuccess(); } gfx::Rect rect; if (!captured_sites_test_utils::TestRecipeReplayer:: GetBoundingRectOfTargetElement(target_element_xpath, iframe_path, frame, &rect)) { - return false; + return testing::AssertionFailure() + << "GetBoundingRectOfTargetElement() failed in " + << FROM_HERE.ToString(); } test_delegate()->SetExpectations({ObservedUiEvents::kSuggestionShown}, kAutofillWaitForActionInterval); if (!captured_sites_test_utils::TestRecipeReplayer:: SimulateLeftMouseClickAt(rect.CenterPoint(), frame)) - return false; + return testing::AssertionFailure() + << "SimulateLeftMouseClickAt() failed in " << FROM_HERE.ToString(); return test_delegate()->Wait(); }
diff --git a/chrome/browser/autofill/autofill_image_fetcher_impl.cc b/chrome/browser/autofill/autofill_image_fetcher_impl.cc index 4fbda19..886d89e 100644 --- a/chrome/browser/autofill/autofill_image_fetcher_impl.cc +++ b/chrome/browser/autofill/autofill_image_fetcher_impl.cc
@@ -104,12 +104,18 @@ auto credit_card_art_image = std::make_unique<CreditCardArtImage>(card_art_url, gfx::Image()); if (!card_art_image.IsEmpty()) { - credit_card_art_image->card_art_image = - base::FeatureList::IsEnabled( - features::kAutofillEnableNewCardArtAndNetworkImages) - ? gfx::Image(gfx::ImageSkiaOperations::CreateImageWithRoundRectClip( - kCardArtImageRadius, card_art_image.AsImageSkia())) - : AutofillImageFetcherImpl::ApplyGreyOverlay(card_art_image); + if (base::FeatureList::IsEnabled( + features::kAutofillEnableNewCardArtAndNetworkImages)) { + credit_card_art_image->card_art_image = + gfx::Image(gfx::ImageSkiaOperations::CreateImageWithRoundRectClip( + kCardArtImageRadius, + gfx::ImageSkiaOperations::CreateResizedImage( + card_art_image.AsImageSkia(), + skia::ImageOperations::RESIZE_BEST, gfx::Size(40, 24)))); + } else { + credit_card_art_image->card_art_image = + AutofillImageFetcherImpl::ApplyGreyOverlay(card_art_image); + } } std::move(barrier_callback).Run(std::move(credit_card_art_image)); @@ -156,10 +162,11 @@ // A FIFE image fetching param suffix is appended to the URL. The image // should be center cropped and of Size(32, 20) unless the // kAutofillEnableNewCardArtAndNetworkImages feature is enabled, in which - // case the image is of Size(40, 24). + // case we take the image at its raw size and resize it to Size(40, 24) + // later. url = base::FeatureList::IsEnabled( features::kAutofillEnableNewCardArtAndNetworkImages) - ? GURL(card_art_url.spec() + "=w40-h24-n") + ? card_art_url : GURL(card_art_url.spec() + "=w32-h20-n"); }
diff --git a/chrome/browser/autofill/autofill_interactive_uitest.cc b/chrome/browser/autofill/autofill_interactive_uitest.cc index 9a9e5280..2539cae 100644 --- a/chrome/browser/autofill/autofill_interactive_uitest.cc +++ b/chrome/browser/autofill/autofill_interactive_uitest.cc
@@ -515,17 +515,21 @@ if (!IsFocusedField(e, rfh)) return a << "Field " << *e << " must be focused. "; if (!ShouldAutoselectFirstSuggestionOnArrowDown()) { - if (!ArrowDown({kSuggest})) { - a << "Cannot trigger suggestions by first arrow. "; + if (AssertionResult b = ArrowDown({kSuggest}); !b) { + a << "Cannot trigger suggestions by first arrow: " << b; continue; } - if (!(has_preview ? ArrowDown({kPreview}) : ArrowDown({}))) { - a << "Cannot select first suggestion by second arrow. "; + if (AssertionResult b = + has_preview ? ArrowDown({kPreview}) : ArrowDown({}); + !b) { + a << "Cannot select first suggestion by second arrow: " << b; continue; } - } else if (!(has_preview ? ArrowDown({kSuggest, kPreview}) - : ArrowDown({kSuggest}))) { - a << "Cannot trigger and select first suggestion by arrow. "; + } else if (AssertionResult b = has_preview + ? ArrowDown({kSuggest, kPreview}) + : ArrowDown({kSuggest}); + !b) { + a << "Cannot trigger and select first suggestion by arrow: " << b; continue; } } else if (p.show_method.character) { @@ -533,17 +537,20 @@ // If necessary, delete past iterations character first. if (!IsFocusedField(e, rfh)) return a << "Field " << *e << " must be focused. "; - if (i > 1 && !Backspace()) - a << "Cannot undo past iteration's key. "; + if (i > 1) { + if (AssertionResult b = Backspace(); !b) { + a << "Cannot undo past iteration's key: " << b; + } + } std::string code = std::string("Key") + p.show_method.character; - if (!Char(code, {kSuggest})) { - a << "Cannot trigger suggestions by key. "; + if (AssertionResult b = Char(code, {kSuggest}); !b) { + a << "Cannot trigger suggestions by key: " << b; continue; } } else if (p.show_method.click) { // Click item to open the popup, but do not select an option. - if (!Click({kSuggest})) { - a << "Cannot trigger and select first suggestion by click. "; + if (AssertionResult b = Click({kSuggest}); !b) { + a << "Cannot trigger and select first suggestion by click: " << b; continue; } } @@ -1684,10 +1691,10 @@ // Change the last name. ASSERT_TRUE(FocusField(GetElementById("lastname"), GetWebContents())); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); EXPECT_THAT(GetFormValues(), ValuesAre(MergeValue(kDefaultAddress, {"lastname", "Wadda"}))); @@ -1718,10 +1725,10 @@ // Change the last name. ASSERT_TRUE(FocusField(GetElementById("lastname"), GetWebContents())); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); EXPECT_THAT(GetFormValues(), ValuesAre(MergeValue(kDefaultAddress, {"lastname", "Wadda"}))); @@ -1751,10 +1758,10 @@ // Change the last name. ASSERT_TRUE(FocusField(GetElementById("lastname"), GetWebContents())); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); - SendKeyToPageAndWait(ui::DomKey::BACKSPACE, - {ObservedUiEvents::kSuggestionShown}); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); + ASSERT_TRUE(SendKeyToPageAndWait(ui::DomKey::BACKSPACE, + {ObservedUiEvents::kSuggestionShown})); EXPECT_THAT(GetFormValues(), ValuesAre(MergeValue(kDefaultAddress, {"lastname", "Wadda"}))); @@ -4066,7 +4073,7 @@ sm_.ExpectSpeechPattern("Region"); // Wait for suggestions popup to show up. This needs to happen before we // simulate the cursor down key press. - sm_.Call([this]() { test_delegate()->Wait(); }); + sm_.Call([this]() { ASSERT_TRUE(test_delegate()->Wait()); }); sm_.Call([this]() { test_delegate()->SetExpectations({ObservedUiEvents::kPreviewFormData}); ASSERT_TRUE( @@ -4077,7 +4084,7 @@ sm_.ExpectSpeechPattern("Milton 4120 Freidrich Lane"); sm_.ExpectSpeechPattern("List item"); sm_.ExpectSpeechPattern("1 of 2"); - sm_.Call([this]() { test_delegate()->Wait(); }); + sm_.Call([this]() { ASSERT_TRUE(test_delegate()->Wait()); }); sm_.Replay(); }
diff --git a/chrome/browser/autofill/autofill_uitest.cc b/chrome/browser/autofill/autofill_uitest.cc index 8cd7fc2..7af33b9a 100644 --- a/chrome/browser/autofill/autofill_uitest.cc +++ b/chrome/browser/autofill/autofill_uitest.cc
@@ -111,12 +111,13 @@ void BrowserAutofillManagerTestDelegateImpl::SetExpectations( std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout) { - event_waiter_ = - std::make_unique<EventWaiter<ObservedUiEvents>>(expected_events, timeout); + base::TimeDelta timeout, + base::Location location) { + event_waiter_ = std::make_unique<EventWaiter<ObservedUiEvents>>( + expected_events, timeout, location); } -bool BrowserAutofillManagerTestDelegateImpl::Wait() { +testing::AssertionResult BrowserAutofillManagerTestDelegateImpl::Wait() { return event_waiter_->Wait(); } @@ -164,23 +165,26 @@ InProcessBrowserTest::TearDownOnMainThread(); } -bool AutofillUiTest::SendKeyToPageAndWait( +testing::AssertionResult AutofillUiTest::SendKeyToPageAndWait( ui::DomKey key, std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout) { + base::TimeDelta timeout, + base::Location location) { ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); return SendKeyToPageAndWait(key, code, key_code, std::move(expected_events), - timeout); + timeout, location); } -bool AutofillUiTest::SendKeyToPageAndWait( +testing::AssertionResult AutofillUiTest::SendKeyToPageAndWait( ui::DomKey key, ui::DomCode code, ui::KeyboardCode key_code, std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout) { - test_delegate()->SetExpectations(std::move(expected_events), timeout); + base::TimeDelta timeout, + base::Location location) { + test_delegate()->SetExpectations(std::move(expected_events), timeout, + location); content::SimulateKeyPress(GetWebContents(), key, code, key_code, false, false, false, false); return test_delegate()->Wait(); @@ -207,25 +211,27 @@ widget->RemoveKeyPressEventCallback(key_press_event_sink_); } -bool AutofillUiTest::SendKeyToPopupAndWait( +testing::AssertionResult AutofillUiTest::SendKeyToPopupAndWait( ui::DomKey key, std::list<ObservedUiEvents> expected_events, content::RenderWidgetHost* widget, - base::TimeDelta timeout) { + base::TimeDelta timeout, + base::Location location) { ui::KeyboardCode key_code = ui::NonPrintableDomKeyToKeyboardCode(key); ui::DomCode code = ui::UsLayoutKeyboardCodeToDomCode(key_code); return SendKeyToPopupAndWait( key, code, key_code, std::move(expected_events), - widget ? widget : GetRenderViewHost()->GetWidget(), timeout); + widget ? widget : GetRenderViewHost()->GetWidget(), timeout, location); } -bool AutofillUiTest::SendKeyToPopupAndWait( +testing::AssertionResult AutofillUiTest::SendKeyToPopupAndWait( ui::DomKey key, ui::DomCode code, ui::KeyboardCode key_code, std::list<ObservedUiEvents> expected_events, content::RenderWidgetHost* widget, - base::TimeDelta timeout) { + base::TimeDelta timeout, + base::Location location) { // Route popup-targeted key presses via the render view host. content::NativeWebKeyboardEvent event( blink::WebKeyboardEvent::Type::kRawKeyDown, @@ -233,18 +239,21 @@ event.windows_key_code = key_code; event.dom_code = static_cast<int>(code); event.dom_key = key; - test_delegate()->SetExpectations(std::move(expected_events), timeout); + test_delegate()->SetExpectations(std::move(expected_events), timeout, + location); // Install the key press event sink to ensure that any events that are not // handled by the installed callbacks do not end up crashing the test. widget->AddKeyPressEventCallback(key_press_event_sink_); widget->ForwardKeyboardEvent(event); - bool result = test_delegate()->Wait(); + testing::AssertionResult result = test_delegate()->Wait(); widget->RemoveKeyPressEventCallback(key_press_event_sink_); return result; } -void AutofillUiTest::DoNothingAndWait(base::TimeDelta timeout) { - test_delegate()->SetExpectations({ObservedUiEvents::kNoEvent}, timeout); +void AutofillUiTest::DoNothingAndWait(base::TimeDelta timeout, + base::Location location) { + test_delegate()->SetExpectations({ObservedUiEvents::kNoEvent}, timeout, + location); ASSERT_FALSE(test_delegate()->Wait()); }
diff --git a/chrome/browser/autofill/autofill_uitest.h b/chrome/browser/autofill/autofill_uitest.h index 5fe4c414..5e44ac00 100644 --- a/chrome/browser/autofill/autofill_uitest.h +++ b/chrome/browser/autofill/autofill_uitest.h
@@ -9,6 +9,7 @@ #include <memory> #include <ostream> +#include "base/location.h" #include "base/memory/raw_ptr.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" @@ -68,8 +69,9 @@ void OnTextFieldChanged() override; void SetExpectations(std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout = base::Seconds(0)); - bool Wait(); + base::TimeDelta timeout = base::Seconds(0), + base::Location location = FROM_HERE); + [[nodiscard]] testing::AssertionResult Wait(); private: void FireEvent(ObservedUiEvents event); @@ -94,28 +96,36 @@ void SetUpOnMainThread() override; void TearDownOnMainThread() override; - bool SendKeyToPageAndWait(ui::DomKey key, - std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout = {}); - bool SendKeyToPageAndWait(ui::DomKey key, - ui::DomCode code, - ui::KeyboardCode key_code, - std::list<ObservedUiEvents> expected_events, - base::TimeDelta timeout = {}); + [[nodiscard]] testing::AssertionResult SendKeyToPageAndWait( + ui::DomKey key, + std::list<ObservedUiEvents> expected_events, + base::TimeDelta timeout = {}, + base::Location location = FROM_HERE); + [[nodiscard]] testing::AssertionResult SendKeyToPageAndWait( + ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code, + std::list<ObservedUiEvents> expected_events, + base::TimeDelta timeout = {}, + base::Location location = FROM_HERE); void SendKeyToPopup(content::RenderFrameHost* render_frame_host, const ui::DomKey key); // Send key to the render host view's widget if |widget| is null. - bool SendKeyToPopupAndWait(ui::DomKey key, - std::list<ObservedUiEvents> expected_events, - content::RenderWidgetHost* widget = nullptr, - base::TimeDelta timeout = {}); - bool SendKeyToPopupAndWait(ui::DomKey key, - ui::DomCode code, - ui::KeyboardCode key_code, - std::list<ObservedUiEvents> expected_events, - content::RenderWidgetHost* widget, - base::TimeDelta timeout = {}); + [[nodiscard]] testing::AssertionResult SendKeyToPopupAndWait( + ui::DomKey key, + std::list<ObservedUiEvents> expected_events, + content::RenderWidgetHost* widget = nullptr, + base::TimeDelta timeout = {}, + base::Location location = FROM_HERE); + [[nodiscard]] testing::AssertionResult SendKeyToPopupAndWait( + ui::DomKey key, + ui::DomCode code, + ui::KeyboardCode key_code, + std::list<ObservedUiEvents> expected_events, + content::RenderWidgetHost* widget, + base::TimeDelta timeout = {}, + base::Location location = FROM_HERE); void SendKeyToDataListPopup(ui::DomKey key); void SendKeyToDataListPopup(ui::DomKey key, @@ -127,7 +137,8 @@ // DoNothingAndWait() violates an assertion if during the time an event // happens. Delayed events during DoNothingAndWait() may therefore cause // flakiness. DoNothingAndWaitAndIgnoreEvents() ignores any events. - void DoNothingAndWait(base::TimeDelta timeout); + void DoNothingAndWait(base::TimeDelta timeout, + base::Location location = FROM_HERE); void DoNothingAndWaitAndIgnoreEvents(base::TimeDelta timeout); content::WebContents* GetWebContents();
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc index b88fac7..0c3e09f 100644 --- a/chrome/browser/bookmarks/android/bookmark_bridge.cc +++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -475,7 +475,7 @@ const BookmarkNode* node = GetNodeByID(id, type); DCHECK(node) << "Bookmark with id " << id << " doesn't exist."; return base::android::ConvertUTF8ToJavaString( - env, node->guid().AsLowercaseString()); + env, node->uuid().AsLowercaseString()); } jint BookmarkBridge::GetChildCount(JNIEnv* env,
diff --git a/chrome/browser/browser_process_platform_part_ash.cc b/chrome/browser/browser_process_platform_part_ash.cc index cb4d119f..e77ed6f 100644 --- a/chrome/browser/browser_process_platform_part_ash.cc +++ b/chrome/browser/browser_process_platform_part_ash.cc
@@ -101,11 +101,22 @@ void BrowserProcessPlatformPart::InitializeChromeUserManager() { DCHECK(!chrome_user_manager_); chrome_user_manager_ = ash::ChromeUserManagerImpl::CreateChromeUserManager(); + // DeviceCloudPolicyManager outlives UserManager, so on its initialization, + // there's no way to start observing UserManager. This is the earliest timing + // to do so. + if (auto* policy_manager = + browser_policy_connector_ash()->GetDeviceCloudPolicyManager()) { + policy_manager->OnUserManagerCreated(chrome_user_manager_.get()); + } chrome_user_manager_->Initialize(); } void BrowserProcessPlatformPart::DestroyChromeUserManager() { chrome_user_manager_->Destroy(); + if (auto* policy_manager = + browser_policy_connector_ash()->GetDeviceCloudPolicyManager()) { + policy_manager->OnUserManagerWillBeDestroyed(chrome_user_manager_.get()); + } chrome_user_manager_.reset(); }
diff --git a/chrome/browser/companion/core/companion_url_builder.cc b/chrome/browser/companion/core/companion_url_builder.cc index fc4c1fd..b29c0ae 100644 --- a/chrome/browser/companion/core/companion_url_builder.cc +++ b/chrome/browser/companion/core/companion_url_builder.cc
@@ -86,8 +86,8 @@ pref_service_->GetInteger(kSigninPromoDeclinedCountPref)); promo_state->set_msbb_promo_denial_count( pref_service_->GetInteger(kMsbbPromoDeclinedCountPref)); - promo_state->set_labs_promo_denial_count( - pref_service_->GetInteger(kLabsPromoDeclinedCountPref)); + promo_state->set_exps_promo_denial_count( + pref_service_->GetInteger(kExpsPromoDeclinedCountPref)); GURL url_with_query_params = GetHomepageURLForCompanion(); std::string base64_encoded_proto;
diff --git a/chrome/browser/companion/core/companion_url_builder_unittest.cc b/chrome/browser/companion/core/companion_url_builder_unittest.cc index 2b206d1..c561687f 100644 --- a/chrome/browser/companion/core/companion_url_builder_unittest.cc +++ b/chrome/browser/companion/core/companion_url_builder_unittest.cc
@@ -143,7 +143,7 @@ EXPECT_TRUE(proto.has_promo_state()); EXPECT_EQ(1, proto.promo_state().signin_promo_denial_count()); EXPECT_EQ(0, proto.promo_state().msbb_promo_denial_count()); - EXPECT_EQ(0, proto.promo_state().labs_promo_denial_count()); + EXPECT_EQ(0, proto.promo_state().exps_promo_denial_count()); } TEST_F(CompanionUrlBuilderTest, NonProtobufParams) {
diff --git a/chrome/browser/companion/core/constants.h b/chrome/browser/companion/core/constants.h index d230cd5a..6ee0a55 100644 --- a/chrome/browser/companion/core/constants.h +++ b/chrome/browser/companion/core/constants.h
@@ -12,8 +12,8 @@ "Companion.Promo.MSBB.Declined.Count"; const char kSigninPromoDeclinedCountPref[] = "Companion.Promo.Signin.Declined.Count"; -const char kLabsPromoDeclinedCountPref[] = - "Companion.Promo.Labs.Declined.Count"; +const char kExpsPromoDeclinedCountPref[] = + "Companion.Promo.Exps.Declined.Count"; } // namespace companion
diff --git a/chrome/browser/companion/core/mojom/companion.mojom b/chrome/browser/companion/core/mojom/companion.mojom index d8e0908d..2aca54f 100644 --- a/chrome/browser/companion/core/mojom/companion.mojom +++ b/chrome/browser/companion/core/mojom/companion.mojom
@@ -27,8 +27,8 @@ // Promo to turn on make searches and browsing better. kMsbb = 2, - // Promo to opt into labs api. - kLabs = 3, + // Promo to opt into experience api. + kExps = 3, }; // User actions taken on a promo.
diff --git a/chrome/browser/companion/core/promo_handler.cc b/chrome/browser/companion/core/promo_handler.cc index 23650c9..9e86aea 100644 --- a/chrome/browser/companion/core/promo_handler.cc +++ b/chrome/browser/companion/core/promo_handler.cc
@@ -26,7 +26,7 @@ void PromoHandler::RegisterProfilePrefs(PrefRegistrySimple* registry) { registry->RegisterIntegerPref(kMsbbPromoDeclinedCountPref, 0); registry->RegisterIntegerPref(kSigninPromoDeclinedCountPref, 0); - registry->RegisterIntegerPref(kLabsPromoDeclinedCountPref, 0); + registry->RegisterIntegerPref(kExpsPromoDeclinedCountPref, 0); } void PromoHandler::OnPromoAction(PromoType promo_type, @@ -35,8 +35,8 @@ OnSigninPromo(promo_action); } else if (promo_type == PromoType::kMsbb) { OnMsbbPromo(promo_action); - } else if (promo_type == PromoType::kLabs) { - OnLabsPromo(promo_action); + } else if (promo_type == PromoType::kExps) { + OnExpsPromo(promo_action); } } @@ -61,9 +61,9 @@ } } -void PromoHandler::OnLabsPromo(PromoAction promo_action) { +void PromoHandler::OnExpsPromo(PromoAction promo_action) { if (promo_action == PromoAction::kRejected) { - IncrementPref(kLabsPromoDeclinedCountPref); + IncrementPref(kExpsPromoDeclinedCountPref); } else if (promo_action == PromoAction::kAccepted) { // TODO(b/272954072): Nothing to do. Just collect metrics. }
diff --git a/chrome/browser/companion/core/promo_handler.h b/chrome/browser/companion/core/promo_handler.h index c877268d..a9b9dc68 100644 --- a/chrome/browser/companion/core/promo_handler.h +++ b/chrome/browser/companion/core/promo_handler.h
@@ -46,7 +46,7 @@ private: void OnSigninPromo(PromoAction promo_action); void OnMsbbPromo(PromoAction promo_action); - void OnLabsPromo(PromoAction promo_action); + void OnExpsPromo(PromoAction promo_action); void IncrementPref(const std::string& pref_name); // Lifetime of the PrefService is bound to profile which outlives the lifetime
diff --git a/chrome/browser/companion/core/promo_handler_unittest.cc b/chrome/browser/companion/core/promo_handler_unittest.cc index 0bf38d3d..35dc71ad 100644 --- a/chrome/browser/companion/core/promo_handler_unittest.cc +++ b/chrome/browser/companion/core/promo_handler_unittest.cc
@@ -64,11 +64,11 @@ promo_handler_->OnPromoAction(PromoType::kSignin, PromoAction::kAccepted); } -TEST_F(PromoHandlerTest, LabsPromo) { - promo_handler_->OnPromoAction(PromoType::kLabs, PromoAction::kRejected); - EXPECT_EQ(1, pref_service_.GetInteger(kLabsPromoDeclinedCountPref)); +TEST_F(PromoHandlerTest, ExpsPromo) { + promo_handler_->OnPromoAction(PromoType::kExps, PromoAction::kRejected); + EXPECT_EQ(1, pref_service_.GetInteger(kExpsPromoDeclinedCountPref)); - promo_handler_->OnPromoAction(PromoType::kLabs, PromoAction::kAccepted); + promo_handler_->OnPromoAction(PromoType::kExps, PromoAction::kAccepted); // TODO(b/272954072): Add test. }
diff --git a/chrome/browser/companion/core/proto/companion_url_params.proto b/chrome/browser/companion/core/proto/companion_url_params.proto index 03c388d5b..765b406a 100644 --- a/chrome/browser/companion/core/proto/companion_url_params.proto +++ b/chrome/browser/companion/core/proto/companion_url_params.proto
@@ -17,7 +17,7 @@ // Number of times the user has denied various promo requests in past. int32 signin_promo_denial_count = 1; int32 msbb_promo_denial_count = 2; - int32 labs_promo_denial_count = 3; + int32 exps_promo_denial_count = 3; } // This proto file is shared between Chrome and Server side and used to pack the
diff --git a/chrome/browser/device_reauth/android/device_authenticator_android.cc b/chrome/browser/device_reauth/android/device_authenticator_android.cc index ae9d1501..39341f35 100644 --- a/chrome/browser/device_reauth/android/device_authenticator_android.cc +++ b/chrome/browser/device_reauth/android/device_authenticator_android.cc
@@ -70,6 +70,7 @@ case device_reauth::DeviceAuthRequester::kIncognitoReauthPage: // kPasswordsInSettings flag is used only for desktop. case device_reauth::DeviceAuthRequester::kPasswordsInSettings: + case device_reauth::DeviceAuthRequester::kLocalCardAutofill: return false; } }
diff --git a/chrome/browser/device_reauth/chrome_device_authenticator_factory.h b/chrome/browser/device_reauth/chrome_device_authenticator_factory.h index 13a35d22..9decfc38 100644 --- a/chrome/browser/device_reauth/chrome_device_authenticator_factory.h +++ b/chrome/browser/device_reauth/chrome_device_authenticator_factory.h
@@ -22,7 +22,7 @@ // Get or create an instance of the DeviceAuthenticator. Trying to use this // API on platforms that do not provide an implementation will result in a - // link error. So far only Android provides an implementation. + // link error. // TODO(crbug.com/1349717): Change way of obtaining DeviceAuthenticator // from factory. static scoped_refptr<device_reauth::DeviceAuthenticator>
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index a4db182d..90a27564 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -17,6 +17,7 @@ #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_event_router_factory.h" #include "chrome/browser/password_manager/account_password_store_factory.h" @@ -25,14 +26,19 @@ #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/platform_util.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/sync/sync_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/browser/ui/browser_window.h" +#include "chrome/browser/ui/web_applications/app_browser_controller.h" #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h" +#include "chrome/browser/web_applications/web_app_id_constants.h" #include "chrome/browser/web_applications/web_app_install_params.h" +#include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/extensions/api/passwords_private.h" #include "chrome/grit/generated_resources.h" #include "chromeos/constants/chromeos_features.h" @@ -235,6 +241,22 @@ #endif +void MaybeShowProfileSwitchIPH(Profile* profile) { +#if !BUILDFLAG(IS_CHROMEOS) + Browser* launched_app = web_app::AppBrowserController::FindForWebApp( + *profile, web_app::kPasswordManagerAppId); + + ProfileManager* profile_manager = g_browser_process->profile_manager(); + // Try to show promo only if there is profile menu button and there are + // multiple profiles. + if (launched_app && launched_app->app_controller() && + launched_app->app_controller()->HasProfileMenuButton() && + profile_manager && profile_manager->GetNumberOfProfiles() > 1) { + launched_app->window()->MaybeShowProfileSwitchIPH(); + } +#endif +} + } // namespace namespace extensions { @@ -276,10 +298,16 @@ weak_ptr_factory_.GetWeakPtr())); saved_passwords_presenter_.AddObserver(this); saved_passwords_presenter_.Init(); + +#if !BUILDFLAG(IS_CHROMEOS) + auto* provider = web_app::WebAppProvider::GetForWebApps(profile); + install_manager_observation_.Observe(&provider->install_manager()); +#endif } PasswordsPrivateDelegateImpl::~PasswordsPrivateDelegateImpl() { saved_passwords_presenter_.RemoveObserver(this); + install_manager_observation_.Reset(); } void PasswordsPrivateDelegateImpl::GetSavedPasswordsList( @@ -903,6 +931,22 @@ SetCredentials(saved_passwords_presenter_.GetSavedCredentials()); } +void PasswordsPrivateDelegateImpl::OnWebAppInstalledWithOsHooks( + const web_app::AppId& app_id) { + if (app_id != web_app::kPasswordManagerAppId) { + return; + } + // Post task with delay because new browser window for an app isn't created + // yet. + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, base::BindOnce(&MaybeShowProfileSwitchIPH, profile_), + base::Seconds(1)); +} + +void PasswordsPrivateDelegateImpl::OnWebAppInstallManagerDestroyed() { + install_manager_observation_.Reset(); +} + void PasswordsPrivateDelegateImpl::InitializeIfNecessary() { if (is_initialized_ || !current_entries_initialized_) return;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h index 035f0d7..189ee6fe 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -20,6 +20,7 @@ #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_utils.h" #include "chrome/browser/ui/passwords/settings/password_manager_porter.h" +#include "chrome/browser/web_applications/web_app_install_manager_observer.h" #include "chrome/common/extensions/api/passwords_private.h" #include "components/device_reauth/device_authenticator.h" #include "components/keyed_service/core/keyed_service.h" @@ -39,12 +40,17 @@ class WebContents; } +namespace web_app { +class WebAppInstallManager; +} + namespace extensions { // Concrete PasswordsPrivateDelegate implementation. class PasswordsPrivateDelegateImpl : public PasswordsPrivateDelegate, - public password_manager::SavedPasswordsPresenter::Observer { + public password_manager::SavedPasswordsPresenter::Observer, + public web_app::WebAppInstallManagerObserver { public: explicit PasswordsPrivateDelegateImpl(Profile* profile); @@ -146,6 +152,10 @@ // password_manager::SavedPasswordsPresenter::Observer implementation. void OnSavedPasswordsChanged() override; + // web_app::WebAppInstallManagerObserver implementation. + void OnWebAppInstalledWithOsHooks(const web_app::AppId& app_id) override; + void OnWebAppInstallManagerDestroyed() override; + // Called after the lists are fetched. Once both lists have been set, the // class is considered initialized and any queued functions (which could // not be executed immediately due to uninitialized data) are invoked. @@ -261,6 +271,10 @@ // Device authenticator used to authenticate users in settings. scoped_refptr<device_reauth::DeviceAuthenticator> device_authenticator_; + base::ScopedObservation<web_app::WebAppInstallManager, + web_app::WebAppInstallManagerObserver> + install_manager_observation_{this}; + base::WeakPtrFactory<PasswordsPrivateDelegateImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index 154e6c1..b71a69e 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -264,6 +264,8 @@ (*s_allowlist)[drive::prefs::kDriveFsBulkPinningEnabled] = settings_api::PrefType::PREF_TYPE_BOOLEAN; #endif + (*s_allowlist)[::prefs::kDownloadBubblePartialViewEnabled] = + settings_api::PrefType::PREF_TYPE_BOOLEAN; // Miscellaneous. TODO(stevenjb): categorize. (*s_allowlist)[::prefs::kEnableDoNotTrack] =
diff --git a/chrome/browser/fast_checkout/fast_checkout_client.cc b/chrome/browser/fast_checkout/fast_checkout_client.cc deleted file mode 100644 index db05025..0000000 --- a/chrome/browser/fast_checkout/fast_checkout_client.cc +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/fast_checkout/fast_checkout_client.h" - -#include "chrome/browser/fast_checkout/fast_checkout_client_impl.h" - -// static -FastCheckoutClient* FastCheckoutClient::GetOrCreateForWebContents( - content::WebContents* web_contents) { - FastCheckoutClientImpl::CreateForWebContents(web_contents); - return FastCheckoutClientImpl::FromWebContents(web_contents); -}
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc index 9add07e..06aed59 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.cc
@@ -104,15 +104,15 @@ } } // namespace +// No virtual functions of `client` must be called in the constructor. FastCheckoutClientImpl::FastCheckoutClientImpl( - content::WebContents* web_contents) - : content::WebContentsUserData<FastCheckoutClientImpl>(*web_contents), - autofill_client_( - autofill::ContentAutofillClient::FromWebContents(web_contents)), + autofill::ContentAutofillClient* client) + : autofill_client_(client), fetcher_(FastCheckoutCapabilitiesFetcherFactory::GetForBrowserContext( - web_contents->GetBrowserContext())), + client->GetWebContents().GetBrowserContext())), personal_data_helper_( - std::make_unique<FastCheckoutPersonalDataHelperImpl>(web_contents)), + std::make_unique<FastCheckoutPersonalDataHelperImpl>( + &client->GetWebContents())), trigger_validator_(std::make_unique<FastCheckoutTriggerValidatorImpl>( autofill_client_, fetcher_, @@ -173,7 +173,9 @@ void FastCheckoutClientImpl::OnRunComplete(FastCheckoutRunOutcome run_outcome, bool allow_further_runs) { ukm::builders::Autofill_FastCheckoutRunOutcome run_outcome_builder( - GetWebContents().GetPrimaryMainFrame()->GetPageUkmSourceId()); + autofill_client_->GetWebContents() + .GetPrimaryMainFrame() + ->GetPageUkmSourceId()); run_outcome_builder.SetRunOutcome(static_cast<int64_t>(run_outcome)); run_outcome_builder.SetRunId(run_id_); run_outcome_builder.Record(ukm::UkmRecorder::Get()); @@ -189,7 +191,9 @@ } } ukm::builders::Autofill_FastCheckoutFormStatus form_status_builder( - GetWebContents().GetPrimaryMainFrame()->GetPageUkmSourceId()); + autofill_client_->GetWebContents() + .GetPrimaryMainFrame() + ->GetPageUkmSourceId()); form_status_builder.SetFilled(filling_state == FillingState::kFilled); form_status_builder.SetFormSignature( autofill::HashFormSignature(form_signature)); @@ -248,7 +252,8 @@ std::unique_ptr<FastCheckoutController> FastCheckoutClientImpl::CreateFastCheckoutController() { - return std::make_unique<FastCheckoutControllerImpl>(&GetWebContents(), this); + return std::make_unique<FastCheckoutControllerImpl>( + &autofill_client_->GetWebContents(), this); } void FastCheckoutClientImpl::OnHidden() { @@ -571,7 +576,7 @@ void FastCheckoutClientImpl::OnAutofillManagerDestroyed( autofill::AutofillManager& manager) { if (IsRunning()) { - if (GetWebContents().IsBeingDestroyed()) { + if (autofill_client_->GetWebContents().IsBeingDestroyed()) { OnRunComplete(FastCheckoutRunOutcome::kTabClosed); } else { OnRunComplete(FastCheckoutRunOutcome::kAutofillManagerDestroyed);
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl.h b/chrome/browser/fast_checkout/fast_checkout_client_impl.h index c912b4b..6ed535f 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl.h +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl.h
@@ -9,14 +9,15 @@ #include "base/scoped_observation.h" #include "chrome/browser/fast_checkout/fast_checkout_accessibility_service.h" #include "chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher.h" -#include "chrome/browser/fast_checkout/fast_checkout_client.h" #include "chrome/browser/fast_checkout/fast_checkout_enums.h" #include "chrome/browser/fast_checkout/fast_checkout_personal_data_helper.h" #include "chrome/browser/fast_checkout/fast_checkout_trigger_validator.h" #include "chrome/browser/ui/fast_checkout/fast_checkout_controller_impl.h" +#include "components/autofill/content/browser/content_autofill_client.h" #include "components/autofill/core/browser/data_model/autofill_profile.h" #include "components/autofill/core/browser/payments/full_card_request.h" #include "components/autofill/core/browser/personal_data_manager.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_user_data.h" #include "url/gurl.h" @@ -26,13 +27,13 @@ } class FastCheckoutClientImpl - : public content::WebContentsUserData<FastCheckoutClientImpl>, - public FastCheckoutClient, + : public FastCheckoutClient, public FastCheckoutControllerImpl::Delegate, public autofill::PersonalDataManagerObserver, public autofill::AutofillManager::Observer, public autofill::payments::FullCardRequest::ResultDelegate { public: + explicit FastCheckoutClientImpl(autofill::ContentAutofillClient* client); ~FastCheckoutClientImpl() override; FastCheckoutClientImpl(const FastCheckoutClientImpl&) = delete; @@ -95,14 +96,11 @@ }; protected: - explicit FastCheckoutClientImpl(content::WebContents* web_contents); - // Creates the UI controller. virtual std::unique_ptr<FastCheckoutController> CreateFastCheckoutController(); private: - friend class content::WebContentsUserData<FastCheckoutClientImpl>; friend class FastCheckoutClientImplTest; FRIEND_TEST_ALL_PREFIXES( FastCheckoutClientImplTest, @@ -220,7 +218,7 @@ base::OneShotTimer timeout_timer_; // The `ChromeAutofillClient` instance attached to the same `WebContents`. - raw_ptr<autofill::AutofillClient> autofill_client_ = nullptr; + raw_ptr<autofill::ContentAutofillClient> autofill_client_ = nullptr; // The `AutofillManager` instance invoking the fast checkout run. Note that // `this` class generally outlives `AutofillManager`.
diff --git a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc index a1a1844..f0e5c6a 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc +++ b/chrome/browser/fast_checkout/fast_checkout_client_impl_unittest.cc
@@ -152,11 +152,8 @@ class TestFastCheckoutClientImpl : public FastCheckoutClientImpl { public: - static TestFastCheckoutClientImpl* CreateForWebContents( - content::WebContents* web_contents); - - explicit TestFastCheckoutClientImpl(content::WebContents* web_contents) - : FastCheckoutClientImpl(web_contents) {} + explicit TestFastCheckoutClientImpl(autofill::ContentAutofillClient* client) + : FastCheckoutClientImpl(client) {} std::unique_ptr<FastCheckoutController> CreateFastCheckoutController() override { @@ -203,16 +200,6 @@ MOCK_METHOD(void, Announce, (const std::u16string&), (override)); }; -// static -TestFastCheckoutClientImpl* TestFastCheckoutClientImpl::CreateForWebContents( - content::WebContents* web_contents) { - const void* key = WebContentsUserData<FastCheckoutClientImpl>::UserDataKey(); - web_contents->SetUserData( - key, std::make_unique<TestFastCheckoutClientImpl>(web_contents)); - return static_cast<TestFastCheckoutClientImpl*>( - web_contents->GetUserData(key)); -} - class FastCheckoutClientImplTest : public ChromeRenderViewHostTestHarness { public: FastCheckoutClientImplTest() @@ -236,7 +223,7 @@ })); test_client_ = - TestFastCheckoutClientImpl::CreateForWebContents(web_contents()); + std::make_unique<TestFastCheckoutClientImpl>(autofill_client()); // Prepare the FastCheckoutController. auto fast_checkout_controller = @@ -273,7 +260,7 @@ autofill::PersonalDataManagerFactory::GetForProfile(profile())); } - FastCheckoutClientImpl* fast_checkout_client() { return test_client_; } + FastCheckoutClientImpl* fast_checkout_client() { return test_client_.get(); } MockFastCheckoutController* fast_checkout_controller() { return fast_checkout_controller_; @@ -391,8 +378,8 @@ autofill_driver_injector_; autofill::TestAutofillManagerInjector<NiceMock<MockBrowserAutofillManager>> autofill_manager_injector_; + std::unique_ptr<TestFastCheckoutClientImpl> test_client_; raw_ptr<MockFastCheckoutController> fast_checkout_controller_; - raw_ptr<TestFastCheckoutClientImpl> test_client_; raw_ptr<MockFastCheckoutTriggerValidator> validator_; raw_ptr<MockFastCheckoutAccessibilityService> accessibility_service_; }; @@ -411,16 +398,6 @@ return autofill::FormFieldData::DeepEqual(arg, form_data); } -TEST_F( - FastCheckoutClientImplTest, - GetOrCreateForWebContents_ClientWasAlreadyCreated_ReturnsExistingInstance) { - raw_ptr<FastCheckoutClient> client = - FastCheckoutClient::GetOrCreateForWebContents(web_contents()); - - // There is only one client per `WebContents`. - EXPECT_EQ(client, fast_checkout_client()); -} - TEST_F(FastCheckoutClientImplTest, Start_InvalidAutofillManager_NoRun) { // `FastCheckoutClient` is not running initially. EXPECT_FALSE(fast_checkout_client()->IsRunning());
diff --git a/chrome/browser/fast_checkout/fast_checkout_tab_helper.cc b/chrome/browser/fast_checkout/fast_checkout_tab_helper.cc index 4ca44d3..cb5a36f9 100644 --- a/chrome/browser/fast_checkout/fast_checkout_tab_helper.cc +++ b/chrome/browser/fast_checkout/fast_checkout_tab_helper.cc
@@ -43,9 +43,11 @@ } FetchCapabilities(url); - if (FastCheckoutClient* fast_checkout_client = - FastCheckoutClientImpl::FromWebContents(web_contents())) { - fast_checkout_client->OnNavigation(url, IsCartOrCheckoutUrl(url)); + if (autofill::ContentAutofillClient* client = + autofill::ContentAutofillClient::FromWebContents(web_contents())) { + DCHECK(client->GetFastCheckoutClient()); + client->GetFastCheckoutClient()->OnNavigation(url, + IsCartOrCheckoutUrl(url)); } }
diff --git a/chrome/browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc b/chrome/browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc index 48131fa4..6ee0254 100644 --- a/chrome/browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc +++ b/chrome/browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc
@@ -11,11 +11,13 @@ #include "base/run_loop.h" #include "chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_factory.h" #include "chrome/browser/fast_checkout/mock_fast_checkout_capabilities_fetcher.h" -#include "chrome/browser/fast_checkout/mock_fast_checkout_client.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/test/base/android/android_browser_test.h" #include "chrome/test/base/chrome_test_utils.h" +#include "components/autofill/content/browser/test_autofill_client_injector.h" +#include "components/autofill/content/browser/test_content_autofill_client.h" +#include "components/autofill/core/browser/ui/mock_fast_checkout_client.h" #include "content/public/browser/browser_context.h" #include "content/public/test/browser_test.h" #include "net/dns/mock_host_resolver.h" @@ -62,20 +64,20 @@ embedded_test_server()->RegisterRequestHandler( base::BindRepeating(&CreateFakeResponse)); ASSERT_TRUE(embedded_test_server()->Start()); - - auto mock_fast_checkout_client = - std::make_unique<MockFastCheckoutClient>(GetActiveWebContents()); - mock_fast_checkout_client_ = mock_fast_checkout_client.get(); - GetActiveWebContents()->SetUserData( - content::WebContentsUserData<FastCheckoutClientImpl>::UserDataKey(), - std::move(mock_fast_checkout_client)); + mock_fast_checkout_client_ = static_cast<MockFastCheckoutClient*>( + autofill_client().GetFastCheckoutClient()); } protected: MockFastCheckoutCapabilitiesFetcher* fetcher() { return fetcher_; } MockFastCheckoutClient* fast_checkout_client() { - return mock_fast_checkout_client_; + return static_cast<MockFastCheckoutClient*>( + autofill_client().GetFastCheckoutClient()); + } + + autofill::TestContentAutofillClient& autofill_client() { + return *autofill_client_injector_[GetActiveWebContents()]; } content::WebContents* GetActiveWebContents() { @@ -92,6 +94,8 @@ private: raw_ptr<MockFastCheckoutCapabilitiesFetcher> fetcher_ = nullptr; raw_ptr<MockFastCheckoutClient> mock_fast_checkout_client_; + autofill::TestAutofillClientInjector<autofill::TestContentAutofillClient> + autofill_client_injector_; }; IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/browser/fast_checkout/mock_fast_checkout_client.cc b/chrome/browser/fast_checkout/mock_fast_checkout_client.cc deleted file mode 100644 index 1e56003..0000000 --- a/chrome/browser/fast_checkout/mock_fast_checkout_client.cc +++ /dev/null
@@ -1,11 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/fast_checkout/mock_fast_checkout_client.h" - -MockFastCheckoutClient::MockFastCheckoutClient( - content::WebContents* web_contents) - : FastCheckoutClientImpl(web_contents) {} - -MockFastCheckoutClient::~MockFastCheckoutClient() = default;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedActionDelegate.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedActionDelegate.java index bab2f41..9aa845f 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedActionDelegate.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedActionDelegate.java
@@ -56,7 +56,7 @@ * Opens a specific WebFeed by name. * @param webFeedName the relevant web feed name. */ - default void openWebFeed(String webFeedName) {} + default void openWebFeed(String webFeedName, @SingleWebFeedEntryPoint int entryPoint) {} // // Optional methods for handing events.
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java index 466e30b..6efb6b8 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
@@ -55,6 +55,7 @@ import org.chromium.chrome.browser.xsurface.LoggingParameters; import org.chromium.chrome.browser.xsurface.SurfaceActionsHandler; import org.chromium.chrome.browser.xsurface.SurfaceActionsHandler.OpenMode; +import org.chromium.chrome.browser.xsurface.SurfaceActionsHandler.OpenWebFeedEntryPoint; import org.chromium.chrome.browser.xsurface.SurfaceScope; import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; @@ -268,8 +269,26 @@ } @Override - public void openWebFeed(String webFeedName) { - mActionDelegate.openWebFeed(webFeedName); + public void openWebFeed(String webFeedName, @OpenWebFeedEntryPoint int entryPoint) { + @SingleWebFeedEntryPoint + int singleWebFeedEntryPoint; + + switch (entryPoint) { + case OpenWebFeedEntryPoint.ATTRIBUTION: + singleWebFeedEntryPoint = SingleWebFeedEntryPoint.ATTRIBUTION; + break; + case OpenWebFeedEntryPoint.RECOMMENDATION: + singleWebFeedEntryPoint = SingleWebFeedEntryPoint.RECOMMENDATION; + break; + case OpenWebFeedEntryPoint.GROUP_HEADER: + singleWebFeedEntryPoint = SingleWebFeedEntryPoint.GROUP_HEADER; + break; + + default: + singleWebFeedEntryPoint = SingleWebFeedEntryPoint.OTHER; + } + + mActionDelegate.openWebFeed(webFeedName, singleWebFeedEntryPoint); } private void openSuggestionUrl(
diff --git a/chrome/browser/feedback/system_logs/log_sources/device_event_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/device_event_log_source.cc index d384a1f0..f01df1e 100644 --- a/chrome/browser/feedback/system_logs/log_sources/device_event_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/device_event_log_source.cc
@@ -25,10 +25,10 @@ const int kMaxDeviceEventsForAboutSystem = 4000; (*response)[kNetworkEventLogEntry] = device_event_log::GetAsString( device_event_log::OLDEST_FIRST, "unixtime,file,level", "network", - device_event_log::kDefaultLogLevel, kMaxDeviceEventsForAboutSystem); + device_event_log::LOG_LEVEL_EVENT, kMaxDeviceEventsForAboutSystem); (*response)[kDeviceEventLogEntry] = device_event_log::GetAsString( device_event_log::OLDEST_FIRST, "unixtime,file,type,level", "non-network", - device_event_log::LOG_LEVEL_DEBUG, kMaxDeviceEventsForAboutSystem); + device_event_log::LOG_LEVEL_EVENT, kMaxDeviceEventsForAboutSystem); std::move(callback).Run(std::move(response)); }
diff --git a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc index 8a840a1..5360b86 100644 --- a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc +++ b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.cc
@@ -44,15 +44,11 @@ } // namespace PerformanceLogSource::PerformanceLogSource() : SystemLogsSource("Performance") { - memory_saver_available_ = base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable); battery_saver_available_ = base::FeatureList::IsEnabled( performance_manager::features::kBatterySaverModeAvailable); - if (memory_saver_available_ || battery_saver_available_) { - tuning_manager_ = performance_manager::user_tuning:: - UserPerformanceTuningManager::GetInstance(); - } + tuning_manager_ = performance_manager::user_tuning:: + UserPerformanceTuningManager::GetInstance(); } PerformanceLogSource::~PerformanceLogSource() = default; @@ -62,21 +58,18 @@ DCHECK(!callback.is_null()); auto response = std::make_unique<SystemLogsResponse>(); - if (tuning_manager_ != nullptr) { - PopulatePerformanceSettingLogs(response.get()); - PopulateBatteryDetailLogs(response.get()); - } + CHECK(tuning_manager_); + PopulatePerformanceSettingLogs(response.get()); + PopulateBatteryDetailLogs(response.get()); std::move(callback).Run(std::move(response)); } void PerformanceLogSource::PopulatePerformanceSettingLogs( SystemLogsResponse* response) { - if (memory_saver_available_) { - response->emplace( - "high_efficiency_mode_active", - BoolToString(tuning_manager_->IsHighEfficiencyModeActive())); - } + response->emplace( + "high_efficiency_mode_active", + BoolToString(tuning_manager_->IsHighEfficiencyModeActive())); if (battery_saver_available_) { PrefService* local_prefs = g_browser_process->local_state();
diff --git a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.h b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.h index 9e82eb1..664b035 100644 --- a/chrome/browser/feedback/system_logs/log_sources/performance_log_source.h +++ b/chrome/browser/feedback/system_logs/log_sources/performance_log_source.h
@@ -30,7 +30,6 @@ raw_ptr<performance_manager::user_tuning::UserPerformanceTuningManager> tuning_manager_ = nullptr; - bool memory_saver_available_ = false; bool battery_saver_available_ = false; };
diff --git a/chrome/browser/feedback/system_logs/log_sources/performance_log_source_unittest.cc b/chrome/browser/feedback/system_logs/log_sources/performance_log_source_unittest.cc index eeb5ecc..d1c36a0 100644 --- a/chrome/browser/feedback/system_logs/log_sources/performance_log_source_unittest.cc +++ b/chrome/browser/feedback/system_logs/log_sources/performance_log_source_unittest.cc
@@ -62,7 +62,6 @@ feature_list_.InitWithFeaturesAndParameters( { {performance_manager::features::kBatterySaverModeAvailable, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, {}}, }, {}); environment_.SetUp(local_state_);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 9b0eb2dd..5db4139 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -1662,6 +1662,11 @@ "expiry_milestone": 105 }, { + "name": "draw-edge-to-edge", + "owners": ["donnd", "twellington", "edge-to-edge@chromium.org"], + "expiry_milestone": 120 + }, + { "name": "draw-predicted-ink-point", "owners": [ "joalmei@microsoft.com" ], "expiry_milestone": 98 @@ -1767,13 +1772,13 @@ "expiry_milestone": 120 }, { - "name": "enable-accessibility-chromevox-page-migration", - "owners": [ "josiahk", "//ui/accessibility/OWNERS" ], - "expiry_milestone": 130 + "name": "enable-accessibility-ax-modes", + "owners": [ "mschillaci", "aldietz", "//ui/accessibility/OWNERS"], + "expiry_milestone": 140 }, { - "name": "enable-accessibility-form-controls-mode", - "owners": [ "mschillaci", "aldietz", "//ui/accessibility/OWNERS"], + "name": "enable-accessibility-chromevox-page-migration", + "owners": [ "josiahk", "//ui/accessibility/OWNERS" ], "expiry_milestone": 130 }, { @@ -4270,7 +4275,7 @@ { "name": "heavy-ad-privacy-mitigations", "owners": [ "johnidel", "jkarlin" ], - "expiry_milestone": 97 + "expiry_milestone": 123 }, { "name": "help-app-apps-discovery", @@ -5696,6 +5701,11 @@ "expiry_milestone": 120 }, { + "name": "omnibox-tail-suggest", + "owners": [ "christianxu", "stkhapugin", "bling-flags@google.com" ], + "expiry_milestone": 120 + }, + { "name": "omnibox-trending-zero-prefix-suggestions-on-ntp", "owners": [ "ender", "stkhapugin", "mahmadi", "chrome-omnibox-team@google.com" ], "expiry_milestone": 120
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index cd052874..78bc4b2 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -3536,11 +3536,11 @@ #if BUILDFLAG(IS_ANDROID) -const char kAccessibilityFormControlsModeName[] = - "Experimental Accessibility Mode for Form Controls only"; -const char kAccessibilityFormControlsModeDescription[] = - "Enable experimental accessibility mode to support password managers and " - "form fillers when full assistive technology is not running."; +const char kAccessibilityAXModesName[] = "Experimental Accessibility Modes"; +const char kAccessibilityAXModesDescription[] = + "Enable experimental accessibility modes to support different levels of the" + " accessibility engine depending on what accessibility services and" + " assistive technologies are running."; const char kAccessibilityPageZoomName[] = "Accessibility Page Zoom"; const char kAccessibilityPageZoomDescription[] = @@ -3747,6 +3747,10 @@ "Sets the default viewport layout width to be equivalent to " "width=device-width"; +const char kDrawEdgeToEdgeName[] = "DrawEdgeToEdge"; +const char kDrawEdgeToEdgeDescription[] = + "Enables the Android feature Edge-to-Edge to draw below the Nav Bar."; + const char kAutofillManualFallbackAndroidName[] = "Enable Autofill manual fallback for Addresses and Payments (Android)"; const char kAutofillManualFallbackAndroidDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index eb3f9bc..0f0b4b7a 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -2036,8 +2036,8 @@ #if BUILDFLAG(IS_ANDROID) -extern const char kAccessibilityFormControlsModeName[]; -extern const char kAccessibilityFormControlsModeDescription[]; +extern const char kAccessibilityAXModesName[]; +extern const char kAccessibilityAXModesDescription[]; extern const char kAccessibilityPageZoomName[]; extern const char kAccessibilityPageZoomDescription[]; @@ -2156,6 +2156,9 @@ extern const char kDefaultViewportIsDeviceWidthName[]; extern const char kDefaultViewportIsDeviceWidthDescription[]; +extern const char kDrawEdgeToEdgeName[]; +extern const char kDrawEdgeToEdgeDescription[]; + extern const char kAutofillManualFallbackAndroidName[]; extern const char kAutofillManualFallbackAndroidDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index ab4ec3d..6f0aca0 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -236,6 +236,7 @@ &kDeferKeepScreenOnDuringGesture, &kDeferNotifyInMotion, &kDelayTransitionsForAnimation, + &kDrawEdgeToEdge, &kExperimentsForAgsa, &kExploreSites, &kFocusOmniboxInIncognitoTabIntents, @@ -745,6 +746,10 @@ "DownloadHomeForExternalApp", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kDrawEdgeToEdge, + "DrawEdgeToEdge", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kExperimentsForAgsa, "ExperimentsForAgsa", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index da60162..9ae5d39 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -94,6 +94,7 @@ BASE_DECLARE_FEATURE(kDontPrefetchLibraries); BASE_DECLARE_FEATURE(kDownloadAutoResumptionThrottling); BASE_DECLARE_FEATURE(kDownloadHomeForExternalApp); +BASE_DECLARE_FEATURE(kDrawEdgeToEdge); BASE_DECLARE_FEATURE(kExperimentsForAgsa); BASE_DECLARE_FEATURE(kExploreSites); BASE_DECLARE_FEATURE(kFocusOmniboxInIncognitoTabIntents);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 67cc179c..0de5a489 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -305,6 +305,7 @@ public static final String DNS_OVER_HTTPS = "DnsOverHttps"; public static final String DOWNLOAD_OFFLINE_CONTENT_PROVIDER = "UseDownloadOfflineContentProvider"; + public static final String DRAW_EDGE_TO_EDGE = "DrawEdgeToEdge"; public static final String EARLY_LIBRARY_LOAD = "EarlyLibraryLoad"; public static final String ENABLE_IPH = "EnableIPH"; public static final String EXPERIMENTS_FOR_AGSA = "ExperimentsForAgsa";
diff --git a/chrome/browser/google/google_brand.cc b/chrome/browser/google/google_brand.cc index 2693443..0cb88b4 100644 --- a/chrome/browser/google/google_brand.cc +++ b/chrome/browser/google/google_brand.cc
@@ -4,11 +4,12 @@ #include "chrome/browser/google/google_brand.h" -#include <algorithm> #include <string> #include "base/containers/contains.h" +#include "base/containers/fixed_flat_set.h" #include "base/no_destructor.h" +#include "base/ranges/algorithm.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -111,17 +112,17 @@ return true; } - const char* const kOrganicBrands[] = { - "CHCA", "CHCB", "CHCG", "CHCH", "CHCI", "CHCJ", "CHCK", "CHCL", "CHFO", - "CHFT", "CHHS", "CHHM", "CHMA", "CHMB", "CHME", "CHMF", "CHMG", "CHMH", - "CHMI", "CHMQ", "CHMV", "CHNB", "CHNC", "CHNG", "CHNH", "CHNI", "CHOA", - "CHOB", "CHOC", "CHON", "CHOO", "CHOP", "CHOQ", "CHOR", "CHOS", "CHOT", - "CHOU", "CHOX", "CHOY", "CHOZ", "CHPD", "CHPE", "CHPF", "CHPG", "ECBA", - "ECBB", "ECDA", "ECDB", "ECSA", "ECSB", "ECVA", "ECVB", "ECWA", "ECWB", - "ECWC", "ECWD", "ECWE", "ECWF", "EUBB", "EUBC", "GGLA", "GGLS"}; - const char* const* end = &kOrganicBrands[std::size(kOrganicBrands)]; - if (std::binary_search(&kOrganicBrands[0], end, brand)) + constexpr auto kOrganicBrands = base::MakeFixedFlatSet<base::StringPiece>( + {"CHCA", "CHCB", "CHCG", "CHCH", "CHCI", "CHCJ", "CHCK", "CHCL", "CHFO", + "CHFT", "CHHS", "CHHM", "CHMA", "CHMB", "CHME", "CHMF", "CHMG", "CHMH", + "CHMI", "CHMQ", "CHMV", "CHNB", "CHNC", "CHNG", "CHNH", "CHNI", "CHOA", + "CHOB", "CHOC", "CHON", "CHOO", "CHOP", "CHOQ", "CHOR", "CHOS", "CHOT", + "CHOU", "CHOX", "CHOY", "CHOZ", "CHPD", "CHPE", "CHPF", "CHPG", "ECBA", + "ECBB", "ECDA", "ECDB", "ECSA", "ECSB", "ECVA", "ECVB", "ECWA", "ECWB", + "ECWC", "ECWD", "ECWE", "ECWF", "EUBB", "EUBC", "GCEL", "GGLA", "GGLS"}); + if (kOrganicBrands.contains(brand)) { return true; + } // The Chrome enterprise brand code is the only GGR* brand to be non-organic. if (brand == "GGRV") @@ -151,8 +152,18 @@ } bool IsEnterprise(const std::string& brand) { + // GCEL is the only GCE* code that is actually organic. + if (brand == "GCEL") { + return false; + } + const char* const kEnterpriseBrands[] = { + "GCE", "GCF", "GCG", "GCH", // CBE brands codes. + "GCC", "GCK", "GCL", "GCM" // CBE+CBCM brand codes. + }; return brand == "GGRV" || - base::StartsWith(brand, "GCE", base::CompareCase::SENSITIVE); + base::ranges::any_of(kEnterpriseBrands, [&brand](const char* br) { + return base::StartsWith(brand, br, base::CompareCase::SENSITIVE); + }); } // BrandForTesting ------------------------------------------------------------
diff --git a/chrome/browser/google/google_update_settings_unittest.cc b/chrome/browser/google/google_update_settings_unittest.cc index 77a50f3..51712ce 100644 --- a/chrome/browser/google/google_update_settings_unittest.cc +++ b/chrome/browser/google/google_update_settings_unittest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <string> + #include "chrome/installer/util/google_update_settings.h" #include "base/compiler_specific.h" #include "base/files/file_util.h" @@ -107,13 +109,20 @@ TEST_F(GoogleUpdateTest, IsEnterpriseBrandCodes) { EXPECT_TRUE(google_brand::IsEnterprise("GGRV")); std::string gce_prefix = "GCE"; - for (char ch = 'A'; ch <= 'Z'; ++ch) - EXPECT_TRUE(google_brand::IsEnterprise(gce_prefix + ch)); + for (char ch = 'A'; ch <= 'Z'; ++ch) { + EXPECT_EQ(google_brand::IsEnterprise(gce_prefix + ch), ch != 'L'); + } + for (const std::string prefix : + {"GCC", "GCF", "GCG", "GCH", "GCK", "GCL", "GCM"}) { + for (char ch = 'A'; ch <= 'Z'; ++ch) { + EXPECT_TRUE(google_brand::IsEnterprise(prefix + ch)); + } + } EXPECT_FALSE(google_brand::IsEnterprise("ggrv")); EXPECT_FALSE(google_brand::IsEnterprise("gcea")); EXPECT_FALSE(google_brand::IsEnterprise("GGRA")); EXPECT_FALSE(google_brand::IsEnterprise("AGCE")); - EXPECT_FALSE(google_brand::IsEnterprise("GCCE")); + EXPECT_FALSE(google_brand::IsEnterprise("GCZE")); EXPECT_FALSE(google_brand::IsEnterprise("CHFO")); EXPECT_FALSE(google_brand::IsEnterprise("CHMA")); EXPECT_FALSE(google_brand::IsEnterprise("EUBA"));
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.cc b/chrome/browser/headless/headless_mode_protocol_browsertest.cc index 85c83b0..2592495 100644 --- a/chrome/browser/headless/headless_mode_protocol_browsertest.cc +++ b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
@@ -196,7 +196,9 @@ } HEADLESS_MODE_PROTOCOL_TEST(DomFocus, "input/dom-focus.js") -HEADLESS_MODE_PROTOCOL_TEST(FocusBlurNotifications, + +// Flaky crbug/1431857 +HEADLESS_MODE_PROTOCOL_TEST(DISABLED_FocusBlurNotifications, "input/focus-blur-notifications.js") // TODO(crbug.com/1416882): Re-enable this test #if BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/lacros/app_mode/kiosk_accelerator_browsertest.cc b/chrome/browser/lacros/app_mode/kiosk_accelerator_browsertest.cc new file mode 100644 index 0000000..924bdad9 --- /dev/null +++ b/chrome/browser/lacros/app_mode/kiosk_accelerator_browsertest.cc
@@ -0,0 +1,169 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" +#include "base/run_loop.h" +#include "base/test/test_future.h" +#include "chrome/browser/app_mode/test/accelerator_helpers.h" +#include "chrome/browser/lacros/browser_service_lacros.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/common/chrome_switches.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/crosapi/mojom/crosapi.mojom-shared.h" +#include "chromeos/startup/browser_init_params.h" +#include "content/public/test/browser_test.h" +#include "ui/display/screen.h" +#include "ui/events/keycodes/keyboard_codes_posix.h" + +using crosapi::mojom::BrowserInitParams; +using crosapi::mojom::BrowserInitParamsPtr; +using crosapi::mojom::CreationResult; +using crosapi::mojom::SessionType; + +namespace { + +const char kNavigationUrl[] = "https://www.example.com/"; + +// Observes BrowserList and blocks until a given browser is removed. +class BrowserClosedWaiter : public BrowserListObserver { + public: + explicit BrowserClosedWaiter(Browser* browser) : browser_{browser} { + BrowserList::AddObserver(this); + } + + ~BrowserClosedWaiter() override { BrowserList::RemoveObserver(this); } + + [[nodiscard]] bool Wait() { return future_.Wait(); } + + private: + void OnBrowserRemoved(Browser* browser) override { + if (browser_ == browser) { + future_.SetValue(); + } + } + + Browser* browser_ = nullptr; + base::test::TestFuture<void> future_; +}; + +[[nodiscard]] bool WaitUntilBrowserClosed(Browser* browser) { + auto waiter = BrowserClosedWaiter(browser); + return waiter.Wait(); +} + +} // namespace + +// Tests browser view accelerators work normally in non kiosk session. +class NonKioskAcceleratorTest : public InProcessBrowserTest { + protected: + NonKioskAcceleratorTest() = default; + ~NonKioskAcceleratorTest() override = default; + + void SetUpOnMainThread() override { + browser_service_ = std::make_unique<BrowserServiceLacros>(); + InProcessBrowserTest::SetUpOnMainThread(); + } + + void TearDownOnMainThread() override { + InProcessBrowserTest::TearDownOnMainThread(); + browser_service_.reset(); + } + + BrowserServiceLacros* browser_service() const { + return browser_service_.get(); + } + + private: + std::unique_ptr<BrowserServiceLacros> browser_service_; +}; + +// Tests browser view accelerators do not work in kiosk session. +class WebKioskAcceleratorTest : public InProcessBrowserTest { + protected: + WebKioskAcceleratorTest() = default; + ~WebKioskAcceleratorTest() override = default; + + void SetUp() override { InProcessBrowserTest::SetUp(); } + + void SetUpOnMainThread() override { + browser_service_ = std::make_unique<BrowserServiceLacros>(); + InProcessBrowserTest::SetUpOnMainThread(); + SetKioskSessionType(); + CreateKioskWindow(); + CloseNonKioskWindow(); + SelectFirstBrowser(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + InProcessBrowserTest::SetUpCommandLine(command_line); + command_line->AppendSwitch(switches::kForceAppMode); + } + + void TearDownOnMainThread() override { + InProcessBrowserTest::TearDownOnMainThread(); + browser_service_.reset(); + } + + private: + void SetKioskSessionType() { + BrowserInitParamsPtr init_params = + chromeos::BrowserInitParams::GetForTests()->Clone(); + init_params->session_type = SessionType::kWebKioskSession; + chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params)); + } + + void CreateKioskWindow() { + base::test::TestFuture<CreationResult> future; + browser_service()->NewFullscreenWindow( + GURL(kNavigationUrl), + display::Screen::GetScreen()->GetDisplayForNewWindows().id(), + future.GetCallback()); + ASSERT_EQ(future.Take(), CreationResult::kSuccess); + } + + BrowserServiceLacros* browser_service() const { + return browser_service_.get(); + } + + void CloseNonKioskWindow() { + ASSERT_EQ(BrowserList::GetInstance()->size(), 2u); + for (Browser* browser : *BrowserList::GetInstance()) { + const GURL& url = + browser->tab_strip_model()->GetActiveWebContents()->GetURL(); + if (url != kNavigationUrl) { + browser->window()->Close(); + ASSERT_TRUE(WaitUntilBrowserClosed(browser)); + break; + } + } + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + } + + std::unique_ptr<BrowserServiceLacros> browser_service_; +}; + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorTest, CloseTabWorks) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_TRUE(chrome::PressCloseTabAccelerator(browser())); + ASSERT_TRUE(WaitUntilBrowserClosed(browser())); + ASSERT_EQ(BrowserList::GetInstance()->size(), 0u); +} + +IN_PROC_BROWSER_TEST_F(NonKioskAcceleratorTest, CloseWindowWorks) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_TRUE(chrome::PressCloseWindowAccelerator(browser())); + ASSERT_TRUE(WaitUntilBrowserClosed(browser())); + ASSERT_EQ(BrowserList::GetInstance()->size(), 0u); +} + +IN_PROC_BROWSER_TEST_F(WebKioskAcceleratorTest, CloseTabAndWindowDontWork) { + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); + ASSERT_FALSE(chrome::PressCloseTabAccelerator(browser())); + ASSERT_FALSE(chrome::PressCloseWindowAccelerator(browser())); + base::RunLoop loop; + loop.RunUntilIdle(); + ASSERT_EQ(BrowserList::GetInstance()->size(), 1u); +}
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_common.h b/chrome/browser/media/webrtc/webrtc_browsertest_common.h index 2838b2e..3a3a5fc 100644 --- a/chrome/browser/media/webrtc/webrtc_browsertest_common.h +++ b/chrome/browser/media/webrtc/webrtc_browsertest_common.h
@@ -50,10 +50,9 @@ // Returns true on success. bool SleepInJavascript(content::WebContents* tab_contents, int timeout_msec); -// This function will execute the provided |javascript| until it causes a call -// to window.domAutomationController.send() with |evaluates_to| as the message. -// That is, we are NOT checking what the javascript evaluates to. Returns false -// if we exceed the TestTimeouts::action_max_timeout(). +// This function will execute the provided |javascript| until the script's +// completion value is |evaluates_to|. Returns false if we exceed the +// TestTimeouts::action_max_timeout(). // TODO(phoglund): Consider a better interaction method with the javascript // than polling javascript methods. bool PollingWaitUntil(const std::string& javascript,
diff --git a/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc index d2812b9..fdd77785 100644 --- a/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_internals_perf_browsertest.cc
@@ -68,9 +68,7 @@ absl::optional<base::Value::Dict> GetWebrtcInternalsData( content::WebContents* webrtc_internals_tab) { std::string all_stats_json = ExecuteJavascript( - "window.domAutomationController.send(" - " JSON.stringify(peerConnectionDataStore));", - webrtc_internals_tab); + "JSON.stringify(peerConnectionDataStore);", webrtc_internals_tab); absl::optional<base::Value> parsed_json = base::JSONReader::Read(all_stats_json);
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc index 897395d..fb8757a 100644 --- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc +++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
@@ -492,10 +492,8 @@ "diagnostics to help improve Hangouts.' in Hangouts settings." "This feature is enabled by default." chrome_policy { - subProto1 { - WebRtcTextLogCollectionAllowed { - WebRtcTextLogCollectionAllowed: false - } + WebRtcTextLogCollectionAllowed { + WebRtcTextLogCollectionAllowed: false } } })");
diff --git a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc index d4862418..8aa6d97 100644 --- a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -265,9 +265,7 @@ test::SleepInJavascript(left_tab, 5000); const std::string webrtc_internals_stats_json = ExecuteJavascript( - "window.domAutomationController.send(" - " JSON.stringify(peerConnectionDataStore));", - webrtc_internals_tab); + "JSON.stringify(peerConnectionDataStore);", webrtc_internals_tab); webrtc_decode_latencies_ = ParseGoogMaxDecodeFromWebrtcInternalsTab(webrtc_internals_stats_json); chrome::CloseWebContents(browser(), webrtc_internals_tab, false);
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index c2ae2c7..67b61f6 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -151,6 +151,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) #include "ash/constants/ash_features.h" #include "base/feature_list.h" +#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/printing/printer_metrics_provider.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/device_settings_service.h" @@ -729,6 +730,10 @@ base::SequencedTaskRunner::GetCurrentDefault()); AsyncInitSystemProfileProvider(); + + // Set is_demo_mode_ to true in ukm_consent_state_observer if the device is + // currently in Demo Mode. + SetIsDemoMode(ash::DemoSession::IsDeviceInDemoMode()); #endif } @@ -1144,6 +1149,17 @@ // component. metrics::structured::Recorder::GetInstance()->ProfileAdded( profile->GetPath()); + + // If the device is in Demo Mode, observe the sync service to enable UKM to + // collect app data and return true. + if (IsDeviceInDemoMode()) { + syncer::SyncService* sync = SyncServiceFactory::GetForProfile(profile); + if (!sync) { + return false; + } + StartObserving(sync, profile->GetPrefs()); + return true; + } #endif // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch // of lacros-chrome is complete.
diff --git a/chrome/browser/metrics/chrome_metrics_service_client_ash_unittest.cc b/chrome/browser/metrics/chrome_metrics_service_client_ash_unittest.cc index 56210ad..57127eb 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client_ash_unittest.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client_ash_unittest.cc
@@ -7,6 +7,7 @@ #include "base/test/metrics/user_action_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/multidevice_setup/multidevice_setup_client_factory.h" #include "chrome/browser/metrics/chrome_metrics_services_manager_client.h" #include "chrome/browser/unified_consent/unified_consent_service_factory.h" @@ -495,7 +496,7 @@ GetUkmService()->Flush( metrics::MetricsLogsEventManager::CreateReason::kUnknown); - // Build UKM report to verity that all of the events and sources have been + // Build UKM report to verify that all of the events and sources have been // recorded. ukm::Report report = GetUkmReport(); @@ -545,3 +546,59 @@ EXPECT_THAT(actual_source_ids, testing::UnorderedElementsAreArray(added_source_ids)); } + +class ChromeMetricsServiceClientTestDemoModeRecordAppMetrics + : public ChromeMetricsServiceClientTestIgnoredForAppMetrics { + public: + ChromeMetricsServiceClientTestDemoModeRecordAppMetrics() = default; + + void SetUp() override { + ChromeMetricsServiceClientTestIgnoredForAppMetrics::SetUp(); + ash::DemoSession::SetDemoConfigForTesting( + ash::DemoSession::DemoModeConfig::kOnline); + testing_profile_->ScopedCrosSettingsTestHelper() + ->InstallAttributes() + ->SetDemoMode(); + } + + void TearDown() override { + ash::DemoSession::ResetDemoConfigForTesting(); + ChromeMetricsServiceClientTestIgnoredForAppMetrics::TearDown(); + } +}; + +TEST_F(ChromeMetricsServiceClientTestDemoModeRecordAppMetrics, + VerifyRecordingInDemoSession) { + sync_preferences::TestingPrefServiceSyncable prefs; + auto chrome_metrics_service_client = Init(prefs); + + // Make sure the MSBB consent is set to false initially. + SetUrlKeyedAnonymizedDataCollectionEnabled(prefs, false); + + // Make sure the APP consent is set to false for sync service. + sync_service_.SetAppSync(false); + + auto ukm_consent_state = GetChromeMetricsServiceClient().GetUkmConsentState(); + + // Assert that UKM consent state contains only APPS in DemoSession. + EXPECT_FALSE(ukm_consent_state.Has(ukm::UkmConsentType::MSBB)); + EXPECT_TRUE(ukm_consent_state.Has(ukm::UkmConsentType::APPS)); + + // Record a mix of SourceId's and Events. + RecordTestEvent1(ukm::SourceIdType::NAVIGATION_ID); + RecordTestEvent1(ukm::SourceIdType::NAVIGATION_ID); + RecordTestEvent1(ukm::SourceIdType::APP_ID); + RecordTestEvent1(ukm::SourceIdType::NAVIGATION_ID); + RecordTestEvent1(ukm::SourceIdType::APP_ID); + + GetUkmService()->Flush( + metrics::MetricsLogsEventManager::CreateReason::kUnknown); + + // Build UKM report to verify that all of the events and sources have been + // recorded for Demo Session. + ukm::Report report = GetUkmReport(); + + // Expect that only APP events and sources originally recorded are present. + EXPECT_EQ(report.sources_size(), 2); + EXPECT_EQ(report.entries_size(), 2); +}
diff --git a/chrome/browser/metrics/power/battery_discharge_reporter.cc b/chrome/browser/metrics/power/battery_discharge_reporter.cc index 65a5f9b..d77426f 100644 --- a/chrome/browser/metrics/power/battery_discharge_reporter.cc +++ b/chrome/browser/metrics/power/battery_discharge_reporter.cc
@@ -10,7 +10,7 @@ #include "base/metrics/histogram_functions.h" #include "chrome/browser/metrics/power/power_metrics.h" #include "chrome/browser/metrics/power/process_metrics_recorder_util.h" -#include "chrome/browser/metrics/power/usage_scenario.h" +#include "chrome/browser/metrics/usage_scenario/usage_scenario.h" #if BUILDFLAG(IS_MAC) #include "base/metrics/histogram_functions.h"
diff --git a/chrome/browser/metrics/power/power_metrics_reporter.h b/chrome/browser/metrics/power/power_metrics_reporter.h index 0c6b3d72..c963cbc 100644 --- a/chrome/browser/metrics/power/power_metrics_reporter.h +++ b/chrome/browser/metrics/power/power_metrics_reporter.h
@@ -14,7 +14,7 @@ #include "build/build_config.h" #include "chrome/browser/metrics/power/power_metrics.h" #include "chrome/browser/metrics/power/process_monitor.h" -#include "chrome/browser/metrics/power/usage_scenario.h" +#include "chrome/browser/metrics/usage_scenario/usage_scenario.h" #include "chrome/browser/metrics/usage_scenario/usage_scenario_data_store.h" #include "chrome/browser/metrics/usage_scenario/usage_scenario_tracker.h" #include "components/performance_manager/public/power/battery_level_provider_creator.h"
diff --git a/chrome/browser/metrics/shutdown_watcher_helper.cc b/chrome/browser/metrics/shutdown_watcher_helper.cc index 25f7205..db97771 100644 --- a/chrome/browser/metrics/shutdown_watcher_helper.cc +++ b/chrome/browser/metrics/shutdown_watcher_helper.cc
@@ -25,25 +25,6 @@ shutdown_watchdog_->Arm(); } -// static -base::TimeDelta ShutdownWatcherHelper::GetPerChannelTimeout( - base::TimeDelta duration) { - base::TimeDelta actual_duration = duration; - - version_info::Channel channel = chrome::GetChannel(); - if (channel == version_info::Channel::STABLE) { - actual_duration *= 20; - } else if (channel == version_info::Channel::BETA) { - actual_duration *= 10; - } else if (channel == version_info::Channel::DEV) { - actual_duration *= 4; - } else { - actual_duration *= 2; - } - - return actual_duration; -} - void ShutdownWatcherHelper::Alarm() { metrics::ShutdownHang(); }
diff --git a/chrome/browser/metrics/shutdown_watcher_helper.h b/chrome/browser/metrics/shutdown_watcher_helper.h index 76c927a..c129133c 100644 --- a/chrome/browser/metrics/shutdown_watcher_helper.h +++ b/chrome/browser/metrics/shutdown_watcher_helper.h
@@ -30,10 +30,6 @@ // wait before it calls alarm. void Arm(const base::TimeDelta& duration); - // Get the timeout after which a shutdown hang is detected, for the current - // channel. - static base::TimeDelta GetPerChannelTimeout(base::TimeDelta duration); - // base::Watchdog::Delegate implementation: void Alarm() override;
diff --git a/chrome/browser/metrics/power/usage_scenario.cc b/chrome/browser/metrics/usage_scenario/usage_scenario.cc similarity index 89% rename from chrome/browser/metrics/power/usage_scenario.cc rename to chrome/browser/metrics/usage_scenario/usage_scenario.cc index f045fdc1..41fe28e2 100644 --- a/chrome/browser/metrics/power/usage_scenario.cc +++ b/chrome/browser/metrics/usage_scenario/usage_scenario.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 "chrome/browser/metrics/power/usage_scenario.h" +#include "chrome/browser/metrics/usage_scenario/usage_scenario.h" namespace { @@ -116,25 +116,31 @@ // scenario in the histograms.xml file. DCHECK_GT(interval_data.max_visible_window_count, 0); - if (!interval_data.time_capturing_video.is_zero()) + if (!interval_data.time_capturing_video.is_zero()) { return kVideoCaptureParams; - if (!interval_data.time_playing_video_full_screen_single_monitor.is_zero()) + } + if (!interval_data.time_playing_video_full_screen_single_monitor.is_zero()) { return kFullscreenVideoParams; + } if (!interval_data.time_playing_video_in_visible_tab.is_zero()) { // Note: UKM data reveals that navigations are infrequent when a video is // playing in fullscreen, when video is captured or when audio is playing. // For that reason, there is no distinct suffix for navigation vs. no // navigation in these cases. - if (interval_data.top_level_navigation_count == 0) + if (interval_data.top_level_navigation_count == 0) { return kEmbeddedVideoNoNavigationParams; + } return kEmbeddedVideoWithNavigationParams; } - if (!interval_data.time_playing_audio.is_zero()) + if (!interval_data.time_playing_audio.is_zero()) { return kAudioParams; - if (interval_data.top_level_navigation_count > 0) + } + if (interval_data.top_level_navigation_count > 0) { return kNavigationParams; - if (interval_data.user_interaction_count > 0) + } + if (interval_data.user_interaction_count > 0) { return kInteractionParams; + } return kPassiveParams; } } // namespace @@ -143,13 +149,16 @@ const UsageScenarioDataStore::IntervalData& interval_data) { // The order of the conditions is important. See the full description of each // scenario in the histograms.xml file. - if (interval_data.max_tab_count == 0) + if (interval_data.max_tab_count == 0) { return kZeroWindowParams; + } if (interval_data.max_visible_window_count == 0) { - if (!interval_data.time_capturing_video.is_zero()) + if (!interval_data.time_capturing_video.is_zero()) { return kAllTabsHiddenVideoCaptureParams; - if (!interval_data.time_playing_audio.is_zero()) + } + if (!interval_data.time_playing_audio.is_zero()) { return kAllTabsHiddenAudioParams; + } return kAllTabsHiddenNoVideoCaptureOrAudioParams; } return GetScenarioParamsWithVisibleWindow(interval_data); @@ -162,15 +171,18 @@ // The order of the conditions is important. See the full description of each // scenario in the histograms.xml file. if (short_interval_data.max_tab_count == 0) { - if (pre_interval_data.max_tab_count != 0) + if (pre_interval_data.max_tab_count != 0) { return kAllTabsHiddenZeroWindowRecentParams; + } return kZeroWindowParams; } if (short_interval_data.max_visible_window_count == 0) { - if (!short_interval_data.time_capturing_video.is_zero()) + if (!short_interval_data.time_capturing_video.is_zero()) { return kAllTabsHiddenVideoCaptureParams; - if (!short_interval_data.time_playing_audio.is_zero()) + } + if (!short_interval_data.time_playing_audio.is_zero()) { return kAllTabsHiddenAudioParams; + } if (pre_interval_data.max_visible_window_count != 0 || !pre_interval_data.time_capturing_video.is_zero() || !pre_interval_data.time_playing_audio.is_zero()) {
diff --git a/chrome/browser/metrics/power/usage_scenario.h b/chrome/browser/metrics/usage_scenario/usage_scenario.h similarity index 91% rename from chrome/browser/metrics/power/usage_scenario.h rename to chrome/browser/metrics/usage_scenario/usage_scenario.h index 68531cc0..c72fa72 100644 --- a/chrome/browser/metrics/power/usage_scenario.h +++ b/chrome/browser/metrics/usage_scenario/usage_scenario.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 CHROME_BROWSER_METRICS_POWER_USAGE_SCENARIO_H_ -#define CHROME_BROWSER_METRICS_POWER_USAGE_SCENARIO_H_ +#ifndef CHROME_BROWSER_METRICS_USAGE_SCENARIO_USAGE_SCENARIO_H_ +#define CHROME_BROWSER_METRICS_USAGE_SCENARIO_USAGE_SCENARIO_H_ #include "chrome/browser/metrics/usage_scenario/usage_scenario_data_store.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -56,4 +56,4 @@ const UsageScenarioDataStore::IntervalData& pre_interval_data); #endif // BUILDFLAG(IS_MAC) -#endif // CHROME_BROWSER_METRICS_POWER_USAGE_SCENARIO_H_ +#endif // CHROME_BROWSER_METRICS_USAGE_SCENARIO_USAGE_SCENARIO_H_
diff --git a/chrome/browser/metrics/power/usage_scenario_unittest.cc b/chrome/browser/metrics/usage_scenario/usage_scenario_unittest.cc similarity index 99% rename from chrome/browser/metrics/power/usage_scenario_unittest.cc rename to chrome/browser/metrics/usage_scenario/usage_scenario_unittest.cc index d27cb0a..43f2f52 100644 --- a/chrome/browser/metrics/power/usage_scenario_unittest.cc +++ b/chrome/browser/metrics/usage_scenario/usage_scenario_unittest.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 "chrome/browser/metrics/power/usage_scenario.h" +#include "chrome/browser/metrics/usage_scenario/usage_scenario.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc index bf8ff00..4bd6ecde 100644 --- a/chrome/browser/net/profile_network_context_service.cc +++ b/chrome/browser/net/profile_network_context_service.cc
@@ -668,11 +668,6 @@ } } - // `ClientCertStoreAsh` internally depends on NSS initialization that happens - // when the `ResourceContext` is created. Call `GetResourceContext()` so the - // dependency is explicit. See https://crbug.com/1018972. - profile_->GetResourceContext(); - return std::make_unique<ash::ClientCertStoreAsh>( std::move(certificate_provider), use_system_key_slot, username_hash, base::BindRepeating(&CreateCryptoModuleBlockingPasswordDelegate,
diff --git a/chrome/browser/payments/secure_payment_confirmation_authenticator_browsertest.cc b/chrome/browser/payments/secure_payment_confirmation_authenticator_browsertest.cc index b5a3e26..ff20f3f 100644 --- a/chrome/browser/payments/secure_payment_confirmation_authenticator_browsertest.cc +++ b/chrome/browser/payments/secure_payment_confirmation_authenticator_browsertest.cc
@@ -211,13 +211,13 @@ event_waiter_ = std::make_unique<autofill::EventWaiter<Event>>(expected_events_); ExecuteScriptAsync(GetActiveWebContents(), "createPaymentCredential()"); - event_waiter_->Wait(); + ASSERT_TRUE(event_waiter_->Wait()); // Expect no crash when the web contents is destroyed during enrollment while // the OS enrollment prompt is showing. ObserveWebContentsDestroyed(); GetActiveWebContents()->Close(); - event_waiter_->Wait(); + ASSERT_TRUE(event_waiter_->Wait()); } class SecurePaymentConfirmationAuthenticatorCreateDisableDebugTest
diff --git a/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc b/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc index bb689d7..14b157b 100644 --- a/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc +++ b/chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.cc
@@ -139,14 +139,8 @@ #if !BUILDFLAG(IS_ANDROID) graph->PassToGraph(FormInteractionTabHelper::CreateGraphObserver()); - if (URGENT_DISCARDING_FROM_PERFORMANCE_MANAGER() || - base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - graph->PassToGraph(std::make_unique< - performance_manager::policies::PageDiscardingHelper>()); - } + graph->PassToGraph( + std::make_unique<performance_manager::policies::PageDiscardingHelper>()); #if URGENT_DISCARDING_FROM_PERFORMANCE_MANAGER() if (base::FeatureList::IsEnabled( @@ -178,30 +172,24 @@ std::make_unique<performance_manager::policies::PageFreezingPolicy>()); if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - if (base::FeatureList::IsEnabled( - performance_manager::features::kHeuristicMemorySaver)) { - graph->PassToGraph( - std::make_unique< - performance_manager::policies::HeuristicMemorySaverPolicy>( - performance_manager::features:: - kHeuristicMemorySaverAvailableMemoryThresholdPercent.Get(), - base::Seconds( - performance_manager::features:: - kHeuristicMemorySaverThresholdReachedHeartbeatSeconds - .Get()), - base::Seconds( - performance_manager::features:: - kHeuristicMemorySaverThresholdNotReachedHeartbeatSeconds - .Get()), - base::Minutes( - performance_manager::features:: - kHeuristicMemorySaverMinimumMinutesInBackground.Get()))); - } else { - graph->PassToGraph( - std::make_unique< - performance_manager::policies::HighEfficiencyModePolicy>()); - } + performance_manager::features::kHeuristicMemorySaver)) { + graph->PassToGraph(std::make_unique<performance_manager::policies:: + HeuristicMemorySaverPolicy>( + performance_manager::features:: + kHeuristicMemorySaverAvailableMemoryThresholdPercent.Get(), + base::Seconds( + performance_manager::features:: + kHeuristicMemorySaverThresholdReachedHeartbeatSeconds.Get()), + base::Seconds( + performance_manager::features:: + kHeuristicMemorySaverThresholdNotReachedHeartbeatSeconds.Get()), + base::Minutes( + performance_manager::features:: + kHeuristicMemorySaverMinimumMinutesInBackground.Get()))); + } else { + graph->PassToGraph( + std::make_unique< + performance_manager::policies::HighEfficiencyModePolicy>()); } #endif // !BUILDFLAG(IS_ANDROID) @@ -242,35 +230,27 @@ g_browser_process->profile_manager()->AddObserver(this); #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - profile_discard_opt_out_list_helper_ = std::make_unique< - performance_manager::user_tuning::ProfileDiscardOptOutListHelper>(); - // Create the UserPerformanceTuningManager here so that early UI code can - // register observers, but only start it in PreMainMessageLoopRun because it - // requires the HostFrameSinkManager to exist. - int tab_count_threshold = - performance_manager::features::kHighEfficiencyModePromoTabCountThreshold - .Get(); - int memory_percent_threshold = - performance_manager::features:: - kHighEfficiencyModePromoMemoryPercentThreshold.Get(); - uint64_t system_memory_kb = base::SysInfo::AmountOfPhysicalMemory() / 1024; - DCHECK_GT(tab_count_threshold, 0); - user_performance_tuning_manager_ = base::WrapUnique( - new performance_manager::user_tuning::UserPerformanceTuningManager( - g_browser_process->local_state(), - std::make_unique<performance_manager::user_tuning:: - UserPerformanceTuningNotifier>( - base::WrapUnique(new performance_manager::user_tuning:: - UserPerformanceTuningManager:: - UserPerformanceTuningReceiverImpl), - /*resident_set_threshold_kb=*/system_memory_kb * 100 / - memory_percent_threshold, - /*tab_count_threshold=*/tab_count_threshold))); - } + profile_discard_opt_out_list_helper_ = std::make_unique< + performance_manager::user_tuning::ProfileDiscardOptOutListHelper>(); + // Create the UserPerformanceTuningManager here so that early UI code can + // register observers, but only start it in PreMainMessageLoopRun because it + // requires the HostFrameSinkManager to exist. + uint64_t system_memory_kb = base::SysInfo::AmountOfPhysicalMemory() / 1024; + user_performance_tuning_manager_ = base::WrapUnique( + new performance_manager::user_tuning::UserPerformanceTuningManager( + g_browser_process->local_state(), + std::make_unique< + performance_manager::user_tuning::UserPerformanceTuningNotifier>( + base::WrapUnique(new performance_manager::user_tuning:: + UserPerformanceTuningManager:: + UserPerformanceTuningReceiverImpl), + /*resident_set_threshold_kb=*/system_memory_kb * 100 / + performance_manager::user_tuning:: + UserPerformanceTuningNotifier:: + kMemoryPercentThresholdForPromo, + /*tab_count_threshold=*/ + performance_manager::user_tuning::UserPerformanceTuningNotifier:: + kTabCountThresholdForPromo))); #endif page_load_metrics_observer_ = @@ -309,21 +289,15 @@ void ChromeBrowserMainExtraPartsPerformanceManager::PreMainMessageLoopRun() { #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - // This object requires the host frame sink manager to exist, which is - // created after all the extra parts have run their PostCreateThreads. - performance_manager::user_tuning::UserPerformanceTuningManager:: - GetInstance() - ->Start(); + // This object requires the host frame sink manager to exist, which is + // created after all the extra parts have run their PostCreateThreads. + performance_manager::user_tuning::UserPerformanceTuningManager::GetInstance() + ->Start(); - // This object is created by the metrics service before threads, but it - // needs the UserPerformanceTuningManager to exist. At this point it's - // instantiated, but still needs to be initialized. - performance_manager::MetricsProvider::GetInstance()->Initialize(); - } + // This object is created by the metrics service before threads, but it + // needs the UserPerformanceTuningManager to exist. At this point it's + // instantiated, but still needs to be initialized. + performance_manager::MetricsProvider::GetInstance()->Initialize(); #endif } @@ -363,12 +337,7 @@ ->NotifyBrowserContextAdded(profile); #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - profile_discard_opt_out_list_helper_->OnProfileAdded(profile); - } + profile_discard_opt_out_list_helper_->OnProfileAdded(profile); #endif } @@ -384,11 +353,6 @@ ->NotifyBrowserContextRemoved(profile); #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - profile_discard_opt_out_list_helper_->OnProfileWillBeRemoved(profile); - } + profile_discard_opt_out_list_helper_->OnProfileWillBeRemoved(profile); #endif }
diff --git a/chrome/browser/performance_manager/metrics/metrics_provider.cc b/chrome/browser/performance_manager/metrics/metrics_provider.cc index 52fa7342..2b40f7ad 100644 --- a/chrome/browser/performance_manager/metrics/metrics_provider.cc +++ b/chrome/browser/performance_manager/metrics/metrics_provider.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/performance_manager/metrics/metrics_provider.h" #include "base/metrics/histogram_functions.h" +#include "base/process/process_metrics.h" #include "base/system/sys_info.h" #include "base/timer/timer.h" #include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h" @@ -130,6 +131,17 @@ available_bytes / kBytesPerMb); base::UmaHistogramPercentage("Memory.Experimental.AvailableMemoryPercent", available_bytes * 100 / total_bytes); + +#if BUILDFLAG(IS_MAC) + base::SystemMemoryInfoKB info; + if (base::GetSystemMemoryInfo(&info)) { + base::UmaHistogramMemoryLargeMB("Memory.Experimental.MacFileBackedMemoryMB", + info.file_backed / kBytesPerMb); + base::UmaHistogramPercentage( + "Memory.Experimental.MacAvailableMemoryPercentFreePageCache", + (available_bytes + info.file_backed) * 100 / total_bytes); + } +#endif } } // namespace performance_manager
diff --git a/chrome/browser/performance_manager/metrics/metrics_provider_unittest.cc b/chrome/browser/performance_manager/metrics/metrics_provider_unittest.cc index aee1dfc..9b257ae6 100644 --- a/chrome/browser/performance_manager/metrics/metrics_provider_unittest.cc +++ b/chrome/browser/performance_manager/metrics/metrics_provider_unittest.cc
@@ -63,9 +63,7 @@ private: void SetUp() override { feature_list_.InitWithFeatures( - {performance_manager::features::kHighEfficiencyModeAvailable, - performance_manager::features::kBatterySaverModeAvailable}, - {}); + {performance_manager::features::kBatterySaverModeAvailable}, {}); performance_manager::user_tuning::prefs::RegisterLocalStatePrefs( local_state_.registry());
diff --git a/chrome/browser/performance_manager/policies/heuristic_memory_saver_policy_unittest.cc b/chrome/browser/performance_manager/policies/heuristic_memory_saver_policy_unittest.cc index 705e3726..44b1c07 100644 --- a/chrome/browser/performance_manager/policies/heuristic_memory_saver_policy_unittest.cc +++ b/chrome/browser/performance_manager/policies/heuristic_memory_saver_policy_unittest.cc
@@ -47,8 +47,7 @@ feature_list_.InitWithFeatures( /*enabled_features=*/ - {performance_manager::features::kHighEfficiencyModeAvailable, - performance_manager::features::kHeuristicMemorySaver}, + {performance_manager::features::kHeuristicMemorySaver}, /*disabled_features=*/{}); // This is usually called when the profile is created. Fake it here since it // doesn't happen in tests.
diff --git a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.cc b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.cc index 3abcdf9..9701f193 100644 --- a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.cc +++ b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.cc
@@ -16,10 +16,11 @@ } +const base::TimeDelta HighEfficiencyModePolicy::kDefaultDiscardTimeInterval = + base::Hours(2); + HighEfficiencyModePolicy::HighEfficiencyModePolicy() - : time_before_discard_( - performance_manager::features::kHighEfficiencyModeTimeBeforeDiscard - .Get()) { + : time_before_discard_(kDefaultDiscardTimeInterval) { DCHECK(!g_high_efficiency_mode_policy); g_high_efficiency_mode_policy = this; }
diff --git a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h index 1f1cdbf..1322a5d 100644 --- a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h +++ b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy.h
@@ -20,6 +20,10 @@ class HighEfficiencyModePolicy : public GraphOwned, public PageNode::ObserverDefaultImpl { public: + // The default amount of time a tab must spend in the background before it's + // discarded by Memory Saver. + static const base::TimeDelta kDefaultDiscardTimeInterval; + HighEfficiencyModePolicy(); ~HighEfficiencyModePolicy() override;
diff --git a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy_unittest.cc b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy_unittest.cc index 3f3ad4b..2bfa99c 100644 --- a/chrome/browser/performance_manager/policies/high_efficiency_mode_policy_unittest.cc +++ b/chrome/browser/performance_manager/policies/high_efficiency_mode_policy_unittest.cc
@@ -20,8 +20,6 @@ void SetUp() override { testing::GraphTestHarnessWithMockDiscarder::SetUp(); - feature_list_.InitAndEnableFeature( - performance_manager::features::kHighEfficiencyModeAvailable); // This is usually called when the profile is created. Fake it here since it // doesn't happen in tests. PageDiscardingHelper::GetFromGraph(graph())->SetNoDiscardPatternsForProfile( @@ -82,8 +80,7 @@ page_node()->SetIsVisible(false); task_env().FastForwardBy( - performance_manager::features::kHighEfficiencyModeTimeBeforeDiscard - .Get()); + HighEfficiencyModePolicy::kDefaultDiscardTimeInterval); ::testing::Mock::VerifyAndClearExpectations(discarder()); } @@ -124,8 +121,7 @@ // Advance time by the usual discard interval, minus 10 seconds. This means // that the page will be discarded 10 seconds after the mode is changed. task_env().FastForwardBy( - performance_manager::features::kHighEfficiencyModeTimeBeforeDiscard - .Get() - + HighEfficiencyModePolicy::kDefaultDiscardTimeInterval - base::Seconds(10)); ::testing::Mock::VerifyAndClearExpectations(discarder()); @@ -180,8 +176,7 @@ page_node->SetIsVisible(false); task_env().FastForwardBy( - performance_manager::features::kHighEfficiencyModeTimeBeforeDiscard - .Get()); + HighEfficiencyModePolicy::kDefaultDiscardTimeInterval); ::testing::Mock::VerifyAndClearExpectations(discarder()); }
diff --git a/chrome/browser/performance_manager/policies/page_discarding_helper.cc b/chrome/browser/performance_manager/policies/page_discarding_helper.cc index 7166464..846a283 100644 --- a/chrome/browser/performance_manager/policies/page_discarding_helper.cc +++ b/chrome/browser/performance_manager/policies/page_discarding_helper.cc
@@ -467,14 +467,6 @@ bool PageDiscardingHelper::IsPageOptedOutOfDiscarding( const std::string& browser_context_id, const GURL& url) const { - if (!base::FeatureList::IsEnabled(features::kHighEfficiencyModeAvailable) && - !base::FeatureList::IsEnabled(features::kBatterySaverModeAvailable)) { - // This list takes effect regardless of which mode the user is operating - // under, but its launch is gated on these finch experiments for launch - // considerations. - return false; - } - auto it = profiles_no_discard_patterns_.find(browser_context_id); // TODO(crbug.com/1308741): Change the CHECK to a DCHECK in Sept 2022, after // verifying that there are no crash reports.
diff --git a/chrome/browser/performance_manager/policies/page_discarding_helper_unittest.cc b/chrome/browser/performance_manager/policies/page_discarding_helper_unittest.cc index f8cd24c..24666503 100644 --- a/chrome/browser/performance_manager/policies/page_discarding_helper_unittest.cc +++ b/chrome/browser/performance_manager/policies/page_discarding_helper_unittest.cc
@@ -292,9 +292,7 @@ TEST_F(PageDiscardingHelperTest, TestCannotDiscardPageOnNoDiscardList) { base::test::ScopedFeatureList feature_list; - feature_list.InitWithFeatures({features::kHighEfficiencyModeAvailable, - features::kBatterySaverModeAvailable}, - {}); + feature_list.InitWithFeatures({features::kBatterySaverModeAvailable}, {}); // static_cast page_node because it's declared as a PageNodeImpl which hides // the members it overrides from PageNode. PageDiscardingHelper::GetFromGraph(graph())->SetNoDiscardPatternsForProfile(
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc index e3d02b3..c2b3d17e 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager.cc
@@ -254,39 +254,19 @@ std::move(notifier)); } - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - // If the HEM pref is still the default (it wasn't configured by the user), - // look up what that default value should be in Finch and set it here. - // This is called in PostCreateThreads, which ensures the pref is in the - // correct state when views are created. - const PrefService::Preference* pref = local_state->FindPreference( - performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled); - if (pref->IsDefaultValue()) { - local_state->SetDefaultPrefValue( - performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled, - base::Value( - performance_manager::features::kHighEfficiencyModeDefaultState - .Get())); - } - } - pref_change_registrar_.Init(local_state); } void UserPerformanceTuningManager::Start() { was_started_ = true; - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - pref_change_registrar_.Add( - performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled, - base::BindRepeating( - &UserPerformanceTuningManager::OnHighEfficiencyModePrefChanged, - base::Unretained(this))); - // Make sure the initial state of the pref is passed on to the policy. - OnHighEfficiencyModePrefChanged(); - } + pref_change_registrar_.Add( + performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled, + base::BindRepeating( + &UserPerformanceTuningManager::OnHighEfficiencyModePrefChanged, + base::Unretained(this))); + // Make sure the initial state of the pref is passed on to the policy. + OnHighEfficiencyModePrefChanged(); if (base::FeatureList::IsEnabled( performance_manager::features::kBatterySaverModeAvailable)) {
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager_unittest.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager_unittest.cc index 73422b3e6..8bb46c3a 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager_unittest.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_manager_unittest.cc
@@ -94,7 +94,6 @@ void StartManager( std::vector<base::test::FeatureRefAndParams> features_and_params = { {performance_manager::features::kBatterySaverModeAvailable, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, {}}, }) { auto test_sampling_event_source = std::make_unique<base::test::TestSamplingEventSource>(); @@ -254,26 +253,6 @@ EXPECT_FALSE(throttling_enabled()); } -TEST_F(UserPerformanceTuningManagerTest, HEMFinchDisabledByDefault) { - StartManager({ - {performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "false"}}}, - }); - - EXPECT_FALSE(local_state_.GetBoolean( - performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled)); -} - -TEST_F(UserPerformanceTuningManagerTest, HEMFinchEnabledByDefault) { - StartManager({ - {performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "true"}}}, - }); - - EXPECT_TRUE(local_state_.GetBoolean( - performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled)); -} - TEST_F(UserPerformanceTuningManagerTest, EnabledOnBatteryPower) { StartManager(); EXPECT_FALSE(manager()->IsBatterySaverActive());
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc index 183ed3ef..2a2f95764 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.cc
@@ -8,6 +8,9 @@ namespace performance_manager::user_tuning { +const int UserPerformanceTuningNotifier::kTabCountThresholdForPromo = 10; +const int UserPerformanceTuningNotifier::kMemoryPercentThresholdForPromo = 70; + UserPerformanceTuningNotifier::UserPerformanceTuningNotifier( std::unique_ptr<Receiver> receiver, uint64_t resident_set_threshold_kb,
diff --git a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h index 311f740..9f03a1b9 100644 --- a/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h +++ b/chrome/browser/performance_manager/user_tuning/user_performance_tuning_notifier.h
@@ -19,6 +19,11 @@ public PageNode::ObserverDefaultImpl, public SystemNode::ObserverDefaultImpl { public: + // The tab count and memory % that, when reached, trigger an opt-in bubble for + // memory saver. + static const int kTabCountThresholdForPromo; + static const int kMemoryPercentThresholdForPromo; + // The instance of this delegate will have its different functions invoked on // the Performance Manager sequence by the // `UserPerformanceTuningNotifier` owning it.
diff --git a/chrome/browser/prefs/chrome_pref_model_associator_client.cc b/chrome/browser/prefs/chrome_pref_model_associator_client.cc index d1eeca1..3fcff704 100644 --- a/chrome/browser/prefs/chrome_pref_model_associator_client.cc +++ b/chrome/browser/prefs/chrome_pref_model_associator_client.cc
@@ -6,6 +6,7 @@ #include <cstdint> +#include "base/check_is_test.h" #include "base/memory/singleton.h" #include "chrome/common/pref_names.h" #include "components/content_settings/core/browser/website_settings_info.h" @@ -28,6 +29,11 @@ bool ChromePrefModelAssociatorClient::IsMergeableDictionaryPreference( const std::string& pref_name) const { + if (pref_name == sync_preferences::kSyncableMergeableDictPrefForTesting) { + CHECK_IS_TEST(); + return true; + } + const content_settings::WebsiteSettingsRegistry& registry = *content_settings::WebsiteSettingsRegistry::GetInstance(); for (const content_settings::WebsiteSettingsInfo* info : registry) {
diff --git a/chrome/browser/prefs/pref_metrics_service.cc b/chrome/browser/prefs/pref_metrics_service.cc index 032bed7..0630522d 100644 --- a/chrome/browser/prefs/pref_metrics_service.cc +++ b/chrome/browser/prefs/pref_metrics_service.cc
@@ -32,9 +32,9 @@ void PrefMetricsService::RecordHomePageLaunchMetrics(bool show_home_button, bool homepage_is_ntp, const GURL& homepage_url) { - UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton", show_home_button); + UMA_HISTOGRAM_BOOLEAN("Settings.ShowHomeButton2", show_home_button); if (show_home_button) { - UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage", + UMA_HISTOGRAM_BOOLEAN("Settings.GivenShowHomeButton_HomePageIsNewTabPage2", homepage_is_ntp); } @@ -46,7 +46,7 @@ // pages, e.g. plus.google.com). if (!homepage_is_ntp) { if (homepage_url.is_valid()) { - UMA_HISTOGRAM_ENUMERATION("Settings.HomePageEngineType", + UMA_HISTOGRAM_ENUMERATION("Settings.HomePageEngineType2", SearchEngineUtils::GetEngineType(homepage_url), SEARCH_ENGINE_MAX); } @@ -70,7 +70,7 @@ #if !BUILDFLAG(IS_ANDROID) int restore_on_startup = prefs_->GetInteger(prefs::kRestoreOnStartup); UMA_HISTOGRAM_ENUMERATION( - "Settings.StartupPageLoadSettings", restore_on_startup, + "Settings.StartupPageLoadSettings2", restore_on_startup, static_cast<int>(SessionStartupPref::kPrefValueMax)); if (SessionStartupPref( SessionStartupPref::PrefValueToType(restore_on_startup)) @@ -83,7 +83,7 @@ if (url_text) { GURL start_url(*url_text); if (start_url.is_valid()) { - UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageEngineTypes", + UMA_HISTOGRAM_ENUMERATION("Settings.StartupPageEngineTypes2", SearchEngineUtils::GetEngineType(start_url), SEARCH_ENGINE_MAX); } @@ -108,7 +108,15 @@ PrefMetricsService::Factory::Factory() : ProfileKeyedServiceFactory( "PrefMetricsService", - ProfileSelections::BuildRedirectedInIncognito()) { + ProfileSelections::Builder() + .WithRegular(ProfileSelection::kOriginalOnly) + // Not needed for any other profile types because these settings + // is only configurable by the profile owner for regular + // browser profiles. + .WithGuest(ProfileSelection::kNone) + .WithSystem(ProfileSelection::kNone) + .WithAshInternals(ProfileSelection::kNone) + .Build()) { DependsOn(TemplateURLServiceFactory::GetInstance()); } @@ -116,8 +124,9 @@ } KeyedService* PrefMetricsService::Factory::BuildServiceInstanceFor( - content::BrowserContext* profile) const { - return new PrefMetricsService(static_cast<Profile*>(profile)); + content::BrowserContext* context) const { + Profile* profile = Profile::FromBrowserContext(context); + return new PrefMetricsService(profile); } bool PrefMetricsService::Factory::ServiceIsCreatedWithBrowserContext() const {
diff --git a/chrome/browser/prefs/pref_metrics_service.h b/chrome/browser/prefs/pref_metrics_service.h index a3228e2..3f1d316 100644 --- a/chrome/browser/prefs/pref_metrics_service.h +++ b/chrome/browser/prefs/pref_metrics_service.h
@@ -25,7 +25,7 @@ ~PrefMetricsService() override; - // Records metrics about the state of the homepage on launch. + // Records metrics about various per-profile configurations on profile open. static void RecordHomePageLaunchMetrics(bool show_home_button, bool homepage_is_ntp, const GURL& homepage_url); @@ -42,7 +42,7 @@ // BrowserContextKeyedServiceFactory implementation KeyedService* BuildServiceInstanceFor( - content::BrowserContext* profile) const override; + content::BrowserContext* context) const override; bool ServiceIsCreatedWithBrowserContext() const override; };
diff --git a/chrome/browser/privacy/BUILD.gn b/chrome/browser/privacy/BUILD.gn index aad92a5..aec7e7b5 100644 --- a/chrome/browser/privacy/BUILD.gn +++ b/chrome/browser/privacy/BUILD.gn
@@ -72,8 +72,16 @@ } if (is_win || is_linux || is_android || is_chromeos) { + import("//components/policy/tools/generate_policy_source.gni") import("//third_party/protobuf/proto_library.gni") + # Generate chrome_settings.proto. + generate_policy_source("policy_code_generate") { + chunking = false + generate_cc = false + generate_app_restrictions = false + } + # Generate Python bindings for traffic_annotation.proto, for use with # auditor.py. This lets us run auditor.py after simply building the chrome # target. @@ -82,14 +90,13 @@ ":traffic_annotation_proto", ":traffic_annotation_proto_gen", ] - sources = - [ "$root_gen_dir" + "/components/policy/proto/chrome_settings.proto" ] + sources = [ "$root_gen_dir" + + "/chrome/browser/privacy/proto/chrome_settings.proto" ] - # import policy_common_definitions.proto + # Import policy_common_definitions.proto. import_dirs = [ "//components/policy/proto" ] - # generate chrome_settings.proto - proto_deps = [ "//components/policy:policy_code_generate" ] + proto_deps = [ ":policy_code_generate" ] proto_out_dir = "chrome/browser/privacy" generate_cc = false generate_library = false @@ -117,7 +124,7 @@ ] import_dirs = [ # chrome_settings.proto - "$root_gen_dir" + "/components/policy/proto", + "$root_gen_dir" + "/chrome/browser/privacy/proto", # chrome_device_policy.proto "//components/policy/proto",
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc index 8bed093..d982b4e 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate.cc
@@ -15,7 +15,11 @@ namespace { -bool PrivacySandboxRestrictedByAcccountCapability(Profile* profile) { +bool PrivacySandboxRestrictedByAccountCapability(Profile* profile) { + if (privacy_sandbox::kPrivacySandboxSettings4ForceRestrictedUserForTesting + .Get()) { + return true; + } auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); if (!identity_manager || @@ -52,7 +56,7 @@ } bool restricted_by_capability = - PrivacySandboxRestrictedByAcccountCapability(profile_); + PrivacySandboxRestrictedByAccountCapability(profile_); // If the capability is restricting the Sandbox, "latch", so the sandbox is // always restricted.
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc index e94a8db..fb6f78b 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc
@@ -134,3 +134,13 @@ prefs()->SetBoolean(prefs::kPrivacySandboxTopicsConsentGiven, false); EXPECT_FALSE(delegate()->HasAppropriateTopicsConsent()); } + +TEST_F(PrivacySandboxSettingsDelegateTest, + CapabilityRestrictionWhenForcedRestictedUser) { + feature_list()->InitAndEnableFeatureWithParameters( + privacy_sandbox::kPrivacySandboxSettings4, + {{privacy_sandbox::kPrivacySandboxSettings4ForceRestrictedUserForTesting + .name, + "true"}}); + EXPECT_TRUE(delegate()->IsPrivacySandboxRestricted()); +}
diff --git a/chrome/browser/profiles/delete_profile_helper.cc b/chrome/browser/profiles/delete_profile_helper.cc index ce481ef..ae4096aa 100644 --- a/chrome/browser/profiles/delete_profile_helper.cc +++ b/chrome/browser/profiles/delete_profile_helper.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/profiles/delete_profile_helper.h" +#include <memory> + #include "base/check.h" #include "base/feature_list.h" #include "base/files/file_path.h" @@ -18,6 +20,7 @@ #include "chrome/browser/download/download_core_service.h" #include "chrome/browser/download/download_core_service_factory.h" #include "chrome/browser/password_manager/password_store_factory.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" #include "chrome/browser/profiles/nuke_profile_directory_utils.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" @@ -126,7 +129,8 @@ } void DeleteProfileHelper::ScheduleEphemeralProfileForDeletion( - const base::FilePath& profile_dir) { + const base::FilePath& profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive) { DCHECK(IsRegisteredAsEphemeral( &profile_manager_->GetProfileAttributesStorage(), profile_dir)); DCHECK_EQ(0u, chrome::GetBrowserCount( @@ -143,7 +147,8 @@ DCHECK(!new_active_profile_dir->empty()); RemoveFromLastActiveProfilesPrefList(profile_dir); - FinishDeletingProfile(profile_dir, new_active_profile_dir.value()); + FinishDeletingProfile(profile_dir, new_active_profile_dir.value(), + std::move(keep_alive)); } void DeleteProfileHelper::CleanUpEphemeralProfiles() { @@ -240,7 +245,12 @@ profile_manager_->GetProfileByPath(last_used_profile_path); if (last_used_profile_path != profile_dir && last_used_profile_path != guest_profile_path && last_used_profile) { - FinishDeletingProfile(profile_dir, last_used_profile_path); + Profile* profile = profile_manager_->GetProfileByPath(profile_dir); + FinishDeletingProfile( + profile_dir, last_used_profile_path, + profile ? std::make_unique<ScopedProfileKeepAlive>( + profile, ProfileKeepAliveOrigin::kProfileDeletionProcess) + : nullptr); return; } @@ -292,7 +302,8 @@ void DeleteProfileHelper::FinishDeletingProfile( const base::FilePath& profile_dir, - const base::FilePath& new_active_profile_dir) { + const base::FilePath& new_active_profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive) { // Update the last used profile pref before closing browser windows. This // way the correct last used profile is set for any notification observers. profiles::SetLastUsedProfile(new_active_profile_dir.BaseName()); @@ -302,7 +313,8 @@ profile_manager_->LoadProfileByPath( profile_dir, false, base::BindOnce(&DeleteProfileHelper::OnLoadProfileForProfileDeletion, - base::Unretained(this), profile_dir)); + base::Unretained(this), profile_dir, + std::move(keep_alive))); if (!IsProfileDirectoryMarkedForDeletion(profile_dir)) { // Prevents CreateProfileAsync from re-creating the profile. MarkProfileDirectoryForDeletion(profile_dir); @@ -311,6 +323,7 @@ void DeleteProfileHelper::OnLoadProfileForProfileDeletion( const base::FilePath& profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive, Profile* profile) { ProfileAttributesStorage& storage = profile_manager_->GetProfileAttributesStorage(); @@ -392,6 +405,13 @@ return; } - FinishDeletingProfile(profile_to_delete_path, new_active_profile_path); + Profile* profile_to_delete = + profile_manager_->GetProfileByPath(profile_to_delete_path); + FinishDeletingProfile( + profile_to_delete_path, new_active_profile_path, + profile_to_delete ? std::make_unique<ScopedProfileKeepAlive>( + profile_to_delete, + ProfileKeepAliveOrigin::kProfileDeletionProcess) + : nullptr); std::move(callback).Run(loaded_profile); }
diff --git a/chrome/browser/profiles/delete_profile_helper.h b/chrome/browser/profiles/delete_profile_helper.h index d2b5da4..e529c24f 100644 --- a/chrome/browser/profiles/delete_profile_helper.h +++ b/chrome/browser/profiles/delete_profile_helper.h
@@ -7,6 +7,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/raw_ref.h" +#include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h" #include "chrome/browser/profiles/profile_metrics.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -51,7 +52,9 @@ // Schedules the ephemeral profile at the given path to be deleted. New // profiles will not be created. If the profile is not loaded, this may // trigger a reload of the profile so that user data is cleaned up. - void ScheduleEphemeralProfileForDeletion(const base::FilePath& profile_dir); + void ScheduleEphemeralProfileForDeletion( + const base::FilePath& profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive); // Checks if any profiles are left behind (e.g. because of a browser // crash) and schedule them for deletion. Unlike the "Schedule" methods above, @@ -73,10 +76,14 @@ // Schedules the profile at the given path to be deleted on shutdown, // and marks the new profile as active. - void FinishDeletingProfile(const base::FilePath& profile_dir, - const base::FilePath& new_active_profile_dir); - void OnLoadProfileForProfileDeletion(const base::FilePath& profile_dir, - Profile* profile); + void FinishDeletingProfile( + const base::FilePath& profile_dir, + const base::FilePath& new_active_profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive); + void OnLoadProfileForProfileDeletion( + const base::FilePath& profile_dir, + std::unique_ptr<ScopedProfileKeepAlive> keep_alive, + Profile* profile); // If the `loaded_profile` has been loaded successfully and isn't already // scheduled for deletion, then finishes adding `profile_to_delete_dir` to the
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 79634dd..ff5d412a 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.cc
@@ -69,6 +69,8 @@ return out << "kProfileCreationSamlFlow"; case ProfileKeepAliveOrigin::kDriveFsNativeMessageHostLacros: return out << "kDriveFsNativeMessageHostLacros"; + case ProfileKeepAliveOrigin::kProfileDeletionProcess: + return out << "kProfileDeletionProcess"; } NOTREACHED(); return out << static_cast<int>(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 378d062f..b9de360 100644 --- a/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h +++ b/chrome/browser/profiles/keep_alive/profile_keep_alive_types.h
@@ -86,6 +86,9 @@ kExtensionUpdater = 18, // This profile is being created (and is used to render GAIA sign-in flow). + // The profile creation flow either opens a browser window before + // kProfileCreationFlow keep alive is released or gets aborted without opening + // a browser window and in that case the profile should be removed. kProfileCreationFlow = 19, // The user just closed a notification. This might cause writing to the @@ -135,7 +138,13 @@ // This keeps the profile alive while the connection is active. kDriveFsNativeMessageHostLacros = 31, - kMaxValue = kDriveFsNativeMessageHostLacros, + // Used during the deletion process for the respective profile. Avoids the + // profile from being randomly unloaded. Useful to keep an ephemeral profile + // alive until their deletion is completed, after releasing its last keep + // alive. + kProfileDeletionProcess = 32, + + kMaxValue = kProfileDeletionProcess, }; std::ostream& operator<<(std::ostream& out,
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc index 2be5b51..1424aac 100644 --- a/chrome/browser/profiles/profile_downloader.cc +++ b/chrome/browser/profiles/profile_downloader.cc
@@ -193,10 +193,8 @@ cookies_allowed: NO setting: "This feature cannot be disabled by settings." chrome_policy { - subProto1 { - UserAvatarCustomizationSelectorsEnabled { - UserAvatarCustomizationSelectorsEnabled: false - } + UserAvatarCustomizationSelectorsEnabled { + UserAvatarCustomizationSelectorsEnabled: false } } })");
diff --git a/chrome/browser/profiles/profile_keyed_service_browsertest.cc b/chrome/browser/profiles/profile_keyed_service_browsertest.cc index dc7e739..46865b3f1 100644 --- a/chrome/browser/profiles/profile_keyed_service_browsertest.cc +++ b/chrome/browser/profiles/profile_keyed_service_browsertest.cc
@@ -441,7 +441,6 @@ "PluginManager", "PluginPrefs", "PowerBookmarkService", - "PrefMetricsService", "PrefWatcher", "PreferenceAPI", "PrimaryAccountPolicyManager",
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc index a76c36c..ae49a80a 100644 --- a/chrome/browser/profiles/profile_manager.cc +++ b/chrome/browser/profiles/profile_manager.cc
@@ -1289,6 +1289,7 @@ << "). keep_alives=" << info->keep_alives; if (origin == ProfileKeepAliveOrigin::kBrowserWindow || + origin == ProfileKeepAliveOrigin::kProfileCreationFlow || (origin == ProfileKeepAliveOrigin::kProfilePickerView && base::FeatureList::IsEnabled(features::kDestroySystemProfiles))) { ClearFirstBrowserWindowKeepAlive(profile); @@ -1302,7 +1303,8 @@ CHECK(profile); CHECK(!profile->IsOffTheRecord()); - ProfileInfo* info = GetProfileInfoByPath(profile->GetPath()); + const base::FilePath profile_path = profile->GetPath(); + ProfileInfo* info = GetProfileInfoByPath(profile_path); if (!info) { // Can be null in unit tests, when the Profile was not created via // ProfileManager. @@ -1315,6 +1317,22 @@ } DCHECK(base::Contains(info->keep_alives, origin)); + +#if !BUILDFLAG(IS_ANDROID) + // When removing the last keep alive of an ephemeral profile, schedule the + // profile for deletion if it is not yet marked. + bool ephemeral = + IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), profile_path); + bool marked_for_deletion = IsProfileDirectoryMarkedForDeletion(profile_path); + if (ephemeral && !marked_for_deletion && + GetTotalRefCount(info->keep_alives) == 1) { + delete_profile_helper_->ScheduleEphemeralProfileForDeletion( + profile_path, + std::make_unique<ScopedProfileKeepAlive>( + profile, ProfileKeepAliveOrigin::kProfileDeletionProcess)); + } +#endif + info->keep_alives[origin]--; DCHECK_LE(0, info->keep_alives[origin]); @@ -2060,16 +2078,8 @@ } base::FilePath path = profile->GetPath(); - ProfileInfo* info = GetProfileInfoByPath(path); if (IsProfileDirectoryMarkedForDeletion(path)) { // Do nothing if the profile is already being deleted. - } else if (IsRegisteredAsEphemeral(&GetProfileAttributesStorage(), path) && - info->keep_alives[ProfileKeepAliveOrigin::kProfileCreationFlow] == - 0) { - // Delete if the profile is an ephemeral profile and it is not in the - // profile creation flow. - // TODO(crbug.com/1369535): Delete the profile when there is no keep alive. - delete_profile_helper_->ScheduleEphemeralProfileForDeletion(path); } else if (!profile->IsOffTheRecord()) { auto* browsing_data_lifetime_manager = ChromeBrowsingDataLifetimeManagerFactory::GetForProfile(
diff --git a/chrome/browser/profiles/profile_manager_browsertest.cc b/chrome/browser/profiles/profile_manager_browsertest.cc index aea2e439f..91c24fc 100644 --- a/chrome/browser/profiles/profile_manager_browsertest.cc +++ b/chrome/browser/profiles/profile_manager_browsertest.cc
@@ -40,6 +40,7 @@ #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/profile_deletion_observer.h" #include "chrome/test/base/testing_browser_process.h" #include "components/keep_alive_registry/keep_alive_types.h" #include "components/keep_alive_registry/scoped_keep_alive.h" @@ -707,7 +708,7 @@ EXPECT_EQ(initial_profile_count + 1U, storage.GetNumberOfProfiles()); // The second should though. - MultipleProfileDeletionObserver observer(1u); + ProfileDeletionObserver observer; CloseBrowserSynchronously(browser_list->get(1)); observer.Wait();
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js index 132548f9..370fa9d9 100644 --- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js +++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_ui_test.js
@@ -212,10 +212,8 @@ }); }); -// TODO(crbug.com/1432222): This test is flaky. AX_TEST_F( - 'DictationUIE2ETest', 'DISABLED_HintsTimeoutWithChromeVox', - async function() { + 'DictationUIE2ETest', 'HintsTimeoutWithChromeVox', async function() { // Turn on ChromeVox await this.setPref(Dictation.SPOKEN_FEEDBACK_PREF, true); // Wait for the callbacks to Dictation.
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index a6eb719..57faee3b 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -268,7 +268,6 @@ "screens/common/adb_sideloading.js", "screens/common/app_downloading.js", "screens/common/app_launch_splash.js", - "screens/common/arc_terms_of_service.js", "screens/common/assistant_optin.js", "screens/common/autolaunch.js", "screens/common/choobe.js",
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.js b/chrome/browser/resources/chromeos/login/debug/debug.js index a8ad1b2..ad7d21c5 100644 --- a/chrome/browser/resources/chromeos/login/debug/debug.js +++ b/chrome/browser/resources/chromeos/login/debug/debug.js
@@ -1342,26 +1342,6 @@ ], }, { - id: 'arc-tos', - kind: ScreenKind.NORMAL, - states: [ - { - id: 'us-terms-loaded', - trigger: (screen) => { - screen.clearDemoMode(); - screen.reloadPlayStoreToS(); - }, - }, - { - id: 'demo-mode', - trigger: (screen) => { - screen.setupForDemoMode(); - screen.reloadPlayStoreToS(); - }, - }, - ], - }, - { id: 'arc-vm-data-migration', kind: ScreenKind.NORMAL, },
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js index 24009e2..8cca757 100644 --- a/chrome/browser/resources/chromeos/login/screens.js +++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -9,7 +9,6 @@ import './screens/common/adb_sideloading.js'; import './screens/common/app_downloading.js'; import './screens/common/app_launch_splash.js'; -import './screens/common/arc_terms_of_service.js'; import './screens/common/assistant_optin.js'; import './screens/common/autolaunch.js'; import './screens/common/choobe.js'; @@ -75,11 +74,6 @@ {tag: 'adb-sideloading-element', id: 'adb-sideloading'}, {tag: 'app-downloading-element', id: 'app-downloading'}, {tag: 'app-launch-splash-element', id: 'app-launch-splash'}, - { - tag: 'arc-tos-element', - id: 'arc-tos', - extra_classes: ['right', 'arc-tos-loading'], - }, {tag: 'assistant-optin-element', id: 'assistant-optin-flow'}, {tag: 'autolaunch-element', id: 'autolaunch'}, {
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index 6b044aee..874cae7 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -29,7 +29,6 @@ ":adb_sideloading", ":app_downloading", ":app_launch_splash", - ":arc_terms_of_service", #":assistant_optin", ":autolaunch", @@ -112,29 +111,6 @@ extra_deps = [ ":web_components" ] } -js_library("arc_terms_of_service") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js" ] - deps = [ - "../../:display_manager", - "../../components:oobe_select", - "../../components:web_view_helper", - "../../components:web_view_loader", - "../../components/behaviors:oobe_dialog_host_behavior", - "../../components/behaviors:oobe_i18n_behavior", - "../../components/buttons:oobe_back_button", - "../../components/buttons:oobe_text_button", - "../../components/dialogs:oobe_adaptive_dialog", - "../../components/dialogs:oobe_loading_dialog", - "../../components/dialogs:oobe_modal_dialog", - ] - - externs_list = [ - "$externs_path/chrome_extensions.js", - "$externs_path/webview_tag.js", - ] - extra_deps = [ ":web_components" ] -} - js_library("assistant_optin") { sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js" ] deps = [] @@ -682,7 +658,6 @@ "cryptohome_recovery_setup.js", "app_downloading.js", "app_launch_splash.js", - "arc_terms_of_service.js", "assistant_optin.js", "autolaunch.js", "choobe.js",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html deleted file mode 100644 index 64ae312..0000000 --- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html +++ /dev/null
@@ -1,254 +0,0 @@ -<!-- -Copyright 2017 The Chromium Authors -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<style include="oobe-dialog-host-styles"> - #arcTosContainer p { - color: rgba(0, 0, 0, 0.54); - line-height: 20px; - margin: 0; - padding: 0; - } - - cr-checkbox { - --cr-checkbox-label-padding-start: 16px; - } - - .parameter-section { - margin: 0; - max-width: 590px; - padding: 0 20px 16px 20px; - } - - #arcPolicyLink { - margin: 0; - padding: 16px 0 16px 20px; - } - - #arcGoogleServiceConfirmation { - font-weight: 600; - } - - #arcTosContainer::-webkit-scrollbar { - display: none; - } - - #arcTosOverlayWebview { - border: 1px solid #d9d9d9; - display: flex; - height: 300px; - width: 100%; - } - - #arcTosOverlayWebviewContainer { - box-sizing: border-box; - height: 332px; - margin: auto; - padding: 24px 8px 8px 8px; - width: 100%; - } -</style> - -<!-- LOADING DIALOG --> -<oobe-loading-dialog id="arcTosLoadingDialog" for-step="loading" - role="dialog" - aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]" - title-key="arcTermsOfServiceLoading"> - <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> -</oobe-loading-dialog> - -<!-- ERROR DIALOG --> -<oobe-adaptive-dialog id="arcTosErrorDialog" for-step="error" - role="dialog" - aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]"> - <iron-icon slot="icon" icon="oobe-32:warning"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'arcTermsOfServiceErrorTitle')]] - </h1> - <p slot="subtitle"> - [[i18nDynamic(locale, 'arcTermsOfServiceErrorMessage')]] - </p> - <div slot="content" class="flex layout vertical center center-justified"> - <img src="images/error.svg" class="oobe-illustration"> - </div> - <div slot="bottom-buttons"> - <oobe-text-button id="arcTosRetryButton" class="focus-on-show" - inverse on-click="onRetry_" - text-key="arcTermsOfServiceRetryButton"></oobe-text-button> - </div> -</oobe-adaptive-dialog> - -<!-- As this dialog have pre-loading logic that require access to elements, - dialog is marked as no-lazy. --> -<oobe-adaptive-dialog id="arcTosDialog" for-step="loaded" - role="dialog" aria-label$="[[getDialogTitle_(locale, isChild)]]" - no-lazy> - <iron-icon src="../../../arc_support/icon/playstore.svg" slot="icon"> - </iron-icon> - <h1 slot="title"> - [[getDialogTitle_(locale, isChild)]] - </h1> - <p slot="subtitle" hidden="[[isChild]]"> - [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescription')]] - </p> - <p slot="subtitle" hidden="[[!isChild]]"> - [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescriptionForChild')]] - </p> - <div id="arcTosContainer" slot="content" class="flex layout vertical"> - <webview id="arcTosView" allowTransparency - role="document" class="flex oobe-tos-webview" - on-contentload="onTermsViewContentLoad_"> - </webview> - <div id="arcPolicyLink" class="arc-tos-content" - on-click="onPolicyLinkClick_"> - <a class="oobe-local-link" is="action-link"> - [[i18nDynamic(locale, 'arcPolicyLink')]] - </a> - </div> - <div class="parameter-section arc-tos-content" - hidden="[[isMetricsHidden]]"> - <p> - <span>[[i18nDynamic(locale, metricsTextKey)]]</span> - <a id="learnMoreLinkMetrics" class="oobe-local-link" - on-click="onMetricsLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </div> - <div id="arcTosMetricsDemoApps" - class="parameter-section arc-tos-content" - hidden="[[!demoMode]]"> - <p>[[i18nDynamic(locale, 'arcTextMetricsDemoApps')]]</p> - </div> - <div id="arcBackupService" - class="parameter-section arc-tos-content" - disabled="[[backupRestoreManaged]]" - hidden="[[demoMode]]"> - <cr-checkbox id="arcEnableBackupRestore" - class="layout start" - checked="{{backupRestore}}" - disabled="[[backupRestoreManaged]]"> - <p> - <span>[[i18nDynamic(locale, 'arcTextBackupRestore')]]</span> - <a id="learnMoreLinkBackupRestore" class="oobe-local-link" - on-click="onBackupRestoreLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </cr-checkbox> - </div> - <div id="arcExtraContent" hidden="[[!showFullDialog]]"> - <div id="arcLocationService" - class="parameter-section arc-tos-content" - disabled="[[locationServiceManaged]]" - hidden="[[demoMode]]"> - <cr-checkbox id="arcEnableLocationService" - class="layout start" - checked="{{locationService}}" - disabled="[[locationServiceManaged]]"> - <p> - <span>[[i18nDynamic(locale, 'arcTextLocationService')]]</span> - <a id="learnMoreLinkLocationService" class="oobe-local-link" - on-click="onLocationServiceLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </cr-checkbox> - </div> - <div id="arcPaiService" class="parameter-section arc-tos-content"> - <p> - <span>[[i18nDynamic(locale, 'arcTextPaiService')]]</span> - <a id="learnMoreLinkPai" class="oobe-local-link" - on-click="onPaiLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </div> - <div id="arcGoogleServiceConfirmation" - class="parameter-section arc-tos-content"> - <p>[[i18nDynamic(locale, googleServiceConfirmationTextKey)]]</p> - </div> - <div id="arcReviewSettings" - class="parameter-section arc-tos-content" - hidden="[[demoMode]]"> - <cr-checkbox id="arcReviewSettingsCheckbox" - class="layout start" - checked="{{reviewSettings}}"> - <p>[[i18nDynamic(locale, 'arcTextReviewSettings')]]</p> - </cr-checkbox> - </div> - </div> - </div> - <div slot="back-navigation"> - <oobe-back-button id="arcTosBackButton" hidden="[[!demoMode]]" - on-click="onBack_"></oobe-back-button> - </div> - <div slot="bottom-buttons"> - <oobe-text-button id="arcTosNextButton" class="focus-on-show" - inverse on-click="onNext_" - disabled="[[arcTosButtonsDisabled]]" - hidden="[[showFullDialog]]" - text-key="arcTermsOfServiceNextButton"></oobe-text-button> - <oobe-text-button id="arcTosAcceptButton" - inverse on-click="onAccept_" - disabled="[[arcTosButtonsDisabled]]" - hidden="[[!showFullDialog]]" - text-key="[[acceptTextKey]]"></oobe-text-button> - </div> -</oobe-adaptive-dialog> -<oobe-modal-dialog id="arcMetricsPopup" on-close="onOverlayClosed_" - title-key="arcLearnMoreStatisticsTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP3')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP4')]]</p> - </div> -</oobe-modal-dialog> -<oobe-modal-dialog id="arcBackupRestorePopup" on-close="onOverlayClosed_" - title-key="arcLearnMoreBackupAndRestoreTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP3')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP4')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP5')]]</p> - </div> -</oobe-modal-dialog> -<oobe-modal-dialog id="arcBackupRestoreChildPopup" - on-close="onOverlayClosed_" - title-key="arcLearnMoreBackupAndRestoreTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP3')]]</p> - </div> -</oobe-modal-dialog> -<oobe-modal-dialog id="arcLocationServicePopup" - on-close="onOverlayClosed_" - title-key="arcLearnMoreLocationServiceTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP2')]]</p> - </div> -</oobe-modal-dialog> -<oobe-modal-dialog id="arcPaiPopup" on-close="onOverlayClosed_" - title-key="arcLearnMorePaiServiceTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMorePaiService')]]</p> - </div> -</oobe-modal-dialog> -<oobe-modal-dialog id="arcTosOverlayPrivacyPolicy" - on-close="onOverlayClosed_"> - <div slot="content" id = "arcTosOverlayWebviewContainer"> - <webview id="arcTosOverlayWebview" - hidden="[[overlayLoading_]]" class="flex oobe-tos-webview" - on-contentload="onAcrTosOverlayContentLoad_"> - </webview> - <throbber-notice class="flex layout center-justified vertical" - hidden="[[!overlayLoading_]]" style="height: 100%;"> - </throbber-notice> - </div> -</oobe-modal-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js deleted file mode 100644 index 74bd695..0000000 --- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js +++ /dev/null
@@ -1,894 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/** - * @fileoverview Polymer element for displaying material design for ARC Terms Of - * Service screen. - */ - - -import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; -import '//resources/js/action_link.js'; -import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; -import '//resources/polymer/v3_0/paper-styles/color.js'; -import '../../components/oobe_icons.html.js'; -import '../../components/common_styles/oobe_common_styles.css.js'; -import '../../components/common_styles/oobe_dialog_host_styles.css.js'; -import '../../components/dialogs/oobe_loading_dialog.js'; - -import {loadTimeData} from '//resources/ash/common/load_time_data.m.js'; -import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.js'; -import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.js'; -import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.js'; -import {OobeTextButton} from '../../components/buttons/oobe_text_button.js'; -import {OobeAdaptiveDialog} from '../../components/dialogs/oobe_adaptive_dialog.js'; -import {OobeModalDialog} from '../../components/dialogs/oobe_modal_dialog.js'; -import {OOBE_UI_STATE} from '../../components/display_manager_types.js'; -import {getSelectedValue} from '../../components/oobe_select.js'; -import {OobeTypes} from '../../components/oobe_types.js'; -import {ContentType, WebViewHelper} from '../../components/web_view_helper.js'; -import {CLEAR_ANCHORS_CONTENT_SCRIPT, WebViewLoader} from '../../components/web_view_loader.js'; -import {Oobe} from '../../cr_ui.js'; - - -// Enum that describes the current state of the Arc Terms Of Service screen -const ArcTosState = { - LOADING: 'loading', - LOADED: 'loaded', - ERROR: 'error', -}; - -/** - * Timeout to load online ToS. - * @type {number} - */ -const ONLINE_LOAD_TIMEOUT_IN_MS = 10000; - -/** - * @constructor - * @extends {PolymerElement} - * @implements {LoginScreenBehaviorInterface} - * @implements {MultiStepBehaviorInterface} - * @implements {OobeI18nBehaviorInterface} - */ -const ArcTermsOfserviceBase = mixinBehaviors( - [OobeI18nBehavior, MultiStepBehavior, LoginScreenBehavior], PolymerElement); - -/** - * @typedef {{ - * arcBackupRestoreChildPopup: OobeModalDialog, - * arcBackupRestorePopup: OobeModalDialog, - * arcLocationServicePopup: OobeModalDialog, - * arcMetricsPopup: OobeModalDialog, - * arcTosAcceptButton: OobeTextButton, - * arcTosDialog: OobeAdaptiveDialog, - * arcTosNextButton: OobeTextButton, - * arcTosOverlayPrivacyPolicy: OobeModalDialog, - * arcTosOverlayWebview: WebView, - * arcTosRetryButton: OobeTextButton, - * arcTosView: WebView, - * arcPaiPopup: OobeModalDialog, - * }} - */ -ArcTermsOfserviceBase.$; - -/** - * @polymer - */ -class ArcTermsOfService extends ArcTermsOfserviceBase { - static get is() { - return 'arc-tos-element'; - } - - static get template() { - return html`{__html_template__}`; - } - - static get properties() { - return { - /** - * Accept, Skip and Retry buttons are disabled until content is loaded. - */ - arcTosButtonsDisabled: { - type: Boolean, - value: true, - observer: 'buttonsDisabledStateChanged_', - }, - - /** - * Indicates whether metrics text should be hidden. - */ - isMetricsHidden: { - type: Boolean, - value: false, - }, - - /** - * String id for metrics collection text. - */ - metricsTextKey: { - type: String, - value: 'arcTextMetricsEnabled', - }, - - /** - * String id of Google service confirmation text. - */ - googleServiceConfirmationTextKey: { - type: String, - value: 'arcTextGoogleServiceConfirmation', - }, - - /** - * String id of text for Accept button. - */ - acceptTextKey: { - type: String, - value: 'arcTermsOfServiceAcceptButton', - }, - - /** - * Indicates whether backup and restore should be enabled. - */ - backupRestore: { - type: Boolean, - value: true, - }, - - /** - * Indicates whether backup and restore is managed. - * If backup and restore is managed, the checkbox will be disabled. - */ - backupRestoreManaged: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether current account is child account. - */ - isChild: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether location service should be enabled. - */ - locationService: { - type: Boolean, - value: true, - }, - - /** - * Indicates whether location service is managed. - * If location service is managed, the checkbox will be disabled. - */ - locationServiceManaged: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether user will review Arc settings after login. - */ - reviewSettings: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether user sees full content of terms of service. - */ - showFullDialog: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether currently under demo mode. - */ - demoMode: { - type: Boolean, - value: false, - }, - - /** - * Indicates whether popup overlay webview is loading. - */ - overlayLoading_: { - type: Boolean, - value: true, - }, - }; - } - - constructor() { - super(); - /** - * Flag that ensures that OOBE configuration is applied only once. - * @private {boolean} - */ - this.configuration_applied_ = false; - - /** - * Flag indicating if screen was shown. - * @private {boolean} - */ - this.is_shown_ = false; - - /** - * Last focused element when overlay is shown. Used to resume focus when - * overlay is dismissed. - * @private {Object|null} - */ - this.lastFocusedElement_ = null; - - this.countryCode_ = null; - this.language_ = null; - this.pageReady_ = false; - - /** - * The hostname of the url where the terms of service will be fetched. - * Overwritten by tests to load terms of service from local test server. - */ - this.termsOfServiceHostName_ = 'https://play.google.com'; - - this.termsError = false; - this.usingOfflineTermsForTesting_ = false; - this.tosContent_ = ''; - this.reloadsLeftForTesting_ = undefined; - } - - get EXTERNAL_API() { - return [ - 'setMetricsMode', - 'setBackupAndRestoreMode', - 'setLocationServicesMode', - 'loadPlayStoreToS', - 'setArcManaged', - 'setupForDemoMode', - 'clearDemoMode', - 'setTosForTesting', - ]; - } - - defaultUIStep() { - return ArcTosState.LOADING; - } - - get UI_STEPS() { - return ArcTosState; - } - - /** @override */ - ready() { - super.ready(); - this.initializeLoginScreen('ArcTermsOfServiceScreen'); - - if (loadTimeData.valueExists('arcTosHostNameForTesting')) { - this.setTosHostNameForTesting_( - loadTimeData.getString('arcTosHostNameForTesting')); - } - } - - /** Initial UI State for screen */ - getOobeUIInitialState() { - return OOBE_UI_STATE.ONBOARDING; - } - - /** - * Event handler that is invoked just before the screen is shown. - */ - onBeforeShow() { - this.is_shown_ = true; - window.setTimeout(this.applyOobeConfiguration_.bind(this), 0); - - var isDemoModeSetup = this.isDemoModeSetup_(); - if (isDemoModeSetup) { - this.setMetricsMode('arcTextMetricsManagedEnabled', true); - } - this.acceptTextKey = isDemoModeSetup ? - 'arcTermsOfServiceAcceptAndContinueButton' : - 'arcTermsOfServiceAcceptButton'; - this.googleServiceConfirmationTextKey = isDemoModeSetup ? - 'arcAcceptAndContinueGoogleServiceConfirmation' : - 'arcTextGoogleServiceConfirmation'; - } - - /** - * Called when dialog is shown for the first time. - * - * @private - */ - applyOobeConfiguration_() { - if (this.configuration_applied_) { - return; - } - var configuration = Oobe.getInstance().getOobeConfiguration(); - if (!configuration) { - return; - } - if (this.arcTosButtonsDisabled) { - return; - } - if (configuration.arcTosAutoAccept) { - this.onAccept_(); - } - this.configuration_applied_ = true; - } - - /** - * Called whenever buttons state is updated. - * - * @private - */ - buttonsDisabledStateChanged_(newValue, oldValue) { - // Trigger applyOobeConfiguration_ if buttons are enabled and dialog is - // visible. - if (this.arcTosButtonsDisabled) { - return; - } - if (!this.is_shown_) { - return; - } - window.setTimeout(this.applyOobeConfiguration_.bind(this), 0); - } - - /** Called when dialog is hidden. */ - onBeforeHide() { - this.reset_(); - this.is_shown_ = false; - } - - /** - * Resets UI elements to their initial state. - * @private - */ - reset_() { - this.showFullDialog = false; - this.$.arcTosNextButton.focus(); - } - - /** - * Makes sure that UI is initialized. - * - * @private - * @suppress {missingProperties} as WebView type has no addContentScripts - */ - ensureInitialized_() { - if (this.pageReady_) { - return; - } - - this.pageReady_ = true; - - var termsView = this.$.arcTosView; - - // Open links from webview in overlay dialog. - var self = this; - termsView.addEventListener('newwindow', function(event) { - event.preventDefault(); - self.showUrlOverlay(event.targetUrl); - }); - - termsView.addContentScripts([{ - name: 'postProcess', - matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], - css: {files: ['arc_support/playstore.css']}, - js: {files: ['arc_support/playstore.js']}, - run_at: 'document_end', - }]); - - var overlayUrl = this.$.arcTosOverlayWebview; - overlayUrl.addContentScripts([{ - name: 'postProcess', - matches: ['https://support.google.com/*'], - css: {files: ['arc_support/overlay.css']}, - run_at: 'document_end', - }]); - } - - /** - * Opens external URL in popup overlay. - * @param {string} targetUrl to show in overlay webview. - */ - showUrlOverlay(targetUrl) { - if (this.usingOfflineTermsForTesting_) { - const TERMS_URL = 'chrome://terms/arc/privacy_policy'; - WebViewHelper.loadUrlContentToWebView( - this.$.arcTosOverlayWebview, TERMS_URL, - ContentType.PDF); - } else { - const overlayWebview = this.$.arcTosOverlayWebview; - if (this.isDemoModeSetup_()) { - this.setClearAnchorScriptForWebview_(overlayWebview); - } - overlayWebview.src = targetUrl; - } - - this.lastFocusedElement_ = this.shadowRoot.activeElement; - this.overlayLoading_ = true; - this.$.arcTosOverlayPrivacyPolicy.showDialog(); - } - - /** - * Returns current language that can be updated in OOBE flow. If OOBE flow - * does not exist then use navigator.language. - * - * @private - */ - getCurrentLanguage_() { - const LANGUAGE_LIST_ID = 'languageList'; - if (loadTimeData.valueExists(LANGUAGE_LIST_ID)) { - var languageList = /** @type {!Array<OobeTypes.LanguageDsc>} */ ( - loadTimeData.getValue(LANGUAGE_LIST_ID)); - if (languageList) { - var language = getSelectedValue(languageList); - if (language) { - return language; - } - } - } - return navigator.language; - } - - /** - * Sets current metrics mode. - * @param {string} textKey Key of the text which describes current metrics - * state. - * @param {boolean} visible If metrics text is visible. - */ - setMetricsMode(textKey, visible) { - this.isMetricsHidden = !visible; - this.metricsTextKey = textKey; - } - - /** - * Sets current backup and restore mode. - * @param {boolean} enabled Defines the value for backup and restore - * checkbox. - * @param {boolean} managed Defines whether this setting is set by policy. - */ - setBackupAndRestoreMode(enabled, managed) { - this.backupRestore = enabled; - this.backupRestoreManaged = managed; - } - - /** - * Sets current usage of location service opt in mode. - * @param {boolean} enabled Defines the value for location service opt in. - * @param {boolean} managed Defines whether this setting is set by policy. - */ - setLocationServicesMode(enabled, managed) { - this.locationService = enabled; - this.locationServiceManaged = managed; - } - - /** - * Loads Play Store ToS in case country code has been changed or previous - * attempt failed. - * @param {string} countryCode Country code based on current timezone. - * @suppress {missingProperties} as WebView type has no addContentScripts - */ - loadPlayStoreToS(countryCode) { - // Make sure page is initialized for login mode. For OOBE mode, page is - // initialized as result of handling updateLocalizedContent. - this.ensureInitialized_(); - - var language = this.getCurrentLanguage_(); - countryCode = countryCode.toLowerCase(); - - if (this.language_ && this.language_ == language && this.countryCode_ && - this.countryCode_ == countryCode && this.uiStep != ArcTosState.ERROR && - !this.usingOfflineTermsForTesting_ && this.tosContent_) { - this.enableButtons_(true); - return; - } - - // Store current ToS parameters. - this.language_ = language; - this.countryCode_ = countryCode; - - var scriptSetParameters = 'document.countryCode = \'' + countryCode + '\';'; - scriptSetParameters += 'document.language = \'' + language + '\';'; - scriptSetParameters += 'document.viewMode = \'large-view\';'; - - var termsView = this.$.arcTosView; - - termsView.removeContentScripts(['preProcess']); - termsView.addContentScripts([{ - name: 'preProcess', - matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], - js: {code: scriptSetParameters}, - run_at: 'document_start', - }]); - - // Try to use currently loaded document first. - var self = this; - if (termsView.src != '' && this.uiStep == ArcTosState.LOADED) { - var navigateScript = 'processLangZoneTerms(true, \'' + language + - '\', \'' + countryCode + '\');'; - termsView.executeScript({code: navigateScript}, function(results) { - if (!results || results.length != 1 || - typeof results[0] !== 'boolean' || !results[0]) { - self.reloadPlayStoreToS(); - } - }); - } else { - if (this.isDemoModeSetup_()) { - this.setClearAnchorScriptForWebview_(termsView); - } - this.reloadPlayStoreToS(); - } - } - - /** - * Sets Play Store terms of service for testing. - * @param {string} terms Fake Play Store terms of service. - */ - setTosForTesting(terms) { - this.tosContent_ = terms; - this.usingOfflineTermsForTesting_ = true; - this.setTermsViewContentLoadedState_(); - } - - /** - * Sets Play Store hostname url used to fetch terms of service for testing. - * @param {string} hostname hostname used to fetch terms of service. - * @suppress {missingProperties} as WebView type has no addContentScripts - */ - setTosHostNameForTesting_(hostname) { - this.termsOfServiceHostName_ = hostname; - this.reloadsLeftForTesting_ = 1; - - // Enable loading content script 'arc_support/playstore.js' when fetching - // ToS from the test server. - var termsView = this.$.arcTosView; - termsView.removeContentScripts(['postProcess']); - termsView.addContentScripts([{ - name: 'postProcess', - matches: [this.getTermsOfServiceHostNameForMatchPattern_() + '/*'], - css: {files: ['arc_support/playstore.css']}, - js: {files: ['arc_support/playstore.js']}, - run_at: 'document_end', - }]); - } - - /** - * Sets if Arc is managed. ToS webview should not be visible if Arc is - * manged. - * @param {boolean} managed Defines whether this setting is set by policy. - * @param {boolean} child whether current account is a child account. - */ - setArcManaged(managed, child) { - this.$.arcTosView.hidden = managed; - this.isChild = child; - } - - /** - * On-tap event handler for Accept button. - * - * @private - */ - onAccept_() { - this.userActed('accept'); - - this.enableButtons_(false); - chrome.send('arcTermsOfServiceAccept', [ - this.backupRestore, - this.locationService, - this.reviewSettings, - this.tosContent_, - ]); - } - - /** - * Enables/Disables set of buttons: Accept, Skip, Retry. - * @param {boolean} enable Buttons are enabled if set to true. - * - * @private - */ - enableButtons_(enable) { - this.arcTosButtonsDisabled = !enable; - } - - /** - * Reloads Play Store ToS. - */ - reloadPlayStoreToS() { - if (this.reloadsLeftForTesting_ !== undefined) { - if (this.reloadsLeftForTesting_ <= 0) { - return; - } - --this.reloadsLeftForTesting_; - } - this.termsError = false; - this.usingOfflineTermsForTesting_ = false; - - const loadFailureCallback = () => { - // If in demo mode fallback to offline Terms of Service copy. - if (this.isDemoModeSetup_() && this.usingOfflineTermsForTesting_) { - const TERMS_URL = 'chrome://terms/arc/terms'; - const webView = this.$.arcTosView; - WebViewHelper.loadUrlContentToWebView( - webView, TERMS_URL, ContentType.HTML); - return; - } - this.showError_(); - }; - - const termsView = this.$.arcTosView; - const tosLoader = new WebViewLoader( - termsView, ONLINE_LOAD_TIMEOUT_IN_MS, loadFailureCallback, - this.isDemoModeSetup_() /* clear_anchors */, false /* inject_css */); - - const tosUrl = this.termsOfServiceHostName_ + '/about/play-terms.html'; - tosLoader.setUrl(tosUrl); - - this.setUIStep(ArcTosState.LOADING); - this.enableButtons_(false); - } - - /** - * Sets up the variant of the screen dedicated falsedemo mode. - */ - setupForDemoMode() { - this.demoMode = true; - } - - /** - * Sets up the variant of the screen dedicated for demo mode. - */ - clearDemoMode() { - this.demoMode = false; - } - - /** - * Returns a match pattern compatible version of termsOfServiceHostName_ by - * stripping the port number part of the hostname. During tests - * termsOfServiceHostName_ will contain a port number part. - * @return {string} - * @private - */ - getTermsOfServiceHostNameForMatchPattern_() { - return this.termsOfServiceHostName_.replace(/:[0-9]+/, ''); - } - - /** - * Handles event when terms view is loaded. - * @suppress {missingProperties} - */ - onTermsViewContentLoad_() { - if (this.termsError) { - return; - } - - var termsView = this.$.arcTosView; - - if (this.usingOfflineTermsForTesting_) { - // Process offline ToS for testing. Scripts added to web view by - // addContentScripts() are not executed when using data url. - this.tosContent_ = termsView.src; - var setParameters = - `document.body.classList.add('large-view', 'offline-terms');`; - termsView.executeScript({code: setParameters}, () => { - if (chrome.runtime.lastError) { - console.error( - 'Set parameteters failed: ' + chrome.runtime.lastError.message); - } - }); - termsView.insertCSS({file: 'arc_support/playstore.css'}); - this.setTermsViewContentLoadedState_(); - } else { - // Process online ToS. - var getToSContent = {code: 'getToSContent();'}; - termsView.executeScript(getToSContent, this.onGetToSContent_.bind(this)); - } - } - - /** Setups overlay webview loading callback */ - onAcrTosOverlayContentLoad_() { - this.overlayLoading_ = false; - } - - /** - * Handles callback for getToSContent. - */ - onGetToSContent_(results) { - if (!results || results.length != 1 || typeof results[0] !== 'string') { - this.showError_(); - return; - } - - this.tosContent_ = results[0]; - this.setTermsViewContentLoadedState_(); - } - - /** - * Sets the screen in the loaded state. Should be called after arc terms - * were loaded. - * @private - */ - setTermsViewContentLoadedState_() { - if (this.uiStep == ArcTosState.LOADED) { - return; - } - this.setUIStep(ArcTosState.LOADED); - this.enableButtons_(true); - this.showFullDialog = false; - if (this.is_shown_) { - this.$.arcTosNextButton.focus(); - } - } - - /** - * Shows error UI when terms view cannot be loaded or terms content cannot - * be fetched from webview. - */ - showError_() { - this.termsError = true; - this.setUIStep(ArcTosState.ERROR); - - this.enableButtons_(true); - this.$.arcTosRetryButton.focus(); - } - - /** - * Updates localized content of the screen that is not updated via template. - */ - updateLocalizedContent() { - this.ensureInitialized_(); - - // We might need to reload Play Store ToS in case language was changed. - if (this.countryCode_) { - this.loadPlayStoreToS(this.countryCode_); - } - } - - /** - * Returns whether arc terms are shown as a part of demo mode setup. - * @return {boolean} - * @private - */ - isDemoModeSetup_() { - return this.demoMode; - } - - onPolicyLinkClick_() { - this.userActed('policy-link'); - - var termsView = this.$.arcTosView; - var self = this; - termsView.executeScript( - {code: 'getPrivacyPolicyLink();'}, function(results) { - if (results && results.length == 1 && typeof results[0] == 'string') { - self.showUrlOverlay(results[0]); - } else { - var defaultLink = 'https://www.google.com/intl/' + - self.getCurrentLanguage_() + '/policies/privacy/'; - self.showUrlOverlay(defaultLink); - } - }); - } - - /** - * On-tap event handler for Next button. - * - * @private - */ - onNext_() { - this.userActed('next'); - - this.showFullDialog = true; - this.$.arcTosDialog.scrollToBottom(); - this.$.arcTosAcceptButton.focus(); - } - - /** - * On-tap event handler for Retry button. - * - * @private - */ - onRetry_() { - this.userActed('retry'); - this.reloadPlayStoreToS(); - } - - /** - * On-tap event handler for Back button. - * - * @private - */ - onBack_() { - this.userActed('go-back'); - } - - /** - * On-tap event handler for metrics learn more link - * @private - */ - onMetricsLearnMoreTap_() { - this.userActed('metrics-learn-more'); - this.lastFocusedElement_ = this.shadowRoot.activeElement; - this.$.arcMetricsPopup.showDialog(); - } - - /** - * On-tap event handler for backup and restore learn more link - * @private - */ - onBackupRestoreLearnMoreTap_() { - this.userActed('backup-restore-learn-more'); - this.lastFocusedElement_ = this.shadowRoot.activeElement; - if (this.isChild) { - this.$.arcBackupRestoreChildPopup.showDialog(); - } else { - this.$.arcBackupRestorePopup.showDialog(); - } - } - - /** - * On-tap event handler for location service learn more link - * @private - */ - onLocationServiceLearnMoreTap_() { - this.userActed('location-service-learn-more'); - this.lastFocusedElement_ = this.shadowRoot.activeElement; - this.$.arcLocationServicePopup.showDialog(); - } - - /** - * On-tap event handler for Play auto install learn more link - * @private - */ - onPaiLearnMoreTap_() { - this.userActed('play-auto-install-learn-more'); - this.lastFocusedElement_ = this.shadowRoot.activeElement; - this.$.arcPaiPopup.showDialog(); - } - - /* - * Callback when overlay is closed. - * @private - */ - onOverlayClosed_() { - if (this.lastFocusedElement_) { - this.lastFocusedElement_.focus(); - this.lastFocusedElement_ = null; - } - } - - /** - * Returns dialog title based on whether the active user is child. - */ - getDialogTitle_(locale, isChild) { - return isChild ? this.i18n('arcTermsOfServiceScreenHeadingForChild') : - this.i18n('arcTermsOfServiceScreenHeading'); - } - - /** - * Set up a script for webview to clear anchor of the page after loading. - */ - setClearAnchorScriptForWebview_(webview) { - webview.addContentScripts([{ - name: 'clearAnchors', - matches: ['<all_urls>'], - js: CLEAR_ANCHORS_CONTENT_SCRIPT, - }]); - webview.addEventListener('contentload', () => { - webview.executeScript(CLEAR_ANCHORS_CONTENT_SCRIPT, () => { - if (chrome.runtime.lastError) { - console.error( - 'Clear anchors script failed: ' + - chrome.runtime.lastError.message); - } - }); - }); - } -} - -customElements.define(ArcTermsOfService.is, ArcTermsOfService);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/error_message.html b/chrome/browser/resources/chromeos/login/screens/common/error_message.html index 0dfd771..e20af14 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/error_message.html +++ b/chrome/browser/resources/chromeos/login/screens/common/error_message.html
@@ -38,10 +38,10 @@ <oobe-adaptive-dialog role="dialog" id="dialog"> <iron-icon slot="icon" icon="oobe-32:wifi"> </iron-icon> - <h1 slot="title" aria-live="assertive"> + <h1 id="error-title" slot="title" aria-live="assertive"> [[getDialogTitle_(locale, errorState_, uiState_)]] </h1> - <div slot="subtitle"> + <div id="error-subtitle" slot="subtitle"> <div hidden="[[!isOneOf_(errorState_, 'kiosk-online')]]"> [[i18nDynamic(locale, 'kioskOnlineMessageBody')]] </div>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html index b0ae5f8..965ec8c 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
@@ -191,19 +191,21 @@ </oobe-text-button> </div> <div id="welcomeAnimationSlot"> - <oobe-cr-lottie - id="welcomeAnimation" - hidden="[[isMeet_]]" - animation-url="animations/welcome_screen_animation.json" - > - </oobe-cr-lottie> - <img - src="/images/cfm/welcome.svg" - class="oobe-illustration" - id="remoraWelcomeImage" - hidden="[[!isMeet_]]" - aria-hidden="true" - > + <template is="dom-if" if="[[!isMeet_]]"> + <oobe-cr-lottie + id="welcomeAnimation" + animation-url="animations/welcome_screen_animation.json" + > + </oobe-cr-lottie> + </template> + <template is="dom-if" if="[[isMeet_]]"> + <img + src="/images/cfm/welcome.svg" + class="oobe-illustration" + id="remoraWelcomeImage" + aria-hidden="true" + > + </template> </div> </div> </div>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.js b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.js index 4b906ce..26246fb 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.js
@@ -228,10 +228,9 @@ * @suppress {missingProperties} */ setVideoPlay_(play) { - if (this.isMeet_) { - return; + if (this.$$('#welcomeAnimation')) { + this.$$('#welcomeAnimation').playing = play; } - this.$.welcomeAnimation.playing = play; } /**
diff --git a/chrome/browser/resources/chromeos/login/test_api/test_api.js b/chrome/browser/resources/chromeos/login/test_api/test_api.js index 9c18d5c..6df008d 100644 --- a/chrome/browser/resources/chromeos/login/test_api/test_api.js +++ b/chrome/browser/resources/chromeos/login/test_api/test_api.js
@@ -662,6 +662,8 @@ constructor() { super('error-message'); this.offlineLink = new PolymerElementApi(this, '#error-offline-login-link'); + this.errorTitle = new PolymerElementApi(this, '#error-title'); + this.errorSubtitle = new PolymerElementApi(this, '#error-subtitle'); } /** @@ -669,7 +671,42 @@ * @return {boolean} */ isReadyForTesting() { - return this.isVisible() && this.offlineLink.isVisible(); + return this.isVisible(); + } + + /** + * + * Returns if offline link is visible. + * @return {boolean} + */ + isOfflineLinkVisible() { + return this.offlineLink.isVisible(); + } + + /** + * Returns error screen message title. + * @return {string} + */ + getErrorTitle() { + // If screen is not visible always return empty title. + if (!this.isVisible()) { + return ''; + } + + return this.errorTitle.element().innerText.trim(); + } + + /** + * Returns error screen subtitle. Includes all visible error messages. + * @return {string} + */ + getErrorReasons() { + // If screen is not visible always return empty reasons. + if (!this.isVisible()) { + return ''; + } + + return this.errorSubtitle.element().innerText.trim(); } /**
diff --git a/chrome/browser/resources/discards/graph_doc.ts b/chrome/browser/resources/discards/graph_doc.ts index 3c94f42..00fb1382 100644 --- a/chrome/browser/resources/discards/graph_doc.ts +++ b/chrome/browser/resources/discards/graph_doc.ts
@@ -47,6 +47,39 @@ // some influence but can be easily overridden. const kWeakYStrength: number = 0.1; +/** + * Helper function to return a DOM class attribute for a given tooltip object + * index. All rows in a tooltip that are part of the same describer object will + * have the same class so that they can be toggled together. + */ +function tooltipClassForIndex(objectIndex: number): string { + return `object${objectIndex}`; +} + +/** + * Helper function to toggle the visibility of a set of rows in the tooltip + * table. + */ +function toggleTooltipRows(clickedRow: HTMLElement, objectIndex: number) { + // Toggle visibility of only the value rows with the same index in the same + // tooltip. + const valueClasses = `tr.value.${tooltipClassForIndex(objectIndex)}`; + const tooltip = d3.select(clickedRow.parentElement); + const isCollapsed = tooltip.select(valueClasses).classed('collapsed'); + tooltip.selectAll(valueClasses).classed('collapsed', !isCollapsed); +} + +class ToolTipRowData { + // The contents of each cell in the row. + contents: [string, string]; + + // Class to apply to the <tr> element. + rowClass: 'heading'|'value'; + + // Index used to group rows in the same object. + objectIndex: number; +} + class ToolTip { floating: boolean = true; x: number; @@ -117,105 +150,169 @@ * {@code object}. * @param flattened The flattened object being built. * @param path The current flattened path. + * @param objectIndex An index used to identify this object in expanding + * table rows. * @param object The nested dict to be flattened. + * @returns The last index used by any sub-object of this object. */ function flattenObjectRec( - visited: Set<object>, flattened: {[key: string]: any}, path: string, - object: {[key: string]: any}) { + visited: Set<object>, flattened: ToolTipRowData[], path: string, + objectIndex: number, object: {[key: string]: any}): number { if (typeof object !== 'object' || visited.has(object)) { - return; + return objectIndex; } visited.add(object); + objectIndex++; + + // When entering a nested object, add a header row. + if (path) { + flattened.push({ + contents: [path, ''], + rowClass: 'heading', + objectIndex: objectIndex, + }); + } + + const subObjects: Array<[string, object]> = []; for (const [key, value] of Object.entries(object)) { - const fullPath = path ? `${path}.${key}` : key; - // Recurse on non-null objects. + // Save non-null objects for recursion at bottom of list. if (!!value && typeof value === 'object') { - flattenObjectRec( - visited, flattened, fullPath, - /** @type {!Object<?,?>} */ (value)); + subObjects.push([key, value]); } else { // Everything else is considered a leaf value. - flattened[fullPath] = value; + let strValue = String(value); + if (strValue.length > 50) { + strValue = `${strValue.substring(0, 47)}...`; + } + flattened.push({ + contents: [key, strValue], + rowClass: 'value', + objectIndex: objectIndex, + }); } } + // Now recurse into sub-objects. + for (const [key, value] of subObjects) { + const fullPath = path ? `${path} > ${key}` : key; + objectIndex = + flattenObjectRec(visited, flattened, fullPath, objectIndex, value); + } + return objectIndex; } /** * Recursively flattens an Object of key/value pairs. Nested objects will be - * flattened to paths with a . separator between each key. If there are - * circular dependencies, they will not be expanded. + * flattened to a list with a subheader row showing the nested key. Each + * list element includes metadata that will be used to format a table row. + * + * Nested objects are always sorted to the end. If there are circular + * dependencies, they will not be expanded. * * For example, converting: * - * { + * 'describer': { * 'foo': 'hello', * 'bar': 1, * 'baz': { * 'x': 43.5, - * 'y': 'fox' - * 'z': [1, 2] + * 'y': 'fox', + * 'z': [1, 2], + * 'a': 0, * }, + * 'monkey': 3, * 'self': (reference to self) * } * * will yield: * - * { - * 'foo': 'hello', - * 'bar': 1, - * 'baz.x': 43.5, - * 'baz.y': 'fox', - * 'baz.z.0': '1', - * 'baz.y.1': '2' - * } + * [ + * {contents: ['describer', ''], rowClass: 'header', objectIndex: 1}, + * {contents: ['foo', 'hello'], rowClass: 'value', objectIndex: 1}, + * {contents: ['bar', '1'], rowClass: 'value', objectIndex: 1}, + * {contents: ['monkey', '3]', rowClass: 'value', objectIndex: 1}, + * {contents: ['describer > baz', ''], rowClass: 'header', + * objectIndex: 2}, + * {contents: ['x', '43.5'], rowClass: 'value', objectIndex: 2}, + * {contents: ['y', 'fox'], rowClass: 'value', objectIndex: 2}, + * {contents: ['a', '0'], rowClass: 'value', objectIndex: 2}, + * {contents: ['describer > baz > z', ''], rowClass: 'header', + * objectIndex: 3}, + * {contents: ['0', '1'], rowClass: 'value', objectIndex: 3}, + * {contents: ['1', '2'], rowClass: 'value', objectIndex: 3}, + * ] */ - function flattenObject(object: {[key: string]: any}): {[key: string]: any} { - const flattened = {}; - flattenObjectRec(new Set(), flattened, '', object); + function flattenObject(object: {[key: string]: any}): ToolTipRowData[] { + const flattened: ToolTipRowData[] = []; + flattenObjectRec(new Set(), flattened, '', 0, object); return flattened; } // The JSON is a dictionary of data describer name to their data. Assuming a // convention that describers emit a dictionary from string->string, this is // flattened to an array. Each top-level dictionary entry is flattened to a - // 'heading' with [`the describer's name`, null], followed by some number of + // 'heading' with [`the describer's name`, ''], followed by some number of // entries with a two-element list, each representing a key/value pair. this.descriptionJson_ = descriptionJson; - const description = JSON.parse(descriptionJson); - const flattenedDescription = []; - for (const [title, value] of Object.entries(description)) { - flattenedDescription.push([title, null]); - const flattenedValue = flattenObject(value as {[key: string]: any}); - for (const [propName, propValue] of Object.entries(flattenedValue)) { - let strValue = String(propValue); - if (strValue.length > 50) { - strValue = `${strValue.substring(0, 47)}...`; - } - flattenedDescription.push([propName, strValue]); - } - } + const flattenedDescription: ToolTipRowData[] = + flattenObject(JSON.parse(descriptionJson)); if (flattenedDescription.length === 0) { - flattenedDescription.push(['No Data', null]); + flattenedDescription.push( + {contents: ['No Data', ''], rowClass: 'heading', objectIndex: 0}); } + // Attach each TooltipRowData element to a table row as data. let tr = this.div_.selectAll('tbody').selectAll('tr').data(flattenedDescription); - tr.enter().append('tr').selectAll('td').data(d => d).enter().append('td'); + + // Create <tr> and <td> elements for each row that's new in this update. + tr.enter() + .append('tr') + .selectAll('td') + .data((d: unknown) => (d as ToolTipRowData).contents) + .enter() + .append('td'); + + // Delete the <tr> elements for each row that's disappeared in this update. tr.exit().remove(); + // Update the selection to match the elements that were added or removed. tr = this.div_.selectAll('tr'); - tr.select('td').attr('colspan', function(_d: any) { - return ((d3.select((this as HTMLElement).parentElement!).datum() as - any[])[1] === null) ? - 2 : - null; - }); - tr = tr.attr( - 'class', - (d: unknown) => - (d as Array<string|null>)[1] === null ? 'heading' : 'value'); - tr.selectAll('td').data(d => d).text( - (d: unknown) => d === null ? '' : d as string); + + // Apply style and content to all <tr> and <td> elements. Elements that + // already existed in the last update will already have settings so each + // change must be idempotent. + + // Make the first cell of each header row 2 columns wide. + tr.select('td').attr( + 'colspan', (_d: unknown, i: number, nodes: ArrayLike<unknown>) => { + const parent = d3.select((nodes[i] as HTMLElement).parentElement); + const parentData = parent.datum() as ToolTipRowData; + return parentData.rowClass === 'heading' ? 2 : null; + }); + + // Set the text of each cell. + tr.selectAll('td') + // Assign the <tr>'s full row of data to the selection. + .data((d: unknown) => (d as ToolTipRowData).contents) + // Assign the elements of the row array to the <td>'s in the selection. + .text((d: unknown) => d as string); + + // Make each row clickable. + tr.on('click', + (d: unknown, i: number, nodes: ArrayLike<unknown>) => { + toggleTooltipRows( + nodes[i] as HTMLElement, (d as ToolTipRowData).objectIndex); + }) + // And add classes to them. + .each((d: unknown, i: number, nodes: ArrayLike<unknown>) => { + const el = nodes[i] as HTMLElement; + const rowData = d as ToolTipRowData; + + // Add the row's fixed classes if they're not already present. This + // won't overwrite the "collapsed" class if it's there. + el.classList.add( + rowData.rowClass, tooltipClassForIndex(rowData.objectIndex)); + }); } private onDragStart_() {
diff --git a/chrome/browser/resources/discards/graph_doc_template.html b/chrome/browser/resources/discards/graph_doc_template.html index 707f75a..35aa55e 100644 --- a/chrome/browser/resources/discards/graph_doc_template.html +++ b/chrome/browser/resources/discards/graph_doc_template.html
@@ -77,6 +77,10 @@ text-align: end; } + tr.value.collapsed { + display: none; + } + </style> <script src="https://ajax.googleapis.com/ajax/libs/d3js/5.7.0/d3.min.js" integrity="sha384-HL96dun1KbYEq6UT/ZlsspAODCyQ+Zp4z318ajUPBPSMzy5dvxl6ziwmnil8/Cpd"
diff --git a/chrome/browser/resources/hangout_services/thunk.js b/chrome/browser/resources/hangout_services/thunk.js index 307780e..f0bf03d7 100644 --- a/chrome/browser/resources/hangout_services/thunk.js +++ b/chrome/browser/resources/hangout_services/thunk.js
@@ -141,15 +141,6 @@ chrome.webrtcLoggingPrivate.stopRtpDump( requestInfo, origin, incoming, outgoing, doSendResponse); return true; - } else if (method === 'logging.startAudioDebugRecordings') { - const seconds = message['seconds'] || 0; - chrome.webrtcLoggingPrivate.startAudioDebugRecordings( - requestInfo, origin, seconds, doSendResponse); - return true; - } else if (method === 'logging.stopAudioDebugRecordings') { - chrome.webrtcLoggingPrivate.stopAudioDebugRecordings( - requestInfo, origin, doSendResponse); - return true; } else if (method === 'logging.startEventLogging') { const sessionId = message['sessionId'] || ''; const maxLogSizeBytes = message['maxLogSizeBytes'] || 0;
diff --git a/chrome/browser/resources/password_manager/checkup_section.html b/chrome/browser/resources/password_manager/checkup_section.html index a6565d3..ec4cbd8 100644 --- a/chrome/browser/resources/password_manager/checkup_section.html +++ b/chrome/browser/resources/password_manager/checkup_section.html
@@ -67,6 +67,12 @@ cr-link-row[show-red-icon] { --cr-link-row-start-icon-color: var(--google-red-600); } + + #checkupResult, + #weakRow { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } </style> <h2 class="page-title">$i18n{checkupTitle}</h2> <div id="checkupContent" class="card">
diff --git a/chrome/browser/resources/password_manager/password_list_item.html b/chrome/browser/resources/password_manager/password_list_item.html index 75c3664..bae09c47 100644 --- a/chrome/browser/resources/password_manager/password_list_item.html +++ b/chrome/browser/resources/password_manager/password_list_item.html
@@ -1,15 +1,16 @@ <style include="shared-style cr-shared-style"> #container:hover { background-color: var(--cr-hover-background-color); + border-radius: inherit; cursor: pointer; --cr-icon-button-hover-background-color: transparent; --cr-icon-button-active-background-color: transparent; - --cr-icon-button-margin-start: 0px; - --cr-icon-button-margin-end: 0px; } #borderPart { + display: grid; flex: 1; + grid-template-columns: auto 1fr; min-height: var(--section-min-height); } @@ -19,7 +20,9 @@ } .label { - flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } #numberOfAccounts { @@ -27,7 +30,9 @@ } #seePasswordDetails { - margin-inline-end: 10px; + --cr-icon-button-margin-start: 0px; + --cr-icon-button-margin-end: 10px; + justify-self: end; } span {
diff --git a/chrome/browser/resources/password_manager/passwords_exporter.html b/chrome/browser/resources/password_manager/passwords_exporter.html index 2cb2fe6..1de0447 100644 --- a/chrome/browser/resources/password_manager/passwords_exporter.html +++ b/chrome/browser/resources/password_manager/passwords_exporter.html
@@ -7,13 +7,18 @@ cr-link-row[hide-icon]::part(icon) { display: none; } + + #exportPasswordsButton { + height: auto; + padding: 3px 16px; + } </style> <cr-link-row class="cr-row settings-cr-link-row" label="$i18n{exportPasswords}" sub-label="$i18n{exportPasswordsDescription}" hide-icon> <template is="dom-if" if="[[!showExportInProgress_]]" restamp> - <cr-button id="exportPasswordsButton" on-click="onExportClick_" + <cr-button id="exportPasswordsButton" on-click="onExportClick_" aria-label="[[getAriaLabel_()]]"> $i18n{downloadFile} </cr-button> @@ -53,4 +58,4 @@ <cr-button id="openInShellButton" on-click="onOpenInShellButtonClick_"> $i18n{downloadLinkShow} </cr-button> -</cr-toast> \ No newline at end of file +</cr-toast>
diff --git a/chrome/browser/resources/password_manager/passwords_section.html b/chrome/browser/resources/password_manager/passwords_section.html index e88b64c2..1622340 100644 --- a/chrome/browser/resources/password_manager/passwords_section.html +++ b/chrome/browser/resources/password_manager/passwords_section.html
@@ -22,6 +22,16 @@ margin-bottom: 24px; margin-top: 24px; } + + password-list-item:first-of-type { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + + password-list-item:last-of-type { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } </style> <if expr="_google_chrome"> <template is="dom-if" if="[[promoCard_]]" restamp>
diff --git a/chrome/browser/resources/password_manager/passwords_section.ts b/chrome/browser/resources/password_manager/passwords_section.ts index 6c42af86..8b9bdd5 100644 --- a/chrome/browser/resources/password_manager/passwords_section.ts +++ b/chrome/browser/resources/password_manager/passwords_section.ts
@@ -29,6 +29,7 @@ import {PasswordManagerImpl} from './password_manager_proxy.js'; import {getTemplate} from './passwords_section.html.js'; // <if expr="_google_chrome"> +import {PromoCardId} from './promo_cards/promo_card.js'; import {PromoCard, PromoCardsProxyImpl} from './promo_cards/promo_cards_browser_proxy.js'; // </if> import {Route, RouteObserverMixin, UrlParam} from './router.js'; @@ -132,6 +133,12 @@ }; this.setSavedPasswordsListener_ = _passwordList => { + // <if expr="_google_chrome"> + if (_passwordList.length === 0 && + this.promoCard_?.id === PromoCardId.CHECKUP) { + this.promoCard_ = null; + } + // </if> updateGroups(); };
diff --git a/chrome/browser/resources/password_manager/promo_cards/promo_card.ts b/chrome/browser/resources/password_manager/promo_cards/promo_card.ts index a34e41a6..b6b9127 100644 --- a/chrome/browser/resources/password_manager/promo_cards/promo_card.ts +++ b/chrome/browser/resources/password_manager/promo_cards/promo_card.ts
@@ -21,7 +21,7 @@ // WARNING: Keep synced with // chrome/browser/ui/webui/password_manager/promo_cards_handler.cc. -enum PromoCardId { +export enum PromoCardId { CHECKUP = 'password_checkup_promo', WEB_PASSWORD_MANAGER = 'passwords_on_web_promo', SHORTCUT = 'password_shortcut_promo',
diff --git a/chrome/browser/resources/password_manager/settings_section.html b/chrome/browser/resources/password_manager/settings_section.html index dce6425..756349d 100644 --- a/chrome/browser/resources/password_manager/settings_section.html +++ b/chrome/browser/resources/password_manager/settings_section.html
@@ -38,6 +38,16 @@ display: none; } } + + pref-toggle-button:first-of-type { + border-top-left-radius: inherit; + border-top-right-radius: inherit; + } + + cr-link-row:last-of-type { + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + } </style> <h3 class="page-title">$i18n{settings}</h3> <div class="card">
diff --git a/chrome/browser/resources/settings/BUILD.gn b/chrome/browser/resources/settings/BUILD.gn index 9122fb8..69c8e93e 100644 --- a/chrome/browser/resources/settings/BUILD.gn +++ b/chrome/browser/resources/settings/BUILD.gn
@@ -265,6 +265,9 @@ if (is_chromeos) { web_component_files += [ "controls/password_prompt_dialog.ts" ] } + if (is_chrome_branded) { + web_component_files += [ "get_most_chrome_page/get_most_chrome_page.ts" ] + } # -----------------web_component_files end ----------------------------------
diff --git a/chrome/browser/resources/settings/about_page/about_page.ts b/chrome/browser/resources/settings/about_page/about_page.ts index 4608d09d..52c24ff3 100644 --- a/chrome/browser/resources/settings/about_page/about_page.ts +++ b/chrome/browser/resources/settings/about_page/about_page.ts
@@ -31,6 +31,11 @@ import {loadTimeData} from '../i18n_setup.js'; import {RelaunchMixin, RestartType} from '../relaunch_mixin.js'; +// <if expr="_google_chrome"> +import {routes} from '../route.js'; +import {Router} from '../router.js'; + +// </if> import {getTemplate} from './about_page.html.js'; import {AboutPageBrowserProxy, AboutPageBrowserProxyImpl, UpdateStatus, UpdateStatusChangedEvent} from './about_page_browser_proxy.js'; @@ -40,6 +45,7 @@ // </if> // clang-format on + const SettingsAboutPageElementBase = RelaunchMixin(WebUiListenerMixin(I18nMixin(PolymerElement))); @@ -82,7 +88,8 @@ showGetTheMostOutOfChromeSection_: { type: Boolean, value() { - return loadTimeData.getBoolean('showGetTheMostOutOfChromeSection'); + return loadTimeData.getBoolean('showGetTheMostOutOfChromeSection') && + !loadTimeData.getBoolean('isGuest'); }, }, // </if> @@ -342,8 +349,8 @@ this.aboutBrowserProxy_.openFeedbackDialog(); } - private onGetTheMostOutOfChromeClick_() { - // TODO(crbug.com/1423278): implement. + private onGetTheMostOutOfChromeTap_() { + Router.getInstance().navigateTo(routes.GET_MOST_CHROME); } // </if>
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html index 55ad4f0..2c9d775 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.html +++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -205,6 +205,16 @@ <settings-reset-page prefs="{{prefs}}"></settings-reset-page> </settings-section> </template> +<if expr="_google_chrome"> + <template is="dom-if" + if="[[showGetMostChrome_(pageVisibility.getMostChrome)]]" + restamp> + <settings-section page-title="$i18n{getTheMostOutOfChrome}" + section="getMostChrome"> + <settings-get-most-chrome-page></settings-get-most-chrome-page> + </settings-section> + </template> +</if> </div> </template> </settings-idle-load>
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.ts b/chrome/browser/resources/settings/basic_page/basic_page.ts index 000a5c0..bea931e 100644 --- a/chrome/browser/resources/settings/basic_page/basic_page.ts +++ b/chrome/browser/resources/settings/basic_page/basic_page.ts
@@ -395,6 +395,11 @@ } // <if expr="_google_chrome"> + private showGetMostChrome_(visibility?: boolean): boolean { + return visibility !== false && + loadTimeData.getBoolean('showGetTheMostOutOfChromeSection'); + } + private onSendHighEfficiencyFeedbackClick_(e: Event) { e.stopPropagation(); this.performanceBrowserProxy_.openHighEfficiencyFeedbackDialog();
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html index f525389b..fdb0861 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.html +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -41,3 +41,10 @@ </cr-button> </div> </template> + <template is="dom-if" if="[[downloadBubbleEnabled_]]"> + <settings-toggle-button id="showDownloadsToggle" + class="hr" + pref="{{prefs.download_bubble.partial_view_enabled}}" + label="$i18n{showDownloadsWhenFinished}"> + </settings-toggle-button> + </template>
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.ts b/chrome/browser/resources/settings/downloads_page/downloads_page.ts index ef181d6e..5bfb428 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.ts +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.ts
@@ -19,6 +19,8 @@ import {listenOnce} from 'chrome://resources/js/util_ts.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {loadTimeData} from '../i18n_setup.js'; + import {DownloadsBrowserProxy, DownloadsBrowserProxyImpl} from './downloads_browser_proxy.js'; import {getTemplate} from './downloads_page.html.js'; @@ -56,6 +58,13 @@ */ downloadLocation_: String, // </if> + + downloadBubbleEnabled_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('downloadBubbleEnabled'); + }, + }, }; } @@ -74,6 +83,8 @@ private downloadLocation_: string; // </if> + private downloadBubbleEnabled_: boolean; + private browserProxy_: DownloadsBrowserProxy = DownloadsBrowserProxyImpl.getInstance();
diff --git a/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.html b/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.html new file mode 100644 index 0000000..7c89b54 --- /dev/null +++ b/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.html
@@ -0,0 +1 @@ +<div></div>
diff --git a/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.ts b/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.ts new file mode 100644 index 0000000..029614ab --- /dev/null +++ b/chrome/browser/resources/settings/get_most_chrome_page/get_most_chrome_page.ts
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * 'settings-get-most-chrome-page' is the settings page information about how + * to get the most out of Chrome. + */ + +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './get_most_chrome_page.html.js'; + +export class SettingsGetMostChromePageElement extends PolymerElement { + static get is() { + return 'settings-get-most-chrome-page'; + } + + static get template() { + return getTemplate(); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'settings-get-most-chrome-page': SettingsGetMostChromePageElement; + } +} + +customElements.define( + SettingsGetMostChromePageElement.is, SettingsGetMostChromePageElement);
diff --git a/chrome/browser/resources/settings/lazy_load.ts b/chrome/browser/resources/settings/lazy_load.ts index 4fc7d32..04d16b8 100644 --- a/chrome/browser/resources/settings/lazy_load.ts +++ b/chrome/browser/resources/settings/lazy_load.ts
@@ -66,6 +66,9 @@ // Sections import './a11y_page/a11y_page.js'; import './downloads_page/downloads_page.js'; +// <if expr="_google_chrome"> +import './get_most_chrome_page/get_most_chrome_page.js'; +// </if> // <if expr="not chromeos_ash"> import './languages_page/languages_page.js'; import './languages_page/spell_check_page.js'; @@ -138,6 +141,9 @@ export {SettingsSliderElement} from './controls/settings_slider.js'; export {DownloadsBrowserProxy, DownloadsBrowserProxyImpl} from './downloads_page/downloads_browser_proxy.js'; export {SettingsDownloadsPageElement} from './downloads_page/downloads_page.js'; +// <if expr="_google_chrome"> +export {SettingsGetMostChromePageElement} from './get_most_chrome_page/get_most_chrome_page.js'; +// </if> // <if expr="_google_chrome and is_win"> export {IncompatibleApplicationItemElement} from './incompatible_applications_page/incompatible_application_item.js'; export {ActionTypes, IncompatibleApplication, IncompatibleApplicationsBrowserProxy, IncompatibleApplicationsBrowserProxyImpl} from './incompatible_applications_page/incompatible_applications_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/page_visibility.ts b/chrome/browser/resources/settings/page_visibility.ts index c4829c17..0234474 100644 --- a/chrome/browser/resources/settings/page_visibility.ts +++ b/chrome/browser/resources/settings/page_visibility.ts
@@ -15,6 +15,7 @@ defaultBrowser?: boolean; downloads?: boolean; extensions?: boolean; + getMostChrome?: boolean; languages?: boolean; onStartup?: boolean; people?: boolean; @@ -55,6 +56,7 @@ defaultBrowser: false, downloads: false, extensions: false, + getMostChrome: false, languages: false, onStartup: false, people: false, @@ -87,6 +89,7 @@ downloads: true, a11y: true, extensions: false, + getMostChrome: false, languages: true, performance: false, };
diff --git a/chrome/browser/resources/settings/route.ts b/chrome/browser/resources/settings/route.ts index 13971aa..7b63dfed 100644 --- a/chrome/browser/resources/settings/route.ts +++ b/chrome/browser/resources/settings/route.ts
@@ -262,6 +262,14 @@ '/performance', 'performance', loadTimeData.getString('performancePageTitle')); } + + // <if expr="_google_chrome"> + if (visibility.getMostChrome !== false) { + r.GET_MOST_CHROME = r.ADVANCED.createSection( + '/getMostChrome', 'getMostChrome', + loadTimeData.getString('getTheMostOutOfChrome')); + } + // </if> } return r as unknown as SettingsRoutes; }
diff --git a/chrome/browser/resources/settings/router.ts b/chrome/browser/resources/settings/router.ts index 5656181..c24a1ac 100644 --- a/chrome/browser/resources/settings/router.ts +++ b/chrome/browser/resources/settings/router.ts
@@ -29,6 +29,9 @@ DOWNLOADS: Route; EDIT_DICTIONARY: Route; FONTS: Route; + // <if expr="_google_chrome"> + GET_MOST_CHROME: Route; + // </if> IMPORT_DATA: Route; INCOMPATIBLE_APPLICATIONS: Route; LANGUAGES: Route;
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html index 7d325f0..e68845b 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -138,6 +138,28 @@ background: var(--google-grey-900-white-4-percent); } } + + :host-context([chrome-refresh-2023]) cr-toolbar-selection-overlay { + --cr-toolbar-selection-overlay-slot-gap: 8px; + background: transparent; + font-weight: 500; + } + + :host-context([chrome-refresh-2023]) + cr-toolbar-selection-overlay::part(clearIcon), + :host-context([chrome-refresh-2023]) + cr-toolbar-selection-overlay cr-icon-button { + --cr-icon-button-icon-size: 20px; + height: 28px; + width: 28px; + } + + + :host-context([chrome-refresh-2023]) + cr-toolbar-selection-overlay::part(clearIcon) { + margin-inline-end: 0; + margin-inline-start: -4px; + } </style> <div class="column" id="powerBookmarksContainer">
diff --git a/chrome/browser/resources/side_panel/companion/companion.ts b/chrome/browser/resources/side_panel/companion/companion.ts index 96350f4..778a97a 100644 --- a/chrome/browser/resources/side_panel/companion/companion.ts +++ b/chrome/browser/resources/side_panel/companion/companion.ts
@@ -11,6 +11,32 @@ import {MethodType, PromoAction, PromoType} from './companion.mojom-webui.js'; import {CompanionProxy, CompanionProxyImpl} from './companion_proxy.js'; +/** + * Method arguments to be passed as part of the JSON message object to be sent + * across the postmessage boundary. + * Keep this file in sync with + * google3/java/com/google/lens/web/interfaces/standalone/companionweb/service/companion_parent_communication_service.ts + */ +enum ParamType { + // Arguments for iframe -> browser communication. + // Mandatory arguments. + METHOD_TYPE = 'type', + + // Optional arguments. + // Arguments for MethodType.kOnExpsOptinStatusChange. + IS_EXPS_OPTED_IN = 'isExpsOptedIn', + + // Arguments for MethodType.kOnPromoAction. + PROMO_ACTION = 'promoAction', + PROMO_TYPE = 'promoType', + + // Arguments for MethodType.kOnPhAction. + PH_ACTION = 'phAction', + + // Arguments for MethodType.kOnOpenInNewTabButtonURLChanged. + URL_FOR_OPEN_IN_NEW_TAB = 'urlForOpenInNewTab', +} + const companionProxy: CompanionProxy = CompanionProxyImpl.getInstance(); // Validation check for incoming enums from the iframe postMessage(). @@ -44,11 +70,14 @@ } const data = event.data; - if (data.type === MethodType.kOnRegionSearchClicked) { + const methodType = data[ParamType.METHOD_TYPE]; + if (methodType === MethodType.kOnRegionSearchClicked) { companionProxy.handler.onRegionSearchClicked(); - } else if (data.type === MethodType.kOnPromoAction) { - if (validatePromoArguments(data.promoType, data.promoAction)) { - companionProxy.handler.onPromoAction(data.promoType, data.promoAction); + } else if (methodType === MethodType.kOnPromoAction) { + const promoType = data[ParamType.PROMO_TYPE]; + const promoAction = data[ParamType.PROMO_ACTION]; + if (validatePromoArguments(promoType, promoAction)) { + companionProxy.handler.onPromoAction(promoType, promoAction); } } }
diff --git a/chrome/browser/resources/side_panel/customize_chrome/color.html b/chrome/browser/resources/side_panel/customize_chrome/color.html index c1f5231..5202188 100644 --- a/chrome/browser/resources/side_panel/customize_chrome/color.html +++ b/chrome/browser/resources/side_panel/customize_chrome/color.html
@@ -46,6 +46,11 @@ fill: var(--customize-chrome-color-foreground-color); } + #base { + display: none; + fill: yellow; + } + /* Set styles for high contrast mode in Windows. */ @media (forced-colors: active) { :host(:focus):host-context(.focus-outline-visible) { @@ -53,6 +58,14 @@ outline: var(--cr-focus-outline-hcm) !important; } } + + :host([basic-color]):host-context([chrome-refresh-2023]) svg { + border: none; + } + + :host([basic-color]):host(:not([background-color-hidden])):host-context([chrome-refresh-2023]) #base { + display: block; + } </style> <customize-chrome-check-mark-wrapper checked="[[checked]]"> <svg viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg" @@ -61,5 +74,7 @@ </rect> <rect id="background" x="0" y="25" width="50" height="25"> </rect> + <rect id="base" x="25" y="25" width="25" height="25"> + </rect> </svg> </customize-chrome-check-mark-wrapper>
diff --git a/chrome/browser/resources/side_panel/customize_chrome/colors.html b/chrome/browser/resources/side_panel/customize_chrome/colors.html index 8a3497d4..ef1cfe0 100644 --- a/chrome/browser/resources/side_panel/customize_chrome/colors.html +++ b/chrome/browser/resources/side_panel/customize_chrome/colors.html
@@ -49,6 +49,11 @@ managed-dialog { --cr-dialog-width: min(calc(100% - 32px), 512px); } + + :host-context([chrome-refresh-2023]) customize-chrome-color { + background-color: lightgrey; + border-radius: 12px; + } </style> <!-- TODO(crbug.com/1395210): Make grid adaptive. --> <cr-grid columns="4" role="radiogroup" @@ -65,7 +70,8 @@ checked="[[isDefaultColorSelected_]]" aria-checked$="[[boolToString_(isDefaultColorSelected_)]]" tabindex$="[[tabIndex_(isDefaultColorSelected_)]]" - on-click="onDefaultColorClick_"> + on-click="onDefaultColorClick_" + basic-color> </customize-chrome-color> </template> <template is="dom-if" if="[[themeHasMainColor_(theme_)]]" restamp> @@ -79,7 +85,8 @@ checked="[[isMainColorSelected_]]" aria-checked$="[[boolToString_(isMainColorSelected_)]]" tabindex$="[[tabIndex_(isMainColorSelected_)]]" - on-click="onMainColorClick_"> + on-click="onMainColorClick_" + basic-color> </customize-chrome-color> </template> <template id="chromeColors" is="dom-repeat" items="[[colors_]]"> @@ -95,7 +102,8 @@ aria-checked$= "[[getChromeColorCheckedStatus_(item.seed, selectedColor_)]]" tabindex$="[[chromeColorTabIndex_(item.seed, selectedColor_)]]" - on-click="onChromeColorClick_"> + on-click="onChromeColorClick_" + basic-color> </customize-chrome-color> </template> <div id="customColorContainer" @@ -110,7 +118,8 @@ background-color="[[customColor_.background]]" foreground-color="[[customColor_.foreground]]" background-color-hidden="[[themeHasBackgroundImage_(theme_)]]" - checked="[[isCustomColorSelected_]]"> + checked="[[isCustomColorSelected_]]" + basic-color> </customize-chrome-color> <div id="colorPickerIcon"></div> <input id="colorPicker" type="color" tabindex="-1" aria-hidden="true"
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc index a2b9dd6..5c833f4 100644 --- a/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc +++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc
@@ -434,10 +434,8 @@ "from dangerous sites' under Privacy. This feature is enabled by " "default." chrome_policy { - subProto1 { - RealTimeDownloadProtectionRequestAllowed { - RealTimeDownloadProtectionRequestAllowed: false - } + RealTimeDownloadProtectionRequestAllowed { + RealTimeDownloadProtectionRequestAllowed: false } } chrome_policy {
diff --git a/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc b/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc index 54d8b78..b89a0aa 100644 --- a/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc +++ b/chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc
@@ -267,10 +267,8 @@ "from dangerous sites' under Privacy. This feature is enabled by " "default." chrome_policy { - subProto1 { - RealTimeDownloadProtectionRequestAllowed { - RealTimeDownloadProtectionRequestAllowed: false - } + RealTimeDownloadProtectionRequestAllowed { + RealTimeDownloadProtectionRequestAllowed: false } } chrome_policy {
diff --git a/chrome/browser/storage_access_api/api_browsertest.cc b/chrome/browser/storage_access_api/api_browsertest.cc index caddc95..3efde4d 100644 --- a/chrome/browser/storage_access_api/api_browsertest.cc +++ b/chrome/browser/storage_access_api/api_browsertest.cc
@@ -436,7 +436,7 @@ NavigateToPageWithFrame(kHostA); NavigateFrameTo(kHostB, "/echoheader?cookie"); - EXPECT_EQ(QueryPermission(GetPrimaryMainFrame()), "prompt"); + EXPECT_EQ(QueryPermission(GetPrimaryMainFrame()), "granted"); EXPECT_EQ(QueryPermission(GetFrame()), "prompt"); }
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc index c961d685..44d80ae86 100644 --- a/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc +++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context.cc
@@ -292,6 +292,11 @@ return CONTENT_SETTING_BLOCK; } + // Permission query from top-level frame should be "granted" by default. + if (render_frame_host && render_frame_host->IsInPrimaryMainFrame()) { + return CONTENT_SETTING_ALLOW; + } + ContentSetting setting = PermissionContextBase::GetPermissionStatusInternal( render_frame_host, requesting_origin, embedding_origin);
diff --git a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc index 7aba19d..14331511 100644 --- a/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc +++ b/chrome/browser/storage_access_api/storage_access_grant_permission_context_unittest.cc
@@ -541,11 +541,11 @@ // However, ensure that the user's denial is not exposed when querying the // permission, per the spec. - EXPECT_EQ( - CONTENT_SETTING_ASK, - permission_context - .GetPermissionStatus(nullptr, GetRequesterURL(), GetTopLevelURL()) - .content_setting); + EXPECT_EQ(CONTENT_SETTING_ASK, + permission_context + .GetPermissionStatus(/*render_frame_host=*/nullptr, + GetRequesterURL(), GetTopLevelURL()) + .content_setting); } TEST_F(StorageAccessGrantPermissionContextAPIEnabledTest, ExplicitGrantAccept) {
diff --git a/chrome/browser/sync/sync_service_factory.cc b/chrome/browser/sync/sync_service_factory.cc index 2f53334..704ada36 100644 --- a/chrome/browser/sync/sync_service_factory.cc +++ b/chrome/browser/sync/sync_service_factory.cc
@@ -44,7 +44,6 @@ #include "chrome/browser/web_data_service_factory.h" #include "chrome/common/buildflags.h" #include "chrome/common/channel_info.h" -#include "components/autofill/core/browser/personal_data_manager.h" #include "components/network_time/network_time_tracker.h" #include "components/supervised_user/core/common/buildflags.h" #include "components/sync/base/command_line_switches.h"
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.cc b/chrome/browser/sync/test/integration/bookmarks_helper.cc index 5245f7d1..2825eb7 100644 --- a/chrome/browser/sync/test/integration/bookmarks_helper.cc +++ b/chrome/browser/sync/test/integration/bookmarks_helper.cc
@@ -430,9 +430,9 @@ << node_b->parent()->GetIndexOf(node_b).value(); return false; } - if (node_a->guid() != node_b->guid()) { - LOG(ERROR) << "GUID mismatch: " << node_a->guid() << " vs. " - << node_b->guid(); + if (node_a->uuid() != node_b->uuid()) { + LOG(ERROR) << "GUID mismatch: " << node_a->uuid() << " vs. " + << node_b->uuid(); return false; } if (node_a->parent()->is_root() != node_b->parent()->is_root() || @@ -444,7 +444,7 @@ return false; } if (!node_a->parent()->is_root() && - node_a->parent()->guid() != node_b->parent()->guid()) { + node_a->parent()->uuid() != node_b->parent()->uuid()) { LOG(ERROR) << "Parent node mismatch: " << node_a->parent()->GetTitle() << " vs. " << node_b->parent()->GetTitle(); return false; @@ -847,7 +847,7 @@ bool ContainsBookmarkNodeWithGUID(int profile, const base::GUID& guid) { for (const BookmarkNode* node : GetAllBookmarkNodes(GetBookmarkModel(profile))) { - if (node->guid() == guid) { + if (node->uuid() == guid) { return true; } } @@ -1255,7 +1255,7 @@ BookmarksGUIDChecker::BookmarksGUIDChecker(int profile, const base::GUID& guid) : SingleBookmarksModelMatcherChecker(profile, - testing::Contains(HasGuid(guid))) {} + testing::Contains(HasUuid(guid))) {} BookmarksGUIDChecker::~BookmarksGUIDChecker() = default; @@ -1295,9 +1295,9 @@ continue; } - auto iter = server_bookmarks_by_guid.find(node->guid()); + auto iter = server_bookmarks_by_guid.find(node->uuid()); if (iter == server_bookmarks_by_guid.end()) { - *os << "Missing a node from on the server for GUID: " << node->guid(); + *os << "Missing a node from on the server for UUID: " << node->uuid(); return false; } const sync_pb::SyncEntity& server_entity = iter->second; @@ -1314,7 +1314,7 @@ server_guids_by_parent_id.find(server_entity.parent_id_string()); DCHECK(parent_iter != server_guids_by_parent_id.end()); auto server_position_iter = - base::ranges::find(parent_iter->second, node->guid()); + base::ranges::find(parent_iter->second, node->uuid()); DCHECK(server_position_iter != parent_iter->second.end()); const size_t server_position = server_position_iter - parent_iter->second.begin(); @@ -1368,7 +1368,7 @@ DCHECK(parent_node->is_permanent_node()); // Matching server entity must exist. - DCHECK_EQ(node->guid().AsLowercaseString(), + DCHECK_EQ(node->uuid().AsLowercaseString(), server_entity.specifics().bookmark().guid()); const std::map<std::string, sync_pb::SyncEntity> @@ -1398,13 +1398,13 @@ const std::map<base::GUID, sync_pb::SyncEntity>& server_bookmarks_by_guid, std::ostream* os) const { // Only one matching server entity must exist. - DCHECK_EQ(1u, server_bookmarks_by_guid.count(node->guid())); - auto iter = server_bookmarks_by_guid.find(node->guid()); + DCHECK_EQ(1u, server_bookmarks_by_guid.count(node->uuid())); + auto iter = server_bookmarks_by_guid.find(node->uuid()); const sync_pb::SyncEntity& server_entity = iter->second; const BookmarkNode* parent_node = node->parent(); if (server_entity.specifics().bookmark().parent_guid() != - parent_node->guid().AsLowercaseString()) { + parent_node->uuid().AsLowercaseString()) { *os << " Parent node's GUID in specifics does not match"; return false; } @@ -1413,7 +1413,7 @@ return CheckPermanentParentNode(node, server_entity, os); } - auto parent_iter = server_bookmarks_by_guid.find(parent_node->guid()); + auto parent_iter = server_bookmarks_by_guid.find(parent_node->uuid()); if (parent_iter == server_bookmarks_by_guid.end()) { *os << " Missing a parent node on the server for node: " << node->GetTitle();
diff --git a/chrome/browser/sync/test/integration/bookmarks_helper.h b/chrome/browser/sync/test/integration/bookmarks_helper.h index 693e9d84b..055afc8 100644 --- a/chrome/browser/sync/test/integration/bookmarks_helper.h +++ b/chrome/browser/sync/test/integration/bookmarks_helper.h
@@ -45,9 +45,9 @@ namespace bookmarks_helper { -MATCHER_P(HasGuid, expected_guid, "") { +MATCHER_P(HasUuid, expected_uuid, "") { const bookmarks::BookmarkNode* actual_node = arg; - return actual_node->guid() == expected_guid; + return actual_node->uuid() == expected_uuid; } // Helping matchers to check the hierarchy of bookmarks. All matchers work with
diff --git a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc index 3f0bc62..036cbaa 100644 --- a/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_bookmarks_sync_test.cc
@@ -1209,7 +1209,7 @@ EXPECT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); EXPECT_EQ( guid, - GetBookmarkBarNode(kSingleProfileIndex)->children()[0].get()->guid()); + GetBookmarkBarNode(kSingleProfileIndex)->children()[0].get()->uuid()); EXPECT_EQ(1, histogram_tester.GetBucketCount("Sync.BookmarkGUIDSource2", /*kSpecifics=*/0)); @@ -1253,7 +1253,7 @@ EXPECT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); EXPECT_EQ( originator_client_item_id, - GetBookmarkBarNode(kSingleProfileIndex)->children()[0].get()->guid()); + GetBookmarkBarNode(kSingleProfileIndex)->children()[0].get()->uuid()); EXPECT_EQ(1, histogram_tester.GetBucketCount("Sync.BookmarkGUIDSource2", /*kValidOCII=*/1)); @@ -1466,11 +1466,11 @@ const std::string title = "Seattle Sounders FC"; const BookmarkNode* local_folder = AddFolder( kSingleProfileIndex, GetBookmarkBarNode(kSingleProfileIndex), 0, title); - const base::GUID old_guid = local_folder->guid(); - SCOPED_TRACE(std::string("old_guid=") + old_guid.AsLowercaseString()); + const base::Uuid old_uuid = local_folder->uuid(); + SCOPED_TRACE(std::string("old_uuid=") + old_uuid.AsLowercaseString()); ASSERT_TRUE(local_folder); - ASSERT_TRUE(BookmarksGUIDChecker(kSingleProfileIndex, old_guid).Wait()); + ASSERT_TRUE(BookmarksGUIDChecker(kSingleProfileIndex, old_uuid).Wait()); ASSERT_EQ(1u, CountFoldersWithTitlesMatching(kSingleProfileIndex, title)); // Create an equivalent remote folder. @@ -1479,7 +1479,7 @@ entity_builder_factory.NewBookmarkEntityBuilder(title); std::unique_ptr<syncer::LoopbackServerEntity> remote_folder = bookmark_builder.BuildFolder(); - const base::GUID new_guid = base::GUID::ParseCaseInsensitive( + const base::Uuid new_uuid = base::Uuid::ParseCaseInsensitive( remote_folder->GetSpecifics().bookmark().guid()); fake_server_->InjectEntity(std::move(remote_folder)); @@ -1487,9 +1487,9 @@ ASSERT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); ASSERT_TRUE(SetupSync()); - // The folder GUID should have been updated with the corresponding value. - EXPECT_TRUE(BookmarksGUIDChecker(kSingleProfileIndex, new_guid).Wait()); - EXPECT_FALSE(ContainsBookmarkNodeWithGUID(kSingleProfileIndex, old_guid)); + // The folder UUID should have been updated with the corresponding value. + EXPECT_TRUE(BookmarksGUIDChecker(kSingleProfileIndex, new_uuid).Wait()); + EXPECT_FALSE(ContainsBookmarkNodeWithGUID(kSingleProfileIndex, old_uuid)); EXPECT_EQ(1u, GetBookmarkBarNode(kSingleProfileIndex)->children().size()); } @@ -1846,7 +1846,7 @@ ASSERT_EQ(1u, server_bookmarks.size()); EXPECT_EQ(server_bookmarks[0].client_tag_hash(), syncer::ClientTagHash::FromUnhashed( - syncer::BOOKMARKS, folder->guid().AsLowercaseString()) + syncer::BOOKMARKS, folder->uuid().AsLowercaseString()) .value()); }
diff --git a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc index 6293601..6570a49 100644 --- a/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_preferences_sync_test.cc
@@ -401,4 +401,237 @@ .Wait()); } +using SingleClientPreferencesWithAccountStorageMergeSyncTest = + SingleClientPreferencesWithAccountStorageSyncTest; + +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageMergeSyncTest, + ShouldMergeLocalAndAccountMergeableDictPref) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + GetRegistry(GetProfile(0)) + ->RegisterDictionaryPref( + sync_preferences::kSyncableMergeableDictPrefForTesting, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + + base::Value::Dict local_value = base::Value::Dict() + .Set("google.com", "allow") + .Set("wikipedia.org", "allow"); + GetPrefs(0)->SetDict(sync_preferences::kSyncableMergeableDictPrefForTesting, + local_value.Clone()); + + base::Value::Dict server_value = base::Value::Dict() + .Set("facebook.com", "deny") + .Set("microsoft.com", "deny") + .Set("wikipedia.org", "deny"); + InjectPreferenceToFakeServer( + syncer::PREFERENCES, + sync_preferences::kSyncableMergeableDictPrefForTesting, + base::Value(server_value.Clone())); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // Fake server value is synced to the account store and the dict value is + // merged with the value in the local store. + auto merged_value = base::Value::Dict() + .Set("facebook.com", "deny") + .Set("google.com", "allow") + .Set("microsoft.com", "deny") + .Set("wikipedia.org", "deny"); + EXPECT_EQ(GetPrefs(0)->GetDict( + sync_preferences::kSyncableMergeableDictPrefForTesting), + merged_value); + + // Disable syncing preferences. + ASSERT_TRUE(GetClient(0)->DisableSyncForType( + syncer::UserSelectableType::kPreferences)); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // The local store remains unchanged. + EXPECT_EQ(GetPrefs(0)->GetDict( + sync_preferences::kSyncableMergeableDictPrefForTesting), + local_value); +} + +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageMergeSyncTest, + ShouldUnmergeMergeableDictPrefUponUpdate) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + GetRegistry(GetProfile(0)) + ->RegisterDictionaryPref( + sync_preferences::kSyncableMergeableDictPrefForTesting, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); + + base::Value::Dict local_value = base::Value::Dict() + .Set("google.com", "allow") + .Set("wikipedia.org", "allow"); + GetPrefs(0)->SetDict(sync_preferences::kSyncableMergeableDictPrefForTesting, + local_value.Clone()); + + base::Value::Dict server_value = base::Value::Dict() + .Set("facebook.com", "deny") + .Set("microsoft.com", "deny") + .Set("wikipedia.org", "deny"); + InjectPreferenceToFakeServer( + syncer::PREFERENCES, + sync_preferences::kSyncableMergeableDictPrefForTesting, + base::Value(server_value.Clone())); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // Fake server value is synced to the account store and the dict value is + // merged with the value in the local store. + auto merged_value = base::Value::Dict() + .Set("facebook.com", "deny") + .Set("google.com", "allow") + .Set("microsoft.com", "deny") + .Set("wikipedia.org", "deny"); + ASSERT_EQ(GetPrefs(0)->GetDict( + sync_preferences::kSyncableMergeableDictPrefForTesting), + merged_value); + + auto updated_value = base::Value::Dict() + // New key, should get added to both stores. + .Set("cnn.com", "deny") + // Updated value, should get added to both stores. + .Set("facebook.com", "allow") + // Unchanged, should be only in the local store. + .Set("google.com", "allow") + // Unchanged, should be only in the account store. + .Set("microsoft.com", "deny"); + + GetPrefs(0)->SetDict(sync_preferences::kSyncableMergeableDictPrefForTesting, + updated_value.Clone()); + ASSERT_EQ(GetPrefs(0)->GetDict( + sync_preferences::kSyncableMergeableDictPrefForTesting), + updated_value); + + // Note that entry for "wikipedia.org" was removed. + auto updated_server_value = base::Value::Dict() + .Set("cnn.com", "deny") + .Set("facebook.com", "allow") + .Set("microsoft.com", "deny"); + EXPECT_TRUE( + FakeServerPrefMatchesValueChecker( + syncer::ModelType::PREFERENCES, + sync_preferences::kSyncableMergeableDictPrefForTesting, + ConvertToSyncedPrefValue(base::Value(updated_server_value.Clone()))) + .Wait()); + + // Disable syncing preferences. + ASSERT_TRUE(GetClient(0)->DisableSyncForType( + syncer::UserSelectableType::kPreferences)); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // Note that entry for "wikipedia.org" was removed. + auto updated_local_value = base::Value::Dict() + .Set("cnn.com", "deny") + .Set("facebook.com", "allow") + .Set("google.com", "allow"); + EXPECT_EQ(GetPrefs(0)->GetDict( + sync_preferences::kSyncableMergeableDictPrefForTesting), + updated_local_value); +} + +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageMergeSyncTest, + ShouldMergeLocalAndAccountMergeableListPref) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + base::Value::List local_value = + base::Value::List().Append("cnn.com").Append("facebook.com"); + GetPrefs(0)->SetList(prefs::kURLsToRestoreOnStartup, local_value.Clone()); + + base::Value::List server_value = + base::Value::List().Append("google.com").Append("facebook.com"); + InjectPreferenceToFakeServer(syncer::PREFERENCES, + prefs::kURLsToRestoreOnStartup, + base::Value(server_value.Clone())); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // Fake server value is synced to the account store and the list value is + // merged with the value in the local store. + auto merged_value = base::Value::List() + .Append("google.com") + .Append("facebook.com") + .Append("cnn.com"); + EXPECT_EQ(GetPrefs(0)->GetList(prefs::kURLsToRestoreOnStartup), merged_value); + + // Disable syncing preferences. + ASSERT_TRUE(GetClient(0)->DisableSyncForType( + syncer::UserSelectableType::kPreferences)); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // The local store remains unchanged. + EXPECT_EQ(GetPrefs(0)->GetList(prefs::kURLsToRestoreOnStartup), local_value); +} + +IN_PROC_BROWSER_TEST_F(SingleClientPreferencesWithAccountStorageMergeSyncTest, + ShouldUnmergeMergeableListPrefUponUpdate) { + ASSERT_TRUE(SetupClients()) << "SetupClients() failed."; + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + base::Value::List local_value = + base::Value::List().Append("cnn.com").Append("facebook.com"); + GetPrefs(0)->SetList(prefs::kURLsToRestoreOnStartup, local_value.Clone()); + + base::Value::List server_value = + base::Value::List().Append("google.com").Append("facebook.com"); + InjectPreferenceToFakeServer(syncer::PREFERENCES, + prefs::kURLsToRestoreOnStartup, + base::Value(server_value.Clone())); + + // Enable Sync. + ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; + ASSERT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // Fake server value is synced to the account store and the list value is + // merged with the value in the local store. + auto merged_value = base::Value::List() + .Append("google.com") + .Append("facebook.com") + .Append("cnn.com"); + ASSERT_EQ(GetPrefs(0)->GetList(prefs::kURLsToRestoreOnStartup), merged_value); + + // Common entry for "facebook.com" is removed. + auto updated_value = + base::Value::List().Append("google.com").Append("cnn.com"); + GetPrefs(0)->SetList(prefs::kURLsToRestoreOnStartup, updated_value.Clone()); + ASSERT_EQ(GetPrefs(0)->GetList(prefs::kURLsToRestoreOnStartup), + updated_value); + + // No standard unmerging logic exists for list prefs and hence, updated value + // is written to the account store and the local store. + EXPECT_TRUE(FakeServerPrefMatchesValueChecker( + syncer::ModelType::PREFERENCES, + prefs::kURLsToRestoreOnStartup, + ConvertToSyncedPrefValue(base::Value(updated_value.Clone()))) + .Wait()); + + // Disable syncing preferences. + ASSERT_TRUE(GetClient(0)->DisableSyncForType( + syncer::UserSelectableType::kPreferences)); + ASSERT_FALSE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); + + // The local store remains unchanged. + EXPECT_EQ(GetPrefs(0)->GetList(prefs::kURLsToRestoreOnStartup), + updated_value); +} + } // namespace
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc index 44bca6a..f5a131b5 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.cc
@@ -62,9 +62,7 @@ auto* manager = static_cast<BrowserAutofillManager*>(driver.autofill_manager()); manager->set_touch_to_fill_delegate( - std::make_unique<TouchToFillDelegateAndroidImpl>( - manager, FastCheckoutClient::GetOrCreateForWebContents( - factory.web_contents()))); + std::make_unique<TouchToFillDelegateAndroidImpl>(manager)); } bool TouchToFillCreditCardController::Show(
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller_unittest.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller_unittest.cc index 6ab8c41..850f9c0f 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller_unittest.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "chrome/browser/fast_checkout/mock_fast_checkout_client.h" #include "chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h" #include "chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_view.h" #include "chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_view_controller.h" @@ -58,9 +57,8 @@ : public TouchToFillDelegateAndroidImpl { public: explicit MockTouchToFillDelegateAndroidImpl( - MockBrowserAutofillManager* autofill_manager, - MockFastCheckoutClient* fast_checkout_client) - : TouchToFillDelegateAndroidImpl(autofill_manager, fast_checkout_client) { + MockBrowserAutofillManager* autofill_manager) + : TouchToFillDelegateAndroidImpl(autofill_manager) { ON_CALL(*this, GetManager).WillByDefault(Return(autofill_manager)); ON_CALL(*this, ShouldShowScanCreditCard).WillByDefault(Return(true)); } @@ -104,11 +102,9 @@ NavigateAndCommit(GURL("about:blank")); credit_card_controller_ = std::make_unique<TouchToFillCreditCardController>(&autofill_client()); - fast_checkout_client_ = - std::make_unique<MockFastCheckoutClient>(web_contents()); autofill_manager().set_touch_to_fill_delegate( std::make_unique<MockTouchToFillDelegateAndroidImpl>( - &autofill_manager(), fast_checkout_client_.get())); + &autofill_manager())); mock_view_ = std::make_unique<MockTouchToFillCreditCardViewImpl>(); } @@ -163,7 +159,6 @@ autofill_client_injector_; TestAutofillManagerInjector<MockBrowserAutofillManager> autofill_manager_injector_; - std::unique_ptr<MockFastCheckoutClient> fast_checkout_client_; FormGlobalId some_form_ = test::MakeFormGlobalId(); FieldGlobalId some_field_ = test::MakeFieldGlobalId(); };
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_quality_metrics_unittest.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_quality_metrics_unittest.cc index e988854f..a06eed5 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_quality_metrics_unittest.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_quality_metrics_unittest.cc
@@ -22,30 +22,6 @@ namespace autofill::autofill_metrics { -class MockFastCheckoutClient : public FastCheckoutClient { - public: - MockFastCheckoutClient() = default; - ~MockFastCheckoutClient() override = default; - MOCK_METHOD(bool, - TryToStart, - (const GURL&, - const autofill::FormData&, - const autofill::FormFieldData&, - base::WeakPtr<autofill::AutofillManager>), - (override)); - MOCK_METHOD(void, Stop, (bool), (override)); - MOCK_METHOD(bool, IsRunning, (), (const, override)); - MOCK_METHOD(bool, IsShowing, (), (const, override)); - MOCK_METHOD(void, OnNavigation, (const GURL&, bool), (override)); - MOCK_METHOD(bool, - IsSupported, - (const autofill::FormData&, - const autofill::FormFieldData&, - const autofill::AutofillManager&), - (override)); - MOCK_METHOD(bool, IsNotShownYet, (), (const, override)); -}; - struct TouchToFillForCreditCardsTestCase { std::vector<ServerFieldType> field_types; std::vector<bool> fields_have_autofilled_values; @@ -63,11 +39,13 @@ .WillByDefault(testing::Return(true)); ON_CALL(*autofill_client_, IsTouchToFillCreditCardSupported) .WillByDefault(testing::Return(true)); - ON_CALL(fast_checkout_client_, IsNotShownYet) + MockFastCheckoutClient* fast_checkout_client = + static_cast<MockFastCheckoutClient*>( + autofill_client_->GetFastCheckoutClient()); + ON_CALL(*fast_checkout_client, IsNotShownYet) .WillByDefault(testing::Return(true)); autofill_manager().set_touch_to_fill_delegate( - std::make_unique<TouchToFillDelegateAndroidImpl>( - &autofill_manager(), &fast_checkout_client_)); + std::make_unique<TouchToFillDelegateAndroidImpl>(&autofill_manager())); } void TearDown() override { TearDownHelper(); } @@ -123,9 +101,6 @@ return *static_cast<TouchToFillDelegateAndroidImpl*>( autofill_manager().touch_to_fill_delegate()); } - - private: - NiceMock<MockFastCheckoutClient> fast_checkout_client_; }; // The test workflow:
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.cc index 26c3a1e9..944af82d 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.cc
@@ -6,7 +6,6 @@ #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" -#include "chrome/browser/fast_checkout/fast_checkout_client.h" #include "components/autofill/content/browser/content_autofill_client.h" #include "components/autofill/core/browser/autofill_browser_util.h" #include "components/autofill/core/browser/autofill_manager.h" @@ -15,6 +14,7 @@ #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/form_types.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "components/autofill/core/browser/ui/popup_types.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_features.h" @@ -37,9 +37,8 @@ TouchToFillDelegateAndroidImpl::DryRunResult::~DryRunResult() = default; TouchToFillDelegateAndroidImpl::TouchToFillDelegateAndroidImpl( - BrowserAutofillManager* manager, - FastCheckoutClient* fast_checkout_client) - : manager_(manager), fast_checkout_client_(fast_checkout_client) { + BrowserAutofillManager* manager) + : manager_(manager) { DCHECK(manager); } @@ -94,7 +93,7 @@ return {TriggerOutcome::kFieldNotEmptyOrNotFocusable, {}}; } // Trigger only if Fast Checkout was not shown before. - if (!fast_checkout_client_->IsNotShownYet()) { + if (!manager_->client()->GetFastCheckoutClient()->IsNotShownYet()) { return {TriggerOutcome::kFastCheckoutWasShown, {}}; } // Trigger only if there is at least 1 complete valid credit card on file.
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.h b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.h index ec4842e..a3b3c28 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.h +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl.h
@@ -8,10 +8,10 @@ #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" #include "base/timer/timer.h" -#include "chrome/browser/fast_checkout/fast_checkout_client.h" #include "components/autofill/core/browser/autofill_manager.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/form_structure.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "components/autofill/core/browser/ui/touch_to_fill_delegate.h" #include "components/autofill/core/common/form_data.h" #include "components/autofill/core/common/form_field_data.h" @@ -92,8 +92,7 @@ // TODO(crbug.com/1324900): Consider using more descriptive name. class TouchToFillDelegateAndroidImpl : public TouchToFillDelegate { public: - TouchToFillDelegateAndroidImpl(BrowserAutofillManager* manager, - FastCheckoutClient* fast_checkout_client); + explicit TouchToFillDelegateAndroidImpl(BrowserAutofillManager* manager); TouchToFillDelegateAndroidImpl(const TouchToFillDelegateAndroidImpl&) = delete; TouchToFillDelegateAndroidImpl& operator=( @@ -187,7 +186,6 @@ TouchToFillState ttf_credit_card_state_ = TouchToFillState::kShouldShow; const raw_ptr<BrowserAutofillManager> manager_; - const raw_ptr<FastCheckoutClient> fast_checkout_client_; FormData query_form_; FormFieldData query_field_; bool dismissed_by_user_;
diff --git a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl_unittest.cc b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl_unittest.cc index a000210..4e5c535 100644 --- a/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl_unittest.cc +++ b/chrome/browser/touch_to_fill/payments/android/touch_to_fill_delegate_android_impl_unittest.cc
@@ -169,7 +169,7 @@ auto touch_to_fill_delegate = std::make_unique<TouchToFillDelegateAndroidImpl>( - browser_autofill_manager_.get(), &fast_checkout_client_); + browser_autofill_manager_.get()); touch_to_fill_delegate_ = touch_to_fill_delegate.get(); base::WeakPtr<TouchToFillDelegateAndroidImpl> touch_to_fill_delegate_weak = touch_to_fill_delegate->GetWeakPtr(); @@ -197,7 +197,10 @@ delegate->OnDismissed(/*dismissed_by_user=*/false); } }); - ON_CALL(fast_checkout_client_, IsNotShownYet) + MockFastCheckoutClient* fast_checkout_client = + static_cast<MockFastCheckoutClient*>( + autofill_client_.GetFastCheckoutClient()); + ON_CALL(*fast_checkout_client, IsNotShownYet) .WillByDefault(testing::Return(true)); test::CreateTestCreditCardFormData(&form_, /*is_https=*/true, @@ -225,7 +228,6 @@ base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; test::AutofillUnitTestEnvironment autofill_test_environment_; - NiceMock<MockFastCheckoutClient> fast_checkout_client_; NiceMock<MockAutofillClient> autofill_client_; std::unique_ptr<TestAutofillDriver> autofill_driver_; std::unique_ptr<MockBrowserAutofillManager> browser_autofill_manager_; @@ -510,7 +512,10 @@ TEST_F(TouchToFillDelegateAndroidImplUnitTest, TryToShowTouchToFillFailsIfFastCheckoutWasShown) { ASSERT_FALSE(touch_to_fill_delegate_->IsShowingTouchToFill()); - EXPECT_CALL(fast_checkout_client_, IsNotShownYet).WillOnce(Return(false)); + MockFastCheckoutClient* fast_checkout_client = + static_cast<MockFastCheckoutClient*>( + autofill_client_.GetFastCheckoutClient()); + EXPECT_CALL(*fast_checkout_client, IsNotShownYet).WillOnce(Return(false)); TryToShowTouchToFill(/*expected_success=*/false); histogram_tester_.ExpectUniqueSample(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 1f9c1c76..1464d1f 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -2790,8 +2790,6 @@ "webui/ash/login/app_downloading_screen_handler.h", "webui/ash/login/app_launch_splash_screen_handler.cc", "webui/ash/login/app_launch_splash_screen_handler.h", - "webui/ash/login/arc_terms_of_service_screen_handler.cc", - "webui/ash/login/arc_terms_of_service_screen_handler.h", "webui/ash/login/arc_vm_data_migration_screen_handler.cc", "webui/ash/login/arc_vm_data_migration_screen_handler.h", "webui/ash/login/assistant_optin_flow_screen_handler.cc",
diff --git a/chrome/browser/ui/android/device_lock/BUILD.gn b/chrome/browser/ui/android/device_lock/BUILD.gn index 4786904..cf23825 100644 --- a/chrome/browser/ui/android/device_lock/BUILD.gn +++ b/chrome/browser/ui/android/device_lock/BUILD.gn
@@ -6,6 +6,8 @@ android_library("java") { sources = [ + "java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinator.java", + "java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediator.java", "java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockProperties.java", "java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockView.java", "java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinder.java", @@ -23,7 +25,10 @@ android_library("javatests") { testonly = true resources_package = "org.chromium.chrome.browser.ui.device_lock" - sources = [ "javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java" ] + sources = [ + "javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinatorTest.java", + "javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java", + ] deps = [ ":java", ":java_resources", @@ -44,6 +49,32 @@ ] } +robolectric_library("junit") { + resources_package = "org.chromium.chrome.browser.ui.device_lock" + sources = [ "junit/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediatorUnitTest.java" ] + + deps = [ + ":java", + ":java_resources", + "//base:base_java", + "//base:base_java_test_support", + "//base:base_junit_test_support", + "//chrome/android:chrome_java", + "//chrome/browser/flags:java", + "//chrome/browser/preferences:java", + "//content/public/android:content_full_java", + "//content/public/test/android:content_java_test_support", + "//third_party/androidx:androidx_constraintlayout_constraintlayout_java", + "//third_party/androidx:androidx_test_core_java", + "//third_party/androidx:androidx_test_ext_junit_java", + "//third_party/androidx:androidx_test_runner_java", + "//third_party/junit:junit", + "//third_party/mockito:mockito_java", + "//ui/android:ui_java_test_support", + "//ui/android:ui_no_recycler_view_java", + ] +} + android_resources("java_resources") { sources = [ "java/res/drawable-night/device_lock_illustration.xml",
diff --git a/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinator.java b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinator.java new file mode 100644 index 0000000..65cbbc3 --- /dev/null +++ b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinator.java
@@ -0,0 +1,46 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.device_lock; + +import android.content.Context; +import android.view.LayoutInflater; + +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; + +/** + * The coordinator handles the creation, update, and interaction of the device lock UI. + */ +public class DeviceLockCoordinator { + /** Delegate for device lock MVC. */ + public interface Delegate { + /** + * The device has a device lock set and the user has chosen to continue. + */ + void onDeviceLockReady(); + + /** + * The user has decided to dismiss the dialog without setting a device lock. + */ + void onDeviceLockRefused(); + } + + private final DeviceLockMediator mMediator; + private final DeviceLockView mView; + private final PropertyModelChangeProcessor mPropertyModelChangeProcessor; + + public DeviceLockCoordinator(boolean inSignInFlow, Delegate delegate, Context context) { + mView = DeviceLockView.create(LayoutInflater.from(context)); + mMediator = new DeviceLockMediator(inSignInFlow, delegate, context); + mPropertyModelChangeProcessor = PropertyModelChangeProcessor.create( + mMediator.getModel(), mView, DeviceLockViewBinder::bind); + } + + /** + * Releases the resources used by the coordinator. + */ + public void destroy() { + mPropertyModelChangeProcessor.destroy(); + } +}
diff --git a/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediator.java b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediator.java new file mode 100644 index 0000000..5b8fee2d --- /dev/null +++ b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediator.java
@@ -0,0 +1,73 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.device_lock; + +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ALL_KEYS; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.DEVICE_SUPPORTS_PIN_CREATION_INTENT; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.IN_SIGN_IN_FLOW; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_CREATE_DEVICE_LOCK_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_DISMISS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_GO_TO_OS_SETTINGS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_USER_UNDERSTANDS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.PREEXISTING_DEVICE_LOCK; + +import android.app.KeyguardManager; +import android.app.admin.DevicePolicyManager; +import android.content.Context; +import android.content.Intent; + +import org.chromium.ui.modelutil.PropertyModel; + +/** + * The mediator handles which design the device lock UI displays and interacts through the + * coordinator delegate. + */ +public class DeviceLockMediator { + private final PropertyModel mModel; + private final DeviceLockCoordinator.Delegate mDelegate; + private final Context mContext; + + public DeviceLockMediator( + boolean inSignInFlow, DeviceLockCoordinator.Delegate delegate, Context context) { + mDelegate = delegate; + mContext = context; + mModel = new PropertyModel.Builder(ALL_KEYS) + .with(PREEXISTING_DEVICE_LOCK, isDeviceLockPresent()) + .with(DEVICE_SUPPORTS_PIN_CREATION_INTENT, + isDeviceLockCreationIntentSupported()) + .with(IN_SIGN_IN_FLOW, inSignInFlow) + .with(ON_CREATE_DEVICE_LOCK_CLICKED, v -> navigateToDeviceLockCreation()) + .with(ON_GO_TO_OS_SETTINGS_CLICKED, v -> navigateToOSSettings()) + .with(ON_USER_UNDERSTANDS_CLICKED, v -> delegate.onDeviceLockReady()) + .with(ON_DISMISS_CLICKED, v -> delegate.onDeviceLockRefused()) + .build(); + } + + PropertyModel getModel() { + return mModel; + } + + private boolean isDeviceLockPresent() { + KeyguardManager keyguardManager = + (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + return keyguardManager.isDeviceSecure(); + } + + private boolean isDeviceLockCreationIntentSupported() { + return new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD) + .resolveActivity(mContext.getPackageManager()) + != null; + } + + private void navigateToDeviceLockCreation() { + // TODO(crbug.com/1432024): Add logic to navigate to device lock creation + mDelegate.onDeviceLockReady(); + } + + private void navigateToOSSettings() { + // TODO(crbug.com/1432024): Add logic to navigate to OS security settings + mDelegate.onDeviceLockReady(); + } +}
diff --git a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinatorTest.java b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinatorTest.java new file mode 100644 index 0000000..1ce57d8 --- /dev/null +++ b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockCoordinatorTest.java
@@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.device_lock; + +import static org.junit.Assert.assertNotEquals; + +import android.content.Context; + +import androidx.test.filters.SmallTest; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ContextUtils; +import org.chromium.base.test.util.Batch; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; + +/** + * Tests for {@link DeviceLockCoordinator}. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@Batch(Batch.UNIT_TESTS) +public class DeviceLockCoordinatorTest { + private Context mContext; + + @Before + public void setUpTest() { + mContext = ContextUtils.getApplicationContext(); + } + + // TODO(crbug.com/1432028): Add more tests, particularly render tests, once flow is finalized + @Test + @SmallTest + public void testDeviceLockCoordinator_simpleTest() { + DeviceLockCoordinator deviceLockCoordinator = + new DeviceLockCoordinator(true, new MockDelegate(), mContext); + assertNotEquals(deviceLockCoordinator, null); + + deviceLockCoordinator.destroy(); + } + + private class MockDelegate implements DeviceLockCoordinator.Delegate { + @Override + public void onDeviceLockReady() {} + + @Override + public void onDeviceLockRefused() {} + } +}
diff --git a/chrome/browser/ui/android/device_lock/junit/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediatorUnitTest.java b/chrome/browser/ui/android/device_lock/junit/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediatorUnitTest.java new file mode 100644 index 0000000..141dc6ba --- /dev/null +++ b/chrome/browser/ui/android/device_lock/junit/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockMediatorUnitTest.java
@@ -0,0 +1,189 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.device_lock; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.DEVICE_SUPPORTS_PIN_CREATION_INTENT; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.IN_SIGN_IN_FLOW; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_CREATE_DEVICE_LOCK_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_DISMISS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_GO_TO_OS_SETTINGS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.ON_USER_UNDERSTANDS_CLICKED; +import static org.chromium.chrome.browser.ui.device_lock.DeviceLockProperties.PREEXISTING_DEVICE_LOCK; + +import android.app.KeyguardManager; +import android.app.admin.DevicePolicyManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ResolveInfo; + +import androidx.constraintlayout.utils.widget.MockView; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowKeyguardManager; +import org.robolectric.shadows.ShadowPackageManager; + +import org.chromium.base.ContextUtils; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.JniMocker; + +/** Unit tests for the {@link DeviceLockMediator}.*/ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class DeviceLockMediatorUnitTest { + @Rule + public JniMocker mJniMocker = new JniMocker(); + + @Mock + public Context mContext; + @Mock + private MockDelegate mDelegate; + + private ShadowKeyguardManager mShadowKeyguardManager; + private ShadowPackageManager mShadowPackageManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = ContextUtils.getApplicationContext(); + mDelegate = Mockito.mock(MockDelegate.class); + + mShadowKeyguardManager = Shadows.shadowOf( + (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE)); + mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager()); + } + + @After + public void tearDown() {} + + @Test + public void testDeviceLockMediator_deviceSecure_preExistingDeviceLockIsTrue() { + mShadowKeyguardManager.setIsDeviceSecure(true); + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + + assertTrue("PropertyModel PREEXISTING_DEVICE_LOCK should be True", + deviceLockMediator.getModel().get(PREEXISTING_DEVICE_LOCK)); + } + + @Test + public void testDeviceLockMediator_deviceNotSecure_preExistingDeviceLockIsFalse() { + mShadowKeyguardManager.setIsDeviceSecure(false); + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + + assertFalse("PropertyModel PREEXISTING_DEVICE_LOCK should be True", + deviceLockMediator.getModel().get(PREEXISTING_DEVICE_LOCK)); + } + + @Test + public void + testDeviceLockMediator_deviceLockCreationIntentSupported_deviceSupportsPINIntentIsTrue() { + Intent intent = new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); + ResolveInfo resolveInfo = new ResolveInfo(); + resolveInfo.isDefault = true; + + ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.packageName = "example.package"; + resolveInfo.activityInfo = new ActivityInfo(); + resolveInfo.activityInfo.applicationInfo = applicationInfo; + resolveInfo.activityInfo.name = "ExamplePackage"; + + mShadowPackageManager.addResolveInfoForIntent(intent, resolveInfo); + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + + assertTrue("PropertyModel DEVICE_SUPPORTS_PIN_CREATION_INTENT should be True", + deviceLockMediator.getModel().get(DEVICE_SUPPORTS_PIN_CREATION_INTENT)); + } + + @Test + public void + testDeviceLockMediator_deviceLockCreationIntentNotSupported_deviceSupportsPINIntentIsFalse() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + + assertFalse("PropertyModel DEVICE_SUPPORTS_PIN_CREATION_INTENT should be False", + deviceLockMediator.getModel().get(DEVICE_SUPPORTS_PIN_CREATION_INTENT)); + } + + @Test + public void testDeviceLockMediator_inSignInFlow_inSignInFlowIsTrue() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(true, mDelegate, mContext); + + assertTrue("PropertyModel IN_SIGN_IN_FLOW should be True", + deviceLockMediator.getModel().get(IN_SIGN_IN_FLOW)); + } + + @Test + public void testDeviceLockMediator_notInSignInFlow_inSignInFlowIsFalse() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + + assertFalse("PropertyModel IN_SIGN_IN_FLOW should be False", + deviceLockMediator.getModel().get(IN_SIGN_IN_FLOW)); + } + + @Test + public void testDeviceLockMediator_createDeviceLockOnClick_callsDelegateOnDeviceLockReady() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + deviceLockMediator.getModel() + .get(ON_CREATE_DEVICE_LOCK_CLICKED) + .onClick(new MockView(mContext)); + + verify(mDelegate, times(1)).onDeviceLockReady(); + verify(mDelegate, times(0)).onDeviceLockRefused(); + } + + @Test + public void testDeviceLockMediator_goToOSSettingsOnClick_callsDelegateOnDeviceLockReady() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + deviceLockMediator.getModel() + .get(ON_GO_TO_OS_SETTINGS_CLICKED) + .onClick(new MockView(mContext)); + + verify(mDelegate, times(1)).onDeviceLockReady(); + verify(mDelegate, times(0)).onDeviceLockRefused(); + } + + @Test + public void testDeviceLockMediator_userUnderstandsOnClick_callsDelegateOnDeviceLockReady() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + deviceLockMediator.getModel() + .get(ON_USER_UNDERSTANDS_CLICKED) + .onClick(new MockView(mContext)); + + verify(mDelegate, times(1)).onDeviceLockReady(); + verify(mDelegate, times(0)).onDeviceLockRefused(); + } + + @Test + public void testDeviceLockMediator_dismissOnClick_callsDelegateOnDeviceLockRefused() { + DeviceLockMediator deviceLockMediator = new DeviceLockMediator(false, mDelegate, mContext); + deviceLockMediator.getModel().get(ON_DISMISS_CLICKED).onClick(new MockView(mContext)); + + verify(mDelegate, times(0)).onDeviceLockReady(); + verify(mDelegate, times(1)).onDeviceLockRefused(); + } + + private class MockDelegate implements DeviceLockCoordinator.Delegate { + @Override + public void onDeviceLockReady() {} + + @Override + public void onDeviceLockRefused() {} + } +}
diff --git a/chrome/browser/ui/android/edge_to_edge/BUILD.gn b/chrome/browser/ui/android/edge_to_edge/BUILD.gn new file mode 100644 index 0000000..198aecea --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/BUILD.gn
@@ -0,0 +1,23 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") +import("//chrome/android/features/android_library_factory_tmpl.gni") + +android_library("java") { + sources = [ "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeController.java" ] + deps = [ "//chrome/browser/android/lifecycle:java" ] +} + +android_library_factory("factory_java") { + # These deps will be inherited by the resulting android_library target. + deps = [ + ":java", + "//third_party/androidx:androidx_appcompat_appcompat_java", + ] + + # This internal file will be replaced by a generated file so the resulting + # android_library target does not actually depend on this internal file. + sources = [ "//chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java" ] +}
diff --git a/chrome/browser/ui/android/edge_to_edge/DEPS b/chrome/browser/ui/android/edge_to_edge/DEPS new file mode 100644 index 0000000..e0afffb --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/DEPS
@@ -0,0 +1,9 @@ +include_rules = [ + "-chrome/browser/ui/android/edge_to_edge/internal", + "+base/android", + "+base/test/android", + "+chrome/browser/android/lifecycle", + "+chrome/browser/flags", + "+chrome/test/android", + ] +
diff --git a/chrome/browser/ui/android/edge_to_edge/DIR_METADATA b/chrome/browser/ui/android/edge_to_edge/DIR_METADATA new file mode 100644 index 0000000..3c061aa --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/DIR_METADATA
@@ -0,0 +1,7 @@ +monorail { + component: "UI>Browser>Mobile>EdgeToEdge" +} +team_email: "edge-to-edge@chromium.org" +os: ANDROID + +
diff --git a/chrome/browser/ui/android/edge_to_edge/OWNERS b/chrome/browser/ui/android/edge_to_edge/OWNERS new file mode 100644 index 0000000..0b65700 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/OWNERS
@@ -0,0 +1,3 @@ +donnd@chromium.org +twellington@chromium.org +
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn b/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn new file mode 100644 index 0000000..e37ed0f2c --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn
@@ -0,0 +1,37 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/android/rules.gni") + +android_library("java") { + visibility = [ + ":*", + "//chrome/android:chrome_all_java", + "//chrome/browser/ui/android/edge_to_edge/test:*", + ] + sources = [ + "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java", + "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java", + ] + deps = [ + "//base:base_java", + "//chrome/browser/android/lifecycle:java", + "//chrome/browser/flags:java", + "//chrome/browser/ui/android/edge_to_edge:java", + "//third_party/androidx:androidx_annotation_annotation_java", + "//third_party/androidx:androidx_appcompat_appcompat_java", + "//third_party/androidx:androidx_core_core_java", + ] +} + +robolectric_library("junit") { + sources = [ "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java" ] + deps = [ + ":java", + "//base:base_java_test_support", + "//base:base_junit_test_support", + "//third_party/androidx:androidx_appcompat_appcompat_java", + "//third_party/junit", + ] +}
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java new file mode 100644 index 0000000..e2dc065 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
@@ -0,0 +1,30 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +import android.os.Build.VERSION_CODES; + +import androidx.appcompat.app.AppCompatActivity; + +import org.chromium.chrome.browser.flags.ChromeFeatureList; + +/** + * Creates an {@link EdgeToEdgeController} used to control drawing using the Android Edge to Edge + * Feature. This allows drawing under Android System Bars. + */ +public class EdgeToEdgeControllerFactory { + /** Creates an {@link EdgeToEdgeController} instance using the given activity. */ + public static EdgeToEdgeController create(AppCompatActivity activity) { + return new EdgeToEdgeControllerImpl(activity); + } + + /** @Return whether the feature is enabled or not. */ + public static boolean isEnabled() { + // Make sure we test SDK version before checking the Feature so Field Trials only collect + // from qualifying devices. + if (android.os.Build.VERSION.SDK_INT < VERSION_CODES.R) return false; + return ChromeFeatureList.isEnabled(ChromeFeatureList.DRAW_EDGE_TO_EDGE); + } +}
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java new file mode 100644 index 0000000..63466e5 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
@@ -0,0 +1,72 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +import android.graphics.Color; +import android.os.Build.VERSION_CODES; +import android.view.View; +import android.view.WindowInsets; + +import androidx.annotation.RequiresApi; +import androidx.annotation.VisibleForTesting; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; + +/** + * Controls use of the Android Edge To Edge feature that allows an App to draw benieth the Status + * and Navigation Bars. For Chrome, we intentend to sometimes draw under the Nav Bar but not the + * Status Bar. + */ +public class EdgeToEdgeControllerImpl implements EdgeToEdgeController { + private static final String TAG = "EdgeToEdgeController"; + + /** The outermost view in our view hierarchy that is identified with a resource ID. */ + private static final int ROOT_UI_VIEW_ID = android.R.id.content; + + private final AppCompatActivity mActivity; + + public EdgeToEdgeControllerImpl(AppCompatActivity activity) { + mActivity = activity; + } + + @Override + @RequiresApi(VERSION_CODES.R) + public void drawUnderSystemBars() { + if (!EdgeToEdgeControllerFactory.isEnabled()) return; + + // Pass the root View to help ensure that everything in the window gets adjusted back to + // regular drawing (except for the edge that we're drawing under). If we use child view, + // some views may not be adjusted back to normal and we'd draw inder all the edges. + drawUnderSystemBars(ROOT_UI_VIEW_ID); + + // TODO(donnd): Conditionally enable on another arm when we've navigated to a new + // page so we can check the web platform notch setting for that page. + } + + @VisibleForTesting + @RequiresApi(VERSION_CODES.R) + @SuppressWarnings("WrongConstant") // For WindowInsets.Type on U+ + void drawUnderSystemBars(int viewId) { + // Setup the basic enabling of the Edge to Edge Android Feature. + // Set up this window to open up all edges to be drawn underneath. + WindowCompat.setDecorFitsSystemWindows(mActivity.getWindow(), false); + // We only make the Nav Bar transparent because it's the only thing we want to draw + // underneath. + mActivity.getWindow().setNavigationBarColor(Color.TRANSPARENT); + + // Now fix all the edges other than the Nav/bottom by insetting with padding. + // This keeps the setDecorFitsSystemWindows from actually drawing under any other edges. + View rootView = mActivity.findViewById(viewId); + assert rootView != null : "Root view for Edge To Edge not found!"; + ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> { + Insets systemInsets = windowInsets.getInsets(WindowInsets.Type.systemBars()); + // Restore the drawing to normal on all edges, except for the bottom (Nav Bar). + view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, 0); + return windowInsets; + }); + } +}
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java new file mode 100644 index 0000000..8805d9d4 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +import androidx.appcompat.app.AppCompatActivity; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +/** + * Tests the EdgeToEdgeController code. Ideally this would include {@link EdgeToEdgeController}, + * {@link EdgeToEdgeControllerFactory}, along with {@link EdgeToEdgeControllerImpl} + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class EdgeToEdgeControllerTest { + EdgeToEdgeControllerImpl mEdgeToEdgeControllerImpl; + + @Before + public void setUp() { + var activity = Robolectric.buildActivity(AppCompatActivity.class).setup().get(); + mEdgeToEdgeControllerImpl = + (EdgeToEdgeControllerImpl) EdgeToEdgeControllerFactory.create(activity); + Assert.assertNotNull(mEdgeToEdgeControllerImpl); + } + + @Test + public void drawUnderSystemBars_basic() { + mEdgeToEdgeControllerImpl.drawUnderSystemBars(); + } + + @Test + public void drawUnderSystemBarsInternal_assertsBadId() { + final int badId = 1234; + Assert.assertThrows( + AssertionError.class, () -> mEdgeToEdgeControllerImpl.drawUnderSystemBars(badId)); + } + + // TODO: Verify inset or drawn under + // TODO: Test with a different SDK +}
diff --git a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeController.java b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeController.java new file mode 100644 index 0000000..ed1eaec --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeController.java
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +/** + * Control drawing using the Android Edge to Edge Feature. + * This allows drawing under Android System Bars. + */ +public interface EdgeToEdgeController { + /** + * Enables drawing underneath one or more of the Android System Bars, e.g. the Navigation Bar. + */ + void drawUnderSystemBars(); +}
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java index 034a9aeb..51c19ed 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoCoordinator.java
@@ -133,4 +133,17 @@ public void onTemplateURLServiceChangedForTesting() { mMediator.onTemplateURLServiceChanged(); } + + /** @see LogoMediator#onLogoClicked */ + public void onLogoClickedForTesting(boolean isAnimatedLogoShowing) { + mMediator.onLogoClicked(isAnimatedLogoShowing); + } + + public void setLogoBridgeForTesting(LogoBridge logoBridge) { + mMediator.setLogoBridgeForTesting(logoBridge); + } + + public void setOnLogoClickUrlForTesting(String onLogoClickUrl) { + mMediator.setOnLogoClickUrlForTesting(onLogoClickUrl); + } }
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoMediator.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoMediator.java index 1490dd92..adff0ff 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoMediator.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoMediator.java
@@ -382,6 +382,10 @@ mAnimatedLogoUrl = animatedLogoUrl; } + void setOnLogoClickUrlForTesting(String onLogoClickUrl) { + mOnLogoClickUrl = onLogoClickUrl; + } + ImageFetcher getImageFetcherForTesting() { return mImageFetcher; }
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb index 3b69877..81dbc415 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_af.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Lys deelopsies is gesluit.</translation> <translation id="1919130412786645364">Laat Chrome-aanmelding toe</translation> <translation id="1922362554271624559">Voorgestelde tale</translation> +<translation id="1924255092154549435">Oortjie is uitgevou</translation> <translation id="1925021887439448749">Voer gepasmaakte webadres in</translation> <translation id="1928696683969751773">Opdaterings</translation> <translation id="19288952978244135">Maak Chrome weer oop.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Titel word vereis</translation> <translation id="5170568018924773124">Wys in vouer</translation> <translation id="5171045022955879922">Soek of tik URL in</translation> +<translation id="5174700554036517242">Oortjie is terug op aanvanklike hoogte</translation> <translation id="5184329579814168207">Maak in Chrome oop</translation> <translation id="5191251636205085390">Vind meer uit oor en beheer nuwe tegnologieë wat beoog om derdepartywebkoekies te vervang</translation> <translation id="5193988420012215838">Gekopieer na jou knipbord</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Meer oor advertensies wat deur ’n werf voorgestel is</translation> <translation id="768618399695552958">Sommige van die bladsye wat jy besoek, word vooraf gelaai. Bladsye kan vooraf deur Google-bedieners gelaai word wanneer hulle van 'n Google-werf af geskakel word.</translation> <translation id="7691043218961417207">Verken inhoud om te volg</translation> +<translation id="7697383401610880082">Sleephandvatsel</translation> <translation id="7698359219371678927">Skep e-pos in <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Gebruik mobiele data</translation> <translation id="7709094866268987903">Belangstellings wat jy verwyder het, sal hier verskyn</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index c3e3aff..ca190b2d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">আপুনি <ph name="SITE_NAME" />ক ফ'ল’ কৰি আছে</translation> <translation id="1502010315804028179">আপোনাৰ পাছৱৰ্ডসমূহ পৰিচালনা কৰিবলৈ, Google Play সেৱা আপডে'ট কৰক</translation> <translation id="1506061864768559482">সন্ধান ইঞ্জিন</translation> +<translation id="1508960385613684700">গোপনীয়তা সম্পৰ্কীয় নিৰ্দেশনা <ph name="BEGIN_NEW" />নতুন<ph name="END_NEW" /></translation> <translation id="1513352483775369820">বুকমার্কবোৰ আৰু ৱেব ইতিহাস</translation> <translation id="1513814250881909472">আপোনাৰ অন্য ডিভাইচৰ পৰা নিজৰ টেবসমূহ পাবলৈ ছিংক কৰক</translation> <translation id="1513858653616922153">পাছৱৰ্ড মচক</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">শ্বেয়াৰ কৰাৰ বিকল্পৰ সূচীখন বন্ধ কৰা হৈছে।</translation> <translation id="1919130412786645364">Chromeত ছাইন ইন কৰিব দিয়ক</translation> <translation id="1922362554271624559">পৰামৰ্শ হিচাপে আগবঢ়োৱা ভাষাসমূহ</translation> +<translation id="1924255092154549435">টেবটো বিস্তাৰ কৰা হৈছে</translation> <translation id="1925021887439448749">কাষ্টম ৱেব ঠিকনা দিয়ক</translation> <translation id="1928696683969751773">আপডে’টসমূহ</translation> <translation id="19288952978244135">Chrome পুনৰ খোলক।</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">শিৰোনাম বাধ্যতামূলক</translation> <translation id="5170568018924773124">ফ’ল্ডাৰত দেখুৱাওক</translation> <translation id="5171045022955879922">সন্ধান কৰক বা URL টাইপ কৰক</translation> +<translation id="5174700554036517242">টেবটো প্ৰাৰম্ভিক উচ্চতালৈ উভতি আহিছে</translation> <translation id="5184329579814168207">Chromeত খোলক</translation> <translation id="5191251636205085390">তৃতীয় পক্ষৰ কুকিৰ স্থান ল'বলৈ বিচৰা নতুন প্ৰযুক্তিৰ বিষয়ে জানক আৰু সেইবোৰ নিয়ন্ত্ৰণ কৰক</translation> <translation id="5193988420012215838">আপোনাৰ ক্লিপব'ৰ্ডলৈ প্ৰতিলিপি কৰা হৈছে</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">ছাইটে পৰামৰ্শ দিয়া বিজ্ঞাপনৰ বিষয়ে অধিক</translation> <translation id="768618399695552958">আপুনি যোৱা কিছুমান পৃষ্ঠা আগতীয়াকৈ ল’ড কৰা হয়। কোনো Googleৰ ছাইটৰ পৰা লিংক কৰিলে পৃষ্ঠাসমূহ Googleৰ ছাৰ্ভাৰৰ পৰা আগতীয়াকৈ ল’ড কৰা হ’ব পাৰে।</translation> <translation id="7691043218961417207">ফ’ল’ কৰিবলৈ সমল অন্বেষণ কৰক</translation> +<translation id="7697383401610880082">টানি আনি এৰা হেণ্ডেল</translation> <translation id="7698359219371678927"><ph name="APP_NAME" />ত ইমেইল সৃষ্টি কৰক</translation> <translation id="7707922173985738739">ম’বাইল ডেটা ব্যৱহাৰ কৰক</translation> <translation id="7709094866268987903">আপুনি আঁতৰোৱা আগ্ৰহসমূহ ইয়াত প্ৰদৰ্শিত হ’ব</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index e3e6e53..741351b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> saytını izləyirsiniz</translation> <translation id="1502010315804028179">Parollarınızı idarə etmək üçün Google Play xidmətlərini güncəlləyin</translation> <translation id="1506061864768559482">Axtarış mühərriki</translation> +<translation id="1508960385613684700">Məxfilik bələdçisi <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Əlfəcin və veb tarixçəsi</translation> <translation id="1513814250881909472">Tablarınızı digər cihazlarınızdan əldə etmək üçün sinxronizasiya edin</translation> <translation id="1513858653616922153">Parolu silin</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Paylaşım seçimlərinin siyahısı bağlıdır.</translation> <translation id="1919130412786645364">Chrome girişinə icazə verin</translation> <translation id="1922362554271624559">Təklif edilən dillər</translation> +<translation id="1924255092154549435">Tab genişləndirildi</translation> <translation id="1925021887439448749">Fərdi veb ünvanı daxil edin</translation> <translation id="1928696683969751773">Güncəlləşmələr</translation> <translation id="19288952978244135">Chrome'u yenidən açın.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Başlıq tələb olunur</translation> <translation id="5170568018924773124">Qovluqda göstərin</translation> <translation id="5171045022955879922">Linki axtarın və ya yazın</translation> +<translation id="5174700554036517242">Tab ilkin hündürlüyə qaytarıldı</translation> <translation id="5184329579814168207">Chrome'da açın</translation> <translation id="5191251636205085390">Üçüncü tərəf kukilərini əvəzləmək üçün hazırlanmış yeni texnologiyalar barədə öyrənin və onlara nəzarət edin</translation> <translation id="5193988420012215838">Buferə kopyalandı</translation> @@ -1249,6 +1252,7 @@ <translation id="7686086654630106285">Saytın təklif etdiyi reklamlar haqqında ətraflı</translation> <translation id="768618399695552958">Ziyarət etdiyiniz bəzi səhifələr əvvəlcədən yüklənib. Səhifələr Google saytından əlaqələndirildikdə Google serverləri vasitəsilə əvvəlcədən yüklənə bilər.</translation> <translation id="7691043218961417207">İzləmək üçün kontentləri araşdırın</translation> +<translation id="7697383401610880082">Dəstəyi çəkin</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> tətbiqində e-poçt yaradın</translation> <translation id="7707922173985738739">Mobil data istifadə edin</translation> <translation id="7709094866268987903">Sildiyiniz maraqlar burada görünəcək</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index efde7d3..1089fea 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Следвате <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">За да управлявате паролите си, актуализирайте услугите за Google Play</translation> <translation id="1506061864768559482">Търсеща машина</translation> +<translation id="1508960385613684700">Ръководство за поверителност <ph name="BEGIN_NEW" />Ново<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Отметки и посетени сайтове</translation> <translation id="1513814250881909472">Включете синхронизирането, за да получите разделите от другите си устройства</translation> <translation id="1513858653616922153">Изтриване на паролата</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 6c812c3..fa19f57 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">আপনি <ph name="SITE_NAME" /> ফলো করছেন</translation> <translation id="1502010315804028179">আপনার পাসওয়ার্ড ম্যানেজ করার জন্য, Google Play পরিষেবা আপডেট করুন</translation> <translation id="1506061864768559482">সার্চ ইঞ্জিন</translation> +<translation id="1508960385613684700"><ph name="BEGIN_NEW" />নতুন<ph name="END_NEW" /> গোপনীয়তা সংক্রান্ত গাইড</translation> <translation id="1513352483775369820">বুকমার্কগুলি এবং ওয়েব ইতিহাস</translation> <translation id="1513814250881909472">আপনার অন্যান্য ডিভাইস থেকে ট্যাব পেতে সিঙ্ক করুন</translation> <translation id="1513858653616922153">পাসওয়ার্ড মুছুন</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb index 32d61f1..0410867 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bs.xtb
@@ -771,7 +771,7 @@ <translation id="5161254044473106830">Naslov je obavezan</translation> <translation id="5170568018924773124">Prikaži u folderu</translation> <translation id="5171045022955879922">Pretražite ili upišite URL</translation> -<translation id="5174700554036517242">Kartica je vraćena na početnu visinu</translation> +<translation id="5174700554036517242">Izvorna visina kartice je vraćena</translation> <translation id="5184329579814168207">Otvori u Chromeu</translation> <translation id="5191251636205085390">Saznajte više o novim tehnologijama koje za cilj imaju zamjenu kolačića trećih strana i kontrolirajte ih</translation> <translation id="5193988420012215838">Kopirano u međumemoriju</translation> @@ -1254,7 +1254,7 @@ <translation id="7686086654630106285">Više o oglasima koje predlažu web lokacije</translation> <translation id="768618399695552958">Neke od stranica koje posjećujete se predučitavaju. Stranice se mogu predučitati putem Googleovih servera kada se povežu s Googleove web lokacije.</translation> <translation id="7691043218961417207">Istražite sadržaj za praćenje</translation> -<translation id="7697383401610880082">Marker za povlačenje</translation> +<translation id="7697383401610880082">Ručica za prevlačenje</translation> <translation id="7698359219371678927">Kreirajte e-poruku u aplikaciji <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Koristi prijenos podataka na mobilnoj mreži</translation> <translation id="7709094866268987903">Interesovanja koja ste uklonili će se pojaviti ovdje</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index 6655e425..12de355 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">La llista d'opcions de compartició està tancada.</translation> <translation id="1919130412786645364">Permet l'inici de sessió a Chrome</translation> <translation id="1922362554271624559">Idiomes suggerits</translation> +<translation id="1924255092154549435">La pestanya s'ha desplegat</translation> <translation id="1925021887439448749">Introdueix l'adreça web personalitzada</translation> <translation id="1928696683969751773">Actualitzacions</translation> <translation id="19288952978244135">Torna a obrir Chrome.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">Cal indicar un títol</translation> <translation id="5170568018924773124">Mostra a la carpeta</translation> <translation id="5171045022955879922">Cerqueu o escriviu l'URL</translation> +<translation id="5174700554036517242">La pestanya ha tornat a l'alçada inicial</translation> <translation id="5184329579814168207">Obre a Chrome</translation> <translation id="5191251636205085390">Obtén informació sobre les noves tecnologies per substituir les galetes de tercers i controla-les</translation> <translation id="5193988420012215838">S'ha copiat al porta-retalls</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">Més informació sobre els anuncis suggerits per llocs web</translation> <translation id="768618399695552958">Algunes de les pàgines que visites estan precarregades. És possible que les pàgines es precarreguin a través dels servidors de Google quan s'enllacin des d'un lloc web de Google.</translation> <translation id="7691043218961417207">Explora contingut i segueix-lo</translation> +<translation id="7697383401610880082">Ansa per arrossegar</translation> <translation id="7698359219371678927">Crea una adreça electrònica a <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Utilitza dades mòbils</translation> <translation id="7709094866268987903">Els interessos que hagis suprimit es mostraran aquí</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index d8e0b3a..ea7c4d8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Rydych yn dilyn <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">I reoli eich cyfrineiriau, diweddarwch wasanaethau Google Play</translation> <translation id="1506061864768559482">Peiriant chwilio</translation> +<translation id="1508960385613684700">Canllaw preifatrwydd <ph name="BEGIN_NEW" />Newydd<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Nodau tudalen a hanes gwe</translation> <translation id="1513814250881909472">Cysonwch i gael eich tabiau o'ch dyfeisiau eraill</translation> <translation id="1513858653616922153">Dileu'r cyfrinair</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Mae'r rhestr o ddewisiadau rhannu ar gau.</translation> <translation id="1919130412786645364">Caniatáu mewngofnodi i Chrome</translation> <translation id="1922362554271624559">Ieithoedd sydd wedi'u hawgrymu</translation> +<translation id="1924255092154549435">Mae'r tab wedi'i ehangu</translation> <translation id="1925021887439448749">Rhowch gyfeiriad gwe personol</translation> <translation id="1928696683969751773">Diweddariadau</translation> <translation id="19288952978244135">Ailagor Chrome.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Mae teitl yn ofynnol</translation> <translation id="5170568018924773124">Dangos yn y ffolder</translation> <translation id="5171045022955879922">Chwiliwch neu teipiwch URL</translation> +<translation id="5174700554036517242">Mae'r tab yn ôl i'r uchder cychwynnol</translation> <translation id="5184329579814168207">Agor yn Chrome</translation> <translation id="5191251636205085390">Dysgu am a rheoli technolegau newydd sy'n anelu at ddisodli cwcis trydydd parti</translation> <translation id="5193988420012215838">Wedi'i gopïo i'ch clipfwrdd</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Rhagor am hysbysebion a awgrymir gan wefan</translation> <translation id="768618399695552958">Mae rhai o'r tudalennau rydych yn ymweld â nhw wedi'u rhaglwytho. Gellir rhaglwytho tudalennau drwy weinyddion Google pan fyddant wedi'u cysylltu o wefan Google.</translation> <translation id="7691043218961417207">Archwilio cynnwys i ddilyn</translation> +<translation id="7697383401610880082">Bachyn llusgo</translation> <translation id="7698359219371678927">Crëwch e-bost yn <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Defnyddio data symudol</translation> <translation id="7709094866268987903">Bydd diddordebau a dynnwyd gennych yn ymddangos yma</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 8149d68..91f6cdb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -648,7 +648,7 @@ <translation id="4587589328781138893">Websites</translation> <translation id="4594952190837476234">Denne offlineside er fra <ph name="CREATION_TIME" /> og kan afvige fra onlineversionen.</translation> <translation id="4616150815774728855">Åbn <ph name="WEBAPK_NAME" /></translation> -<translation id="4619564267100705184">Bekræft din identitet</translation> +<translation id="4619564267100705184">Verificer din identitet</translation> <translation id="4634124774493850572">Brug adgangskode</translation> <translation id="4637420359569396807">Med annoncemåling kan der deles begrænsede typer data mellem websites og apps for at måle, hvor effektive deres annoncer er, f.eks. det tidspunkt på dagen, hvor der blev vist en annonce til dig.</translation> <translation id="4640331037679501949">{NUM_PASSWORDS,plural, =1{1 kompromitteret adgangskode}one{# kompromitteret adgangskode}other{# kompromitterede adgangskoder}}</translation> @@ -1381,7 +1381,7 @@ <translation id="835847953965672673"><ph name="NUMBER_OF_DOWNLOADS" /> downloads blev gendannet</translation> <translation id="8368001212524806591">Overvåg pris</translation> <translation id="8383226135083126309"><ph name="BEGIN_BOLD" />Sådan bruger vi disse data:<ph name="END_BOLD" /> Chrome kan estimere dine interesser. Senere kan et website, du besøger, anmode Chrome om at se dine interesser med henblik på at tilpasse de annoncer, du ser.</translation> -<translation id="8387617938027387193">Bekræft din identitet</translation> +<translation id="8387617938027387193">Verificer din identitet</translation> <translation id="8393700583063109961">Send en besked</translation> <translation id="8394720698884623075">Webadresser tjekkes i forhold til en liste over usikre websites, der er gemt i Chrome</translation> <translation id="8402673309244746971">Gå til Følger</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index e72b6cf4..b97ba4a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Du folgst „<ph name="SITE_NAME" />“</translation> <translation id="1502010315804028179">Damit du deine Passwörter verwalten kannst, musst du die Google Play-Dienste aktualisieren</translation> <translation id="1506061864768559482">Suchmaschine</translation> +<translation id="1508960385613684700">Datenschutz-Leitfaden <ph name="BEGIN_NEW" />Neu<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Lesezeichen und Webprotokoll</translation> <translation id="1513814250881909472">Synchronisieren, um deine Tabs von anderen Geräten abzurufen</translation> <translation id="1513858653616922153">Passwort löschen</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index a217432..14c4143 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Estás siguiendo a <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Para gestionar tus contraseñas, actualiza Servicios de Google Play</translation> <translation id="1506061864768559482">Buscador</translation> +<translation id="1508960385613684700">Guía de privacidad <ph name="BEGIN_NEW" />Nuevo<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Historial web y marcadores</translation> <translation id="1513814250881909472">Activa la sincronización para recibir las pestañas de tus otros dispositivos</translation> <translation id="1513858653616922153">Eliminar contraseña</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">La lista de opciones para compartir está cerrada.</translation> <translation id="1919130412786645364">Permitir el inicio de sesión en Chrome</translation> <translation id="1922362554271624559">Idiomas sugeridos</translation> +<translation id="1924255092154549435">La pestaña está desplegada</translation> <translation id="1925021887439448749">Introduce una dirección web personalizada</translation> <translation id="1928696683969751773">Actualizaciones</translation> <translation id="19288952978244135">Vuelve a abrir Chrome.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Título obligatorio</translation> <translation id="5170568018924773124">Mostrar en carpeta</translation> <translation id="5171045022955879922">Busca o escribe una URL</translation> +<translation id="5174700554036517242">La pestaña ha vuelto a su altura inicial</translation> <translation id="5184329579814168207">Abrir en Chrome</translation> <translation id="5191251636205085390">Más información sobre las nuevas tecnologías que aspiran a reemplazar las cookies de terceros y cómo controlarlas</translation> <translation id="5193988420012215838">Se ha copiado al portapapeles</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Más información sobre anuncios sugeridos por sitios</translation> <translation id="768618399695552958">Algunas de las páginas que visitas están precargadas. Es posible que las páginas se precarguen a través de los servidores de Google cuando se enlacen desde un sitio de Google.</translation> <translation id="7691043218961417207">Descubre contenido que puedes seguir</translation> +<translation id="7697383401610880082">Controlador de arrastre</translation> <translation id="7698359219371678927">Crear correo electrónico en <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Se utilizarán datos móviles</translation> <translation id="7709094866268987903">Los intereses que hayas quitado aparecerán aquí</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 50c216c5..3d53e78c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Jagamisvalikute loend on suletud.</translation> <translation id="1919130412786645364">Luba Chrome'i sisselogimine</translation> <translation id="1922362554271624559">Soovitatud keeled</translation> +<translation id="1924255092154549435">Vaheleht on laiendatud</translation> <translation id="1925021887439448749">Sisestage kohandatud veebiaadress</translation> <translation id="1928696683969751773">Värskendused</translation> <translation id="19288952978244135">Avage Chrome uuesti.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Pealkiri on kohustuslik</translation> <translation id="5170568018924773124">Kuva kaustas</translation> <translation id="5171045022955879922">Otsige või sisestage URL</translation> +<translation id="5174700554036517242">Vaheleht on tagasi algsel kõrgusel</translation> <translation id="5184329579814168207">Ava Chrome'is</translation> <translation id="5191251636205085390">Vaadake lisateavet uute tehnoloogiate kohta, mille eesmärk on kolmandate osapoolte küpsisefailid asendada, ja õppige neid haldama.</translation> <translation id="5193988420012215838">Kopeeritud lõikelauale</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Lisateave saidi soovitatud reklaamide kohta</translation> <translation id="768618399695552958">Mõned teie külastatavad lehed on eellaaditud. Kui lehed on lingitud Google'i saidilt, võidakse need eellaadida Google'i serverite kaudu.</translation> <translation id="7691043218961417207">Avastage sisu, mida jälgida</translation> +<translation id="7697383401610880082">Lohistamispide</translation> <translation id="7698359219371678927">Looge meil rakenduses <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Kasuta mobiilset andmesidet</translation> <translation id="7709094866268987903">Eemaldatud huvid kuvatakse siin</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 1f8464cf..e219c44 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> را دنبال میکنید</translation> <translation id="1502010315804028179">برای مدیریت گذرواژههایتان، «خدمات Google Play» را بهروزرسانی کنید</translation> <translation id="1506061864768559482">موتور جستجو</translation> +<translation id="1508960385613684700">راهنمای حریم خصوصی <ph name="BEGIN_NEW" />جدید<ph name="END_NEW" /></translation> <translation id="1513352483775369820">نشانکها و سابقه وب</translation> <translation id="1513814250881909472">برای دریافت برگههایتان از دستگاههای دیگر، همگامسازی کنید</translation> <translation id="1513858653616922153">حذف گذرواژه</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">فهرست گزینههای همرسانی بسته است.</translation> <translation id="1919130412786645364">مجاز کردن ورود به سیستم Chrome</translation> <translation id="1922362554271624559">زبانهای پیشنهادشده</translation> +<translation id="1924255092154549435">برگه گسترده شده است</translation> <translation id="1925021887439448749">نشانی وب سفارشی وارد کنید</translation> <translation id="1928696683969751773">بهروزرسانیها</translation> <translation id="19288952978244135">Chrome را دوباره باز کنید.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">عنوان مورد نیاز است</translation> <translation id="5170568018924773124">نمایش در پوشه</translation> <translation id="5171045022955879922">جستجو یا تایپ URL</translation> +<translation id="5174700554036517242">برگه به ارتفاع اولیهاش برگردانده شد</translation> <translation id="5184329579814168207">باز کردن در Chrome</translation> <translation id="5191251636205085390">با فناوریهای جدیدی که قرار است جایگزین کوکیهای شخص ثالث شود آشنا شوید و آنها را کنترل کنید</translation> <translation id="5193988420012215838">در بریدهدان کپی شد</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">اطلاعات بیشتر درباره آگهیهای پیشنهادی سایت</translation> <translation id="768618399695552958">برخیاز صفحاتی که بازدید میکنید پیشبارگیری شدهاند وقتی صفحات از سایت Google پیوند داده شده باشند، ممکن است ازطریق سرورهای Google پیشبارگیری شوند.</translation> <translation id="7691043218961417207">کاوش محتوا برای دنبال کردن</translation> +<translation id="7697383401610880082">دستگیره کشاندن</translation> <translation id="7698359219371678927">ایجاد ایمیل در <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">استفاده از داده تلفن همراه</translation> <translation id="7709094866268987903">علایقی که برداشتید اینجا نشان داده خواهد شد</translation>
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 d9501fb..ffbb1eb 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
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Seuraat tätä: <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Päivitä Google Play Palvelut, jotta voit ylläpitää salasanoja</translation> <translation id="1506061864768559482">Hakukone</translation> +<translation id="1508960385613684700">Yksityisyysopas <ph name="BEGIN_NEW" />uusi<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Kirjanmerkit ja verkkohistoria</translation> <translation id="1513814250881909472">Synkronoi välilehdet muilta laitteilta</translation> <translation id="1513858653616922153">Poista salasana</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Jakamisvaihtoehtojen lista on suljettu.</translation> <translation id="1919130412786645364">Salli Chrome-kirjautuminen</translation> <translation id="1922362554271624559">Kieliehdotukset</translation> +<translation id="1924255092154549435">Välilehti on laajennettu</translation> <translation id="1925021887439448749">Lisää muokattu verkko-osoite</translation> <translation id="1928696683969751773">Päivitykset</translation> <translation id="19288952978244135">Avaa Chrome uudelleen.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Nimike vaaditaan</translation> <translation id="5170568018924773124">Näytä kansiossa</translation> <translation id="5171045022955879922">Kirjoita hakusanoja tai URL-osoite</translation> +<translation id="5174700554036517242">Välilehti on taas alkuperäisen korkuinen</translation> <translation id="5184329579814168207">Avaa Chromessa</translation> <translation id="5191251636205085390">Lue lisää uusista teknologioista, joilla on tarkoitus korvata kolmannen osapuolen evästeet, ja tee haluamasi valinnat</translation> <translation id="5193988420012215838">Kopioitu leikepöydälle</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Lisätietoja sivuston ehdottamista mainoksista</translation> <translation id="768618399695552958">Jotkin avaamistasi sivuista ovat esiladattuja. Sivut on mahdollisesti esiladattu Googlen palvelimien kautta, kun niihin on linkitetty Googlen sivustolta.</translation> <translation id="7691043218961417207">Tutustu seurattavaan sisältöön</translation> +<translation id="7697383401610880082">Vetokahva</translation> <translation id="7698359219371678927">Luo sähköposti sovelluksessa <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Käytä mobiilidataa</translation> <translation id="7709094866268987903">Poistamasi kiinnostuksen kohteet näkyvät täällä</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index aa2386d..c1eab5ce 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Sinusubaybayan mo ang <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Para pamahalaan ang iyong mga password, i-update ang mga serbisyo ng Google Play</translation> <translation id="1506061864768559482">Search engine</translation> +<translation id="1508960385613684700">Gabay sa privacy <ph name="BEGIN_NEW" />Bago<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Bookmark at history ng web</translation> <translation id="1513814250881909472">Mag-sync para makuha ang iyong mga tab mula sa iba pang device mo</translation> <translation id="1513858653616922153">I-delete ang password</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Nakasara ang listahan ng mga opsyon sa pagbabahagi.</translation> <translation id="1919130412786645364">Pagayan ang pag-sign in sa Chrome</translation> <translation id="1922362554271624559">Mga iminumungkahing wika</translation> +<translation id="1924255092154549435">Pinalawak ang tab</translation> <translation id="1925021887439448749">Maglagay ng custom na address sa web</translation> <translation id="1928696683969751773">Mga Update</translation> <translation id="19288952978244135">Muling buksan ang Chrome.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Kailangan ng pamagat</translation> <translation id="5170568018924773124">Ipinakita sa folder</translation> <translation id="5171045022955879922">Hanapin o i-type ang URL</translation> +<translation id="5174700554036517242">Ibinalik ang tab sa unang taas</translation> <translation id="5184329579814168207">Buksan sa Chrome</translation> <translation id="5191251636205085390">Matuto pa tungkol sa at kontrolin ang mga bagong teknolohiyang naglalayong palitan ang third-party na cookies</translation> <translation id="5193988420012215838">Kinopya sa iyong clipboard</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Higit pa tungkol sa mga ad na iminumungkahi ng site</translation> <translation id="768618399695552958">Na-preload ang ilan sa mga page na binibisita mo. Posibleng mag-preload ng mga page sa pamamagitan ng mga server ng Google kapag naka-link mula sa isang site ng Google.</translation> <translation id="7691043218961417207">Mag-explore ng content na susubaybayan</translation> +<translation id="7697383401610880082">Handle sa pag-drag</translation> <translation id="7698359219371678927">Gumawa ng email sa <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Gumamit ng mobile data</translation> <translation id="7709094866268987903">Lalabas dito ang mga interes na inalis mo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index 68692a77..eaf9eb8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">La liste des options de partage est fermée.</translation> <translation id="1919130412786645364">Autoriser la connexion à Chrome</translation> <translation id="1922362554271624559">Langues suggérées</translation> +<translation id="1924255092154549435">L'onglet est développé</translation> <translation id="1925021887439448749">Saisissez une adresse Web personnalisée</translation> <translation id="1928696683969751773">Mises à jour</translation> <translation id="19288952978244135">Rouvrez Chrome.</translation> @@ -768,6 +769,7 @@ <translation id="5161254044473106830">Veuillez saisir un titre.</translation> <translation id="5170568018924773124">Afficher le dossier</translation> <translation id="5171045022955879922">Rechercher ou saisir une URL</translation> +<translation id="5174700554036517242">L'onglet est revenu à sa hauteur initiale</translation> <translation id="5184329579814168207">Ouvrir dans Chrome</translation> <translation id="5191251636205085390">Découvrez et contrôlez les nouvelles technologies qui visent à remplacer les cookies tiers</translation> <translation id="5193988420012215838">Copié dans le presse-papiers</translation> @@ -1250,6 +1252,7 @@ <translation id="7686086654630106285">En savoir plus sur les annonces suggérées par les sites</translation> <translation id="768618399695552958">Certaines pages que vous consultez sont préchargées. Elles peuvent l'être via les serveurs de Google lorsqu'elles sont liées à partir d'un site Google.</translation> <translation id="7691043218961417207">Découvrir des contenus à suivre</translation> +<translation id="7697383401610880082">Poignée de déplacement</translation> <translation id="7698359219371678927">Créer un e-mail dans <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Utilisera les données mobiles</translation> <translation id="7709094866268987903">Les centres d'intérêt que vous supprimez s'afficheront ici</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index cc6e4722..a7da516 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Estás seguindo <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Para xestionar os teus contrasinais, actualiza os servizos de Google Play</translation> <translation id="1506061864768559482">Motor de busca</translation> +<translation id="1508960385613684700">Guía de privacidade <ph name="BEGIN_NEW" />Novo<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Marcadores e historial web</translation> <translation id="1513814250881909472">Sincroniza os datos para obter as pestanas dos teus outros dispositivos</translation> <translation id="1513858653616922153">Eliminar contrasinal</translation> @@ -153,7 +154,7 @@ <translation id="1854311313115643875">Cando as probas están activas, a medición dos anuncios permite que os sitios que visites lle soliciten a Chrome información que lles axude a medir o rendemento dos seus anuncios. Ademais, restrinxe o seguimento en varios sitios, dado que se transfire a menor cantidade posible de información entre eles. Cando eliminas o teu historial de navegación (completo ou dun sitio en concreto), tamén eliminas a información de medición asociada. Consulta <ph name="BEGIN_LINK" />o teu historial de navegación<ph name="END_LINK" />.</translation> -<translation id="1877026089748256423">Chromium está desactualizado</translation> +<translation id="1877026089748256423">Chrome está desactualizado</translation> <translation id="1883903952484604915">Os meus ficheiros</translation> <translation id="189358972401248634">Outros idiomas</translation> <translation id="1900260903084164610">Ao continuar, aceptas as <ph name="BEGIN_TOS_LINK" />Condicións de servizo<ph name="END_TOS_LINK" />.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index 1bf26a1..443638b8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">શેરિંગના વિકલ્પોની સૂચિ બંધ છે.</translation> <translation id="1919130412786645364">Chromeમાં સાઇન-ઇનની મંજૂરી આપો</translation> <translation id="1922362554271624559">સૂચવેલી ભાષાઓ</translation> +<translation id="1924255092154549435">ટૅબ મોટું કરવામાં આવ્યું છે</translation> <translation id="1925021887439448749">કસ્ટમ વેબ ઍડ્રેસ દાખલ કરો</translation> <translation id="1928696683969751773">અપડેટ</translation> <translation id="19288952978244135">Chrome ફરીથી ખોલો.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">શીર્ષક જરૂરી</translation> <translation id="5170568018924773124">ફોલ્ડરમાં બતાવો</translation> <translation id="5171045022955879922">URL શોધો અથવા લખો</translation> +<translation id="5174700554036517242">ટૅબ પ્રારંભિક ઊંચાઈ પર પાછું આવી ગયું છે</translation> <translation id="5184329579814168207">Chrome માં ખોલો</translation> <translation id="5191251636205085390">ત્રીજા પક્ષની કુકીને બદલે વાપરવાના ઉદ્દેશ્યથી બનાવવામાં આવેલી નવી ટેક્નોલોજી વિશે જાણો અને તેમને નિયંત્રિત કરો</translation> <translation id="5193988420012215838">તમારા ક્લિપબોર્ડ પર કૉપિ કરવામાં આવી</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">સાઇટ દ્વારા સૂચિત જાહેરાતો વિશે વધુ વિગતો</translation> <translation id="768618399695552958">તમે મુલાકાત લો છો તે કેટલાક પેજ પહેલેથી લોડ કરેલા છે. જ્યારે પેજ Google site પરથી લિંક કરવામાં આવેલા હોય, ત્યારે તેમને Googleના સર્વર મારફતે પહેલેથી લોડ કરી શકાય છે.</translation> <translation id="7691043218961417207">ફૉલો કરવા માટેના કન્ટેન્ટ વિશે જાણકારી મેળવો</translation> +<translation id="7697383401610880082">ઑબ્જેક્ટ ખેંચવાનું હૅન્ડલ</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> માં ઇમેઇલ બનાવો</translation> <translation id="7707922173985738739">મોબાઇલ ડેટાનો ઉપયોગ કરો</translation> <translation id="7709094866268987903">તમે કાઢી નાખેલી રુચિઓ અહીં દેખાશે</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index aa7d2da..e538c6e7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">आप <ph name="SITE_NAME" /> को फ़ॉलो कर रहे हैं</translation> <translation id="1502010315804028179">अपने पासवर्ड मैनेज करने के लिए, Google Play services को अपडेट करें</translation> <translation id="1506061864768559482">सर्च इंजन</translation> +<translation id="1508960385613684700"><ph name="BEGIN_NEW" />नई<ph name="END_NEW" /> निजता गाइड</translation> <translation id="1513352483775369820">बुकमार्क और वेब इतिहास</translation> <translation id="1513814250881909472">अन्य डिवाइसों से अपने टैब पाने के लिए, सिंक करें</translation> <translation id="1513858653616922153">पासवर्ड मिटाएं</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index 56c5101..0c3fb90 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Követi a következő webhelyet: <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Jelszavai kezeléséhez frissítse a Google Play-szolgáltatásokat</translation> <translation id="1506061864768559482">Keresőmotor</translation> +<translation id="1508960385613684700">Adatvédelmi útmutató <ph name="BEGIN_NEW" />Új<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Könyvjelzők és webes előzmények</translation> <translation id="1513814250881909472">Szinkronizáljon, hogy hozzájusson a többi eszközén megnyitott lapokhoz</translation> <translation id="1513858653616922153">Jelszó törlése</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index b0c133e..ddad42d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Դուք հետևում եք <ph name="SITE_NAME" /> կայքին</translation> <translation id="1502010315804028179">Թարմացրեք Google Play ծառայությունները՝ ձեր գաղտնաբառերը կառավարելու համար</translation> <translation id="1506061864768559482">Որոնողական համակարգ</translation> +<translation id="1508960385613684700">Գաղտնիության ուղեցույց <ph name="BEGIN_NEW" />Նոր<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Էջանիշներ և վեբ պատմություն</translation> <translation id="1513814250881909472">Կատարեք համաժամացում, որպեսզի ձեր մյուս սարքերի ներդիրները հասանելի դառնան։</translation> <translation id="1513858653616922153">Ջնջել գաղտնաբառը</translation> @@ -541,6 +542,7 @@ <translation id="3999683152997576765">Դուք կարող եք տեսնել և հեռացնել հետաքրքրությունները, որոնք կայքերն օգտագործում են՝ ձեզ գովազդ ցուցադրելու համար։ Chrome-ը որոշում է ձեր հետաքրքրությունները ձեր վերջին այցելությունների պատմության հիման վրա։</translation> <translation id="4000212216660919741">Home անցանց ռեժիմում</translation> <translation id="4016425174436051808">Սխալի պատճառով չհաջողվեց բաժանորդագրվել։</translation> +<translation id="4024768890073681126">Ձեր դիտարկիչը կառավարում է ձեր ծնողը</translation> <translation id="4034817413553209278">{HOURS,plural, =1{# ժամ}one{# ժամ}other{# ժամ}}</translation> <translation id="4035877632587724847">Չթույլատրել</translation> <translation id="4036177530563778041">Հեշտությամբ շարունակեք այնտեղից, որտեղ կանգ էիք առել</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 0bff613..5a96114 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Anda mengikuti <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Untuk mengelola sandi, update layanan Google Play</translation> <translation id="1506061864768559482">Mesin telusur</translation> +<translation id="1508960385613684700">Panduan privasi <ph name="BEGIN_NEW" />Baru<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Bookmark dan histori web</translation> <translation id="1513814250881909472">Sinkronkan untuk mengakses tab Anda dari perangkat lainnya</translation> <translation id="1513858653616922153">Hapus sandi</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Daftar opsi berbagi ditutup.</translation> <translation id="1919130412786645364">Izinkan login Chrome</translation> <translation id="1922362554271624559">Bahasa yang disarankan</translation> +<translation id="1924255092154549435">Tab diperluas</translation> <translation id="1925021887439448749">Masukkan alamat web khusus</translation> <translation id="1928696683969751773">Update</translation> <translation id="19288952978244135">Buka Chrome lagi.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Perlu judul</translation> <translation id="5170568018924773124">Tampilkan dalam folder</translation> <translation id="5171045022955879922">Telusuri atau ketik URL</translation> +<translation id="5174700554036517242">Tab kembali ke tinggi awal</translation> <translation id="5184329579814168207">Buka di Chrome</translation> <translation id="5191251636205085390">Pelajari dan kontrol teknologi baru yang ditujukan untuk menggantikan cookie pihak ketiga</translation> <translation id="5193988420012215838">Disalin ke papan klip Anda</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Selengkapnya tentang iklan yang disarankan situs</translation> <translation id="768618399695552958">Beberapa halaman yang Anda buka akan dipramuat. Halaman mungkin dipramuat melalui server Google saat ditautkan dari situs Google.</translation> <translation id="7691043218961417207">Jelajahi konten untuk diikuti</translation> +<translation id="7697383401610880082">Handel geser</translation> <translation id="7698359219371678927">Buat email di <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Gunakan data seluler</translation> <translation id="7709094866268987903">Minat yang Anda hapus akan muncul di sini</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 46e1774..1dbea1d3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">Listi yfir deilingarvalkosti er lokaður.</translation> <translation id="1919130412786645364">Leyfa innskráningu í Chrome</translation> <translation id="1922362554271624559">Tillögur að tungumálum</translation> +<translation id="1924255092154549435">Flipi er stækkaður</translation> <translation id="1925021887439448749">Færðu inn sérsniðna vefslóð</translation> <translation id="1928696683969751773">Uppfærslur</translation> <translation id="19288952978244135">Opnaðu Chrome aftur.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">Titil vantar</translation> <translation id="5170568018924773124">Sýna í möppu</translation> <translation id="5171045022955879922">Leitaðu eða sláðu inn vefslóð</translation> +<translation id="5174700554036517242">Flipi er kominn aftur í upprunalega hæð</translation> <translation id="5184329579814168207">Opna í Chrome</translation> <translation id="5191251636205085390">Kynntu þér og hafðu umsjón með nýrri tækni sem er ætlað að koma í stað fótspora þriðja aðila</translation> <translation id="5193988420012215838">Afritað á klippiborðið</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">Nánar um auglýsingar sem vefsvæði leggja til</translation> <translation id="768618399695552958">Sumar síður sem þú opnar eru forhlaðnar. Síður kunna að forhlaðast í gegnum netþjóna Google þegar þær eru tengdar Google vefsvæði.</translation> <translation id="7691043218961417207">Skoðaðu efni til að fylgja</translation> +<translation id="7697383401610880082">Dragkló</translation> <translation id="7698359219371678927">Skrifa tölvupóst í <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Nota farsímagögn</translation> <translation id="7709094866268987903">Áhugamál sem þú fjarlægðir birtast hér</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index c1faae1..f1d5dc6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Stai seguendo <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Per gestire le tue password, aggiorna Google Play Services</translation> <translation id="1506061864768559482">Motore di ricerca</translation> +<translation id="1508960385613684700">Guida alla privacy <ph name="BEGIN_NEW" />Novità<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Preferiti e cronologia web</translation> <translation id="1513814250881909472">Attiva la sincronizzazione per recuperare le schede dagli altri tuoi dispositivi</translation> <translation id="1513858653616922153">Elimina la password</translation> @@ -804,7 +805,7 @@ <translation id="5401851137404501592">Per continuare, <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> condividerà il tuo nome, il tuo indirizzo email e l'immagine del tuo profilo con questo sito.</translation> <translation id="5403644198645076998">Consenti solo siti specifici</translation> <translation id="5409881200985013443">Vuoi inviare <ph name="ONE_TIME_CODE" /> a <ph name="CLIENT_NAME" />?</translation> -<translation id="5414836363063783498">Verifica…</translation> +<translation id="5414836363063783498">Verifica in corso…</translation> <translation id="5423934151118863508">Le pagine che visiti più spesso verranno visualizzate qui</translation> <translation id="5424588387303617268"><ph name="GIGABYTES" /> GB disponibili</translation> <translation id="543338862236136125">Modifica password</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index d01a0e9..34abf2ae 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">בחרת לעקוב אחר <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">כדי לנהל את הסיסמאות, צריך לעדכן את Google Play Services</translation> <translation id="1506061864768559482">מנוע חיפוש</translation> +<translation id="1508960385613684700">מדריך בנושא פרטיות <ph name="BEGIN_NEW" />חדש<ph name="END_NEW" /></translation> <translation id="1513352483775369820">סימניות והיסטוריית אתרים</translation> <translation id="1513814250881909472">אפשר לבצע סנכרון כדי להציג את הכרטיסיות מהמכשירים האחרים שלך</translation> <translation id="1513858653616922153">מחיקת סיסמה</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 669c33f6b..97039584 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> をフォローしています</translation> <translation id="1502010315804028179">パスワードを管理するには、Google Play 開発者サービスを更新してください</translation> <translation id="1506061864768559482">検索エンジン</translation> +<translation id="1508960385613684700">プライバシー ガイド<ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="1513352483775369820">ブックマークとウェブ履歴</translation> <translation id="1513814250881909472">同期すると、他のデバイスで開いたタブを使用できます</translation> <translation id="1513858653616922153">パスワードを削除</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 1f5b691..eae9f36 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">გაზიარების ვარიანტების სია დახურულია</translation> <translation id="1919130412786645364">Chrome-ში შესვლის დაშვება</translation> <translation id="1922362554271624559">შემოთავაზებული ენები</translation> +<translation id="1924255092154549435">ჩანართი გაფართოებულია</translation> <translation id="1925021887439448749">შეიყვანეთ მორგებული ვებ-მისამართი</translation> <translation id="1928696683969751773">განახლება</translation> <translation id="19288952978244135">Chrome-ის ხელახლა გახსნა.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">საჭიროა სათაური</translation> <translation id="5170568018924773124">საქაღალდეში ჩვენება</translation> <translation id="5171045022955879922">მოძებნეთ ან აკრიფეთ URL</translation> +<translation id="5174700554036517242">ჩანართი დაბრუნდა თავდაპირველ სიმაღლეზე</translation> <translation id="5184329579814168207">Chrome-ში გახსნა</translation> <translation id="5191251636205085390">შეიტყვეთ იმ ახალი ტექნოლოგიების შესახებ, რომელთა მეშვეობითაც მესამე მხარის ქუქი-ჩანაწერების ჩანაცვლება იგეგმება, ასევე, გაეცანით მათი გაკონტროლების ხერხებს</translation> <translation id="5193988420012215838">თქვენს გაცვლის ბუფერში კოპირებული</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">ვრცლად საიტების მიერ შემოთავაზებული რეკლამის შესახებ</translation> <translation id="768618399695552958">თქვენ მიერ მონახულებული ზოგიერთი გვერდი წინასწარ ჩატვირთულია. გვერდები შეიძლება წინასწარ იტვირთებოდეს Google-ის სერვერების მეშვეობით, როცა მათზე ბმული გადადის Google საიტიდან.</translation> <translation id="7691043218961417207">გაეცანით კონტენტს, რომელსაც შეგიძლიათ თვალი მიადევნოთ</translation> +<translation id="7697383401610880082">სახელური ჩავლებისთვის</translation> <translation id="7698359219371678927">ელფოსტის <ph name="APP_NAME" />-ში შექმნა</translation> <translation id="7707922173985738739">მობილური ინტერნეტის გამოყენება</translation> <translation id="7709094866268987903">თქვენ მიერ ამოშლილი ინტერესები აქ გამოჩნდება</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index f3d6d0b..d0c3978 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">ನೀವು <ph name="SITE_NAME" /> ಅನ್ನು ಅನುಸರಿಸುತ್ತಿದ್ದೀರಿ</translation> <translation id="1502010315804028179">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು Google Play ಸೇವೆಗಳನ್ನು ಅಪ್ಡೇಟ್ ಮಾಡಿ</translation> <translation id="1506061864768559482">ಹುಡುಕಾಟ ಇಂಜಿನ್</translation> +<translation id="1508960385613684700">ಗೌಪ್ಯತೆ ಗೈಡ್ <ph name="BEGIN_NEW" />ಹೊಸತು<ph name="END_NEW" /></translation> <translation id="1513352483775369820">ಬುಕ್ಮಾರ್ಕ್ಗಳು ಮತ್ತು ವೆಬ್ ಇತಿಹಾಸ</translation> <translation id="1513814250881909472">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಿಂದ ನಿಮ್ಮ ಟ್ಯಾಬ್ಗಳನ್ನು ಪಡೆಯಲು ಸಿಂಕ್ ಮಾಡಿ</translation> <translation id="1513858653616922153">ಪಾಸ್ವರ್ಡ್ ಅಳಿಸಿ</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">ಹಂಚಿಕೊಳ್ಳುವ ಆಯ್ಕೆಗಳ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.</translation> <translation id="1919130412786645364">Chrome ಸೈನ್-ಇನ್ ಅನ್ನು ಅನುಮತಿಸಿ</translation> <translation id="1922362554271624559">ಸಲಹೆ ಮಾಡಿರುವ ಭಾಷೆಗಳು</translation> +<translation id="1924255092154549435">ಟ್ಯಾಬ್ ಅನ್ನು ವಿಸ್ತರಿಸಲಾಗಿದೆ</translation> <translation id="1925021887439448749">ಕಸ್ಟಮ್ ವೆಬ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ</translation> <translation id="1928696683969751773">ಅಪ್ಡೇಟ್ಗಳು</translation> <translation id="19288952978244135">Chrome ಮರುತೆರೆಯಿರಿ.</translation> @@ -768,6 +770,7 @@ <translation id="5161254044473106830">ಶೀರ್ಷಿಕೆ ಅಗತ್ಯವಿದೆ</translation> <translation id="5170568018924773124">ಫೋಲ್ಡರ್ನಲ್ಲಿ ತೋರಿಸಿ</translation> <translation id="5171045022955879922">ಹುಡುಕಾಟ ನಡೆಸಿ ಅಥವಾ URL ಅನ್ನು ಟೈಪ್ ಮಾಡಿ</translation> +<translation id="5174700554036517242">ಟ್ಯಾಬ್ ಅನ್ನು ಆರಂಭಿಕ ಎತ್ತರಕ್ಕೆ ಹಿಂತಿರುಗಿಸಲಾಗಿದೆ</translation> <translation id="5184329579814168207">Chrome ನಲ್ಲಿ ತೆರೆಯಿರಿ</translation> <translation id="5191251636205085390">ಥರ್ಡ್ ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ಬದಲಿಸುವ ಉದ್ದೇಶವನ್ನು ಹೊಂದಿರುವ ಹೊಸ ತಂತ್ರಜ್ಞಾನಗಳ ಬಗ್ಗೆ ತಿಳಿದುಕೊಳ್ಳಿ ಮತ್ತು ಅವುಗಳನ್ನು ನಿಯಂತ್ರಿಸಿ</translation> <translation id="5193988420012215838">ನಿಮ್ಮ ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲಿಸಲಾಗಿದೆ</translation> @@ -1250,6 +1253,7 @@ <translation id="7686086654630106285">ಸೈಟ್ ಸೂಚಿಸಿದ ಜಾಹೀರಾತುಗಳ ಕುರಿತು ಇನ್ನಷ್ಟು</translation> <translation id="768618399695552958">ನೀವು ಭೇಟಿ ನೀಡುವ ಕೆಲವು ಪುಟಗಳು ಮುಂಚಿತವಾಗಿ ಲೋಡ್ ಆಗುತ್ತವೆ. Google ಸೈಟ್ನಿಂದ ಲಿಂಕ್ ಮಾಡಿದಾಗ, ಪುಟಗಳನ್ನು Google ಸರ್ವರ್ಗಳ ಮೂಲಕ ಮುಂಚಿತವಾಗಿ ಲೋಡ್ ಮಾಡಬಹುದು.</translation> <translation id="7691043218961417207">ಫಾಲೋ ಮಾಡಲು ವಿಷಯವನ್ನು ಎಕ್ಸ್ಪ್ಲೋರ್ ಮಾಡಿ</translation> +<translation id="7697383401610880082">ಹ್ಯಾಂಡಲ್ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> ನಲ್ಲಿ ಇಮೇಲ್ ರಚಿಸಿ</translation> <translation id="7707922173985738739">ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಿ</translation> <translation id="7709094866268987903">ನೀವು ತೆಗೆದುಹಾಕಿರುವ ಆಸಕ್ತಿಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 92ae1ae..1a053dfd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> 사이트를 팔로우 중입니다.</translation> <translation id="1502010315804028179">비밀번호를 관리하려면 Google Play 서비스를 업데이트하세요.</translation> <translation id="1506061864768559482">검색엔진</translation> +<translation id="1508960385613684700">개인 정보 보호 가이드 <ph name="BEGIN_NEW" />New<ph name="END_NEW" /></translation> <translation id="1513352483775369820">북마크 및 방문 기록</translation> <translation id="1513814250881909472">동기화하여 다른 기기에서 탭을 가져오세요.</translation> <translation id="1513858653616922153">비밀번호 삭제</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">공유 옵션 목록이 닫혔습니다.</translation> <translation id="1919130412786645364">Chrome 로그인 허용</translation> <translation id="1922362554271624559">추천 언어</translation> +<translation id="1924255092154549435">탭이 펼쳐짐</translation> <translation id="1925021887439448749">맞춤 웹 주소 입력</translation> <translation id="1928696683969751773">업데이트</translation> <translation id="19288952978244135">Chrome을 다시 여세요.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">제목이 필요합니다.</translation> <translation id="5170568018924773124">폴더 열기</translation> <translation id="5171045022955879922">검색 또는 URL 입력</translation> +<translation id="5174700554036517242">탭이 초기 높이로 복구됨</translation> <translation id="5184329579814168207">Chrome에서 열기</translation> <translation id="5191251636205085390">타사 쿠키를 대체하는 것을 목표로 하는 새로운 기술을 알아보고 관리하세요.</translation> <translation id="5193988420012215838">클립보드에 복사됨</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">사이트 추천 광고에 관해 자세히 알아보기</translation> <translation id="768618399695552958">방문한 페이지 중 일부가 미리 로드되었습니다. Google 사이트에서 페이지에 연결하는 경우 Google 서버를 통해 페이지가 미리 로드될 수 있습니다.</translation> <translation id="7691043218961417207">팔로우할 콘텐츠 살펴보기</translation> +<translation id="7697383401610880082">드래그 핸들</translation> <translation id="7698359219371678927"><ph name="APP_NAME" />에서 이메일 만들기</translation> <translation id="7707922173985738739">모바일 데이터 사용</translation> <translation id="7709094866268987903">삭제한 관심분야가 여기에 표시됩니다.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 1c157bf..ad8340f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> жаңылыктарына жазылдыңыз</translation> <translation id="1502010315804028179">Сырсөздөрдү тескөө үчүн Google Play кызматтарын жаңыртыңыз</translation> <translation id="1506061864768559482">Издөө каражаты</translation> +<translation id="1508960385613684700">Купуялык жетектемеси <ph name="BEGIN_NEW" />Жаңы<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Кыстармалар жана издөө таржымалы</translation> <translation id="1513814250881909472">Башка түзмөктөрдөгү өтмөктөрдү колдонуу үчүн шайкештирүүнү иштетиңиз</translation> <translation id="1513858653616922153">Сырсөздү жок кылуу</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index b635ffd..758589d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">ປິດລາຍຊື່ຂອງຕົວເລືອກການແບ່ງປັນແລ້ວ.</translation> <translation id="1919130412786645364">ອະນຸຍາດການເຂົ້າສູ່ລະບົບ Chrome</translation> <translation id="1922362554271624559">ພາສາທີ່ແນະນຳ</translation> +<translation id="1924255092154549435">ແຖບຂະຫຍາຍຢູ່</translation> <translation id="1925021887439448749">ປ້ອນທີ່ຢູ່ເວັບແບບກຳນົດເອງ</translation> <translation id="1928696683969751773">ອັບເດດ</translation> <translation id="19288952978244135">ເປີດ Chrome ຄືນໃໝ່.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">ຈຳເປັນຕ້ອງມີຫົວຂໍ້</translation> <translation id="5170568018924773124">ສະແດງຢູ່ໃນໂຟລເດີ</translation> <translation id="5171045022955879922">ຊອກຫາ ຫຼື ພິມ URL</translation> +<translation id="5174700554036517242">ແຖບກັບໄປເປັນຄວາມສູງເລີ່ມຕົ້ນ</translation> <translation id="5184329579814168207">ເປີດຢູ່ໃນ Chrome</translation> <translation id="5191251636205085390">ສຶກສາກ່ຽວກັບ ແລະ ຄວບຄຸມເທັກໂນໂລຢີໃໝ່ທີ່ມີຈຸດປະສົງປ່ຽນແທນຄຸກກີ້ພາກສ່ວນທີສາມ</translation> <translation id="5193988420012215838">ອັດສຳເນົາໃສ່ຄລິບບອດຂອງທ່ານ</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">ເພີ່ມເຕີມກ່ຽວກັບການໂຄສະນາທີ່ແນະນໍາຈາກເວັບໄຊ</translation> <translation id="768618399695552958">ໜ້າບາງໜ້າທີ່ທ່ານເຂົ້າແມ່ນຖືກໂຫຼດກ່ອນລ່ວງໜ້າແລ້ວ. ໜ້າຕ່າງໆອາດຖືກໂຫຼດກ່ອນລ່ວງໜ້າຜ່ານເຊີບເວີ Google ໃນເວລາລິ້ງມາຈາກເວັບໄຊ Google ໃດໜຶ່ງ.</translation> <translation id="7691043218961417207">ສຳຫຼວດເນື້ອຫາເພື່ອຕິດຕາມ</translation> +<translation id="7697383401610880082">ບ່ອນຈັບລາກ</translation> <translation id="7698359219371678927">ສ້າງອີເມວໃນ <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">ໃຊ້ຂໍ້ມູນມືຖື</translation> <translation id="7709094866268987903">ຄວາມສົນໃຈທີ່ທ່ານລຶບອອກຈະປາກົດຢູ່ບ່ອນນີ້</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index b6a2fb9..4411298 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Stebite „<ph name="SITE_NAME" />“</translation> <translation id="1502010315804028179">Kad galėtumėte tvarkyti slaptažodžius, atnaujinkite „Google Play“ paslaugas</translation> <translation id="1506061864768559482">Paieškos variklis</translation> +<translation id="1508960385613684700">Privatumo vadovas <ph name="BEGIN_NEW" />Nauja<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Žymių ir žiniatinklio istorija</translation> <translation id="1513814250881909472">Sinchronizuokite, kad gautumėte skirtukus iš kitų įrenginių</translation> <translation id="1513858653616922153">Ištrinti slaptažodį</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Bendrinimo parinkčių sąrašas uždarytas.</translation> <translation id="1919130412786645364">Leisti „Chrome“ prisijungti</translation> <translation id="1922362554271624559">Siūlomos kalbos</translation> +<translation id="1924255092154549435">Skirtukas išskleistas</translation> <translation id="1925021887439448749">Įveskite tinkintą žiniatinklio adresą</translation> <translation id="1928696683969751773">Atnaujinimas</translation> <translation id="19288952978244135">Iš naujo atidarykite „Chrome“.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Būtina nurodyti pavadinimą</translation> <translation id="5170568018924773124">Rodyti aplanke</translation> <translation id="5171045022955879922">Ieškokite ar įveskite URL</translation> +<translation id="5174700554036517242">Grąžintas pradinis skirtuko aukštis</translation> <translation id="5184329579814168207">Atidaryti naudojant „Chrome“</translation> <translation id="5191251636205085390">Sužinokite apie naujas technologijas, kurios pakeis trečiųjų šalių slapukus, ir valdykite jas</translation> <translation id="5193988420012215838">Nukopijuota į iškarpinę</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Daugiau apie svetainių siūlomus skelbimus</translation> <translation id="768618399695552958">Kai kurie puslapiai, kuriuose lankotės, yra iš anksto įkelti. Puslapiai gali būti iš anksto įkelti per „Google“ serverius, kai susieti iš „Google“ svetainės.</translation> <translation id="7691043218961417207">Naršykite turinį, kurį norite stebėti</translation> +<translation id="7697383401610880082">Vilkimo rankenėlė</translation> <translation id="7698359219371678927">Kurti el. laišką naudojant „<ph name="APP_NAME" />“</translation> <translation id="7707922173985738739">Naudoti mobiliojo ryšio duomenis</translation> <translation id="7709094866268987903">Čia bus rodomi jūsų pašalinti pomėgiai</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index 92441d8..3897dfc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">Хуваалцах сонголтын жагсаалтыг хаасан.</translation> <translation id="1919130412786645364">Chromium-д нэвтрэхийг зөвшөөрөх</translation> <translation id="1922362554271624559">Санал болгосон хэлнүүд</translation> +<translation id="1924255092154549435">Табыг дэлгэсэн</translation> <translation id="1925021887439448749">Тохируулсан веб хаяг оруулах</translation> <translation id="1928696683969751773">Шинэчлэл</translation> <translation id="19288952978244135">Chrome-г дахин нээнэ үү.</translation> @@ -768,6 +769,7 @@ <translation id="5161254044473106830">Гарчиг шаардлагатай</translation> <translation id="5170568018924773124">Хавтсанд харуул</translation> <translation id="5171045022955879922">Хайх эсвэл холбоосыг бичиж оруул</translation> +<translation id="5174700554036517242">Табыг анхны өндөр лүү нь буцаасан</translation> <translation id="5184329579814168207">Chrome-д нээх</translation> <translation id="5191251636205085390">Гуравдагч талын күүкиг орлох зорилготой шинэ технологийн талаар мэдэж авч мөн хянаарай</translation> <translation id="5193988420012215838">Түр санах ой руу хуулсан</translation> @@ -1250,6 +1252,7 @@ <translation id="7686086654630106285">Сайтаас санал болгож буй зарын талаарх илүү дэлгэрэнгүй</translation> <translation id="768618399695552958">Таны зочилдог зарим хуудсыг урьдчилан ачаална. Google-н сайтаас холбосон үед хуудаснуудыг Google-н серверүүдээр урьдчилан ачаалж магадгүй.</translation> <translation id="7691043218961417207">Дагах контент судлах</translation> +<translation id="7697383401610880082">Чирэх бариул</translation> <translation id="7698359219371678927"><ph name="APP_NAME" />-д имэйл үүсгэнэ үү</translation> <translation id="7707922173985738739">Мобайл дата ашиглах</translation> <translation id="7709094866268987903">Таны хассан сонирхол энд харагдана</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index a1d5320..fb31e745 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">शेअरिंग पर्यांयाची सूची बंद आहे.</translation> <translation id="1919130412786645364">Chrome मध्ये साइन इन करण्यासाठी अनुमती द्या</translation> <translation id="1922362554271624559">सुचवलेल्या भाषा</translation> +<translation id="1924255092154549435">टॅबचा विस्तार केला आहे</translation> <translation id="1925021887439448749">कस्टम वेब पत्ता एंटर करा</translation> <translation id="1928696683969751773">अपडेट</translation> <translation id="19288952978244135">Chrome पुन्हा उघडा.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">शीर्षक आवश्यक</translation> <translation id="5170568018924773124">फोल्डरमध्ये दर्शवा</translation> <translation id="5171045022955879922">URL शोधा किंवा टाइप करा</translation> +<translation id="5174700554036517242">टॅब सुरुवातीच्या उंचीवर परत आला आहे</translation> <translation id="5184329579814168207">Chrome मध्ये उघडा</translation> <translation id="5191251636205085390">तृतीय पक्षाच्या कुकी बदलण्याचा उद्देश असलेल्या नवीन तंत्रज्ञान आणि ते कसे नियंत्रित करायचे याविषयी जाणून घ्या</translation> <translation id="5193988420012215838">तुमच्या क्लिपबोर्डवर कॉपी केले</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">साइटने सुचवलेल्या जाहिरातींबद्दल आणखी</translation> <translation id="768618399695552958">तुम्ही भेट देत असलेली काही पेज प्रीलोड केलेली आहेत. Google साइटवरून लिंक केल्यावर पेज Google सर्व्हरद्वारे प्रीलोड केली जाऊ शकतात.</translation> <translation id="7691043218961417207">फॉलो करण्यासाठी आशय एक्सप्लोर करा</translation> +<translation id="7697383401610880082">ड्रॅग हॅंडल</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> मध्ये ईमेल तयार करा</translation> <translation id="7707922173985738739">मोबाइल डेटा वापरा</translation> <translation id="7709094866268987903">तुम्ही काढून टाकलेली स्वारस्ये येथे दिसतील</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index c5d8995..3797618c 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Anda mengikuti <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Untuk mengurus kata laluan anda, kemas kini perkhidmatan Google Play</translation> <translation id="1506061864768559482">Enjin carian</translation> +<translation id="1508960385613684700">Panduan privasi <ph name="BEGIN_NEW" />Baharu<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Penanda halaman dan sejarah web</translation> <translation id="1513814250881909472">Segerakkan untuk mendapatkan tab anda daripada peranti anda yang lain</translation> <translation id="1513858653616922153">Padam kata laluan</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Senarai pilihan perkongsian ditutup.</translation> <translation id="1919130412786645364">Benarkan log masuk Chrome</translation> <translation id="1922362554271624559">Bahasa yang dicadangkan</translation> +<translation id="1924255092154549435">Tab dikembangkan</translation> <translation id="1925021887439448749">Masukkan alamat web tersuai</translation> <translation id="1928696683969751773">Kemaskinian</translation> <translation id="19288952978244135">Buka semula Chrome.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Tajuk diperlukan</translation> <translation id="5170568018924773124">Paparkan dalam folder</translation> <translation id="5171045022955879922">Buat carian atau taipkan URL</translation> +<translation id="5174700554036517242">Tab kembali kepada ketinggian awal</translation> <translation id="5184329579814168207">Buka dalam Chrome</translation> <translation id="5191251636205085390">Ketahui tentang teknologi baharu yang disasarkan untuk menggantikan kuki pihak ketiga dan kawal teknologi tersebut</translation> <translation id="5193988420012215838">Disalin ke papan keratan anda</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Lagi tentang iklan laman yang dicadangkan</translation> <translation id="768618399695552958">Beberapa halaman yang anda lawati dipramuat. Halaman mungkin dipramuat melalui pelayan Google apabila dipautkan dari laman Google.</translation> <translation id="7691043218961417207">Terokai kandungan untuk diikuti</translation> +<translation id="7697383401610880082">Pemegang seret</translation> <translation id="7698359219371678927">Buat e-mel dalam <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Gunakan data mudah alih</translation> <translation id="7709094866268987903">Minat yang anda alih keluar akan dipaparkan di sini</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index 30498a7..7ede5a7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -1517,7 +1517,7 @@ <translation id="9022774213089566801">မကြာခဏ ဝင်ကြည့်ခဲ့သည်</translation> <translation id="9022871169049522985">ဝဘ်ဆိုက်နှင့် ကြော်ငြာရှင်များက ၎င်းတို့ကြော်ငြာများ၏ စွမ်းဆောင်ရည်ကို တိုင်းတာနိုင်သည်</translation> <translation id="9041669420854607037">{FILE_COUNT,plural, =1{ဗီဒီယို # ကား}other{ဗီဒီယို # ကား}}</translation> -<translation id="9042893549633094279">ကိုယ်ရေးအချက်အလက်လုံခြုံမှုနှင့် လုံခြုံရေး</translation> +<translation id="9042893549633094279">ကိုယ်ရေးဒေတာနှင့် လုံခြုံရေး</translation> <translation id="9050666287014529139">စကားစုဝှက်</translation> <translation id="9055497320631373736">အလားအလာရှိသောဝဘ်ဆိုက်များသို့ ဝဘ်ဆိုက်ကို ပြန်ထည့်ပြီးပြီ</translation> <translation id="9063523880881406963">ဆိုဒ်အကြီး တောင်းဆိုချက် ပိတ်မည်</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 438753a..060a45c6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">सेयर गर्ने सुविधासम्बन्धी विकल्पहरूको सूची बन्द गरिएको छ।</translation> <translation id="1919130412786645364">Chrome मा साइन इन गर्ने अनुमति दिनुहोस्</translation> <translation id="1922362554271624559">सुझाव गरिएका भाषाहरू</translation> +<translation id="1924255092154549435">ट्याब एक्स्पान्ड गरियो</translation> <translation id="1925021887439448749">आफू अनुकूल पारिएको वेब ठेगाना प्रविष्टि गर्नुहोस्</translation> <translation id="1928696683969751773">अपडेटहरू</translation> <translation id="19288952978244135">Chrome पुनः खोल्नुहोस्।</translation> @@ -768,6 +769,7 @@ <translation id="5161254044473106830">शीर्षक आवश्यक छ</translation> <translation id="5170568018924773124">फोल्डरमा देखाउनुहोस्</translation> <translation id="5171045022955879922">युआरएल खोल्नुहोस् वा टाइप गर्नुहोस्</translation> +<translation id="5174700554036517242">ट्याबको उचाइ पहिले जत्तिकै बनाइयो</translation> <translation id="5184329579814168207">Chrome मा खोल्नुहोस्</translation> <translation id="5191251636205085390">तेस्रो पक्षीय कुकीहरूलाई प्रतिस्थापन गर्ने प्रविधिका बारेमा जानकारी प्राप्त गर्नुहोस् र तिनलाई नियन्त्रण गर्ने तरिका सिक्नुहोस्</translation> <translation id="5193988420012215838">तपाईंको क्लिपबोर्डमा प्रतिलिपि गरियो</translation> @@ -1250,6 +1252,7 @@ <translation id="7686086654630106285">साइटले सिफारिस गरेका विज्ञापनका बारेमा थप जानकारी</translation> <translation id="768618399695552958">तपाईंले खोलेका केही पेजहरू प्रिलोड गरेर राखिन्छ। Google का सर्भर र Google साइट लिंक गरेपछि पेजहरू ती सर्भरमार्फत प्रिलोड गरेर राखिन सक्छ।</translation> <translation id="7691043218961417207">फलो गरिनु पर्ने सामग्री खोज्नुहोस्</translation> +<translation id="7697383401610880082">ड्र्याग ह्यान्डल</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> मा इमेल सिर्जना गर्नुहोस्</translation> <translation id="7707922173985738739">मोबाइल डेटा प्रयोग गर्नुहोस्</translation> <translation id="7709094866268987903">तपाईंले हटाउनुभएका रुचिका विषयहरू यहाँ देखिने छन्</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index 550030dc..b0a99e0b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Je volgt <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Update Google Play-services om je wachtwoorden te beheren</translation> <translation id="1506061864768559482">Zoekmachine</translation> +<translation id="1508960385613684700">Privacygids <ph name="BEGIN_NEW" />Nieuw<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Bookmarks en webgeschiedenis</translation> <translation id="1513814250881909472">Voer een synchronisatie uit om de tabbladen van je andere apparaten op te halen</translation> <translation id="1513858653616922153">Wachtwoord verwijderen</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Lijst met deelopties is gesloten.</translation> <translation id="1919130412786645364">Inloggen bij Chrome toestaan</translation> <translation id="1922362554271624559">Voorgestelde talen</translation> +<translation id="1924255092154549435">Tabblad is uitgevouwen</translation> <translation id="1925021887439448749">Aangepast webadres opgeven</translation> <translation id="1928696683969751773">Updates</translation> <translation id="19288952978244135">Open Chrome opnieuw.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Titel is vereist</translation> <translation id="5170568018924773124">Tonen in map</translation> <translation id="5171045022955879922">Zoek of typ een URL</translation> +<translation id="5174700554036517242">Tabblad is teruggezet naar oorspronkelijke hoogte</translation> <translation id="5184329579814168207">Openen in Chrome</translation> <translation id="5191251636205085390">Bekijk meer informatie over en beheer nieuwe technologieën die cookies van derden willen vervangen</translation> <translation id="5193988420012215838">Naar klembord gekopieerd</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Meer informatie over door de site voorgestelde advertenties</translation> <translation id="768618399695552958">Sommige pagina's die je bezoekt, zijn vooraf geladen. Pagina's kunnen vooraf worden geladen via Google-servers als ernaar wordt gelinkt vanaf een Google-site.</translation> <translation id="7691043218961417207">Ontdek content om te volgen</translation> +<translation id="7697383401610880082">Handgreep voor slepen</translation> <translation id="7698359219371678927">E-mail in <ph name="APP_NAME" /> maken</translation> <translation id="7707922173985738739">Mobiele data gebruiken</translation> <translation id="7709094866268987903">Door jou verwijderde interesses verschijnen hier</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index ecb6536..87faba9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">ਤੁਸੀਂ <ph name="SITE_NAME" /> ਦਾ ਅਨੁਸਰਣ ਕਰ ਰਹੇ ਹੋ</translation> <translation id="1502010315804028179">ਆਪਣੇ ਪਾਸਵਰਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ, Google Play ਸੇਵਾਵਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ</translation> <translation id="1506061864768559482">ਖੋਜ ਇੰਜਣ</translation> +<translation id="1508960385613684700">ਪਰਦੇਦਾਰੀ ਗਾਈਡ <ph name="BEGIN_NEW" />ਨਵੀਂ<ph name="END_NEW" /></translation> <translation id="1513352483775369820">ਬੁੱਕਮਾਰਕ ਅਤੇ ਵੈੱਬ ਇਤਿਹਾਸ</translation> <translation id="1513814250881909472">ਆਪਣੇ ਹੋਰ ਡੀਵਾਈਸਾਂ ਤੋਂ ਆਪਣੀਆਂ ਟੈਬਾਂ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਿੰਕ ਕਰੋ</translation> <translation id="1513858653616922153">ਪਾਸਵਰਡ ਮਿਟਾਓ</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">ਸਾਂਝਾਕਰਨ ਵਿਕਲਪਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਹੈ।</translation> <translation id="1919130412786645364">Chrome ਵਿੱਚ ਸਾਈਨ-ਇਨ ਕਰਨ ਦਿਓ</translation> <translation id="1922362554271624559">ਸੁਝਾਈਆਂ ਗਈਆਂ ਭਾਸ਼ਾਵਾਂ</translation> +<translation id="1924255092154549435">ਟੈਬ ਦਾ ਵਿਸਤਾਰ ਕੀਤਾ ਗਿਆ ਹੈ</translation> <translation id="1925021887439448749">ਵਿਉਂਤਬੱਧ ਵੈੱਬ ਪਤਾ ਦਾਖਲ ਕਰੋ</translation> <translation id="1928696683969751773">ਅਪਡੇਟਾਂ</translation> <translation id="19288952978244135">Chrome ਨੂੰ ਮੁੜ-ਖੋਲ੍ਹੋ।</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">ਸਿਰਲੇਖ ਲਾਜ਼ਮੀ</translation> <translation id="5170568018924773124">ਫੋਲਡਰ ਵਿੱਚ ਦਿਖਾਓ</translation> <translation id="5171045022955879922">ਖੋਜੋ ਜਾਂ URL ਟਾਈਪ ਕਰੋ</translation> +<translation id="5174700554036517242">ਟੈਬ ਸ਼ੁਰੂਆਤੀ ਉਚਾਈ 'ਤੇ ਵਾਪਸ ਆ ਗਈ ਹੈ</translation> <translation id="5184329579814168207">Chrome ਵਿੱਚ ਖੋਲ੍ਹੋ</translation> <translation id="5191251636205085390">ਨਵੀਆਂ ਤਕਨੀਕਾਂ ਬਾਰੇ ਜਾਣੋ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਕੰਟਰੋਲ ਕਰੋ ਜਿਨ੍ਹਾਂ ਦਾ ਉਦੇਸ਼ ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਦਲਣਾ ਹੈ</translation> <translation id="5193988420012215838">ਤੁਹਾਡੇ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕੀਤਾ ਗਿਆ</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">ਸਾਈਟਾਂ ਵੱਲੋਂ ਸੁਝਾਏ ਗਏ ਵਿਗਿਆਪਨਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣਕਾਰੀ</translation> <translation id="768618399695552958">ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਗਏ ਕੁਝ ਪੰਨਿਆਂ ਨੂੰ ਪ੍ਰੀਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ। Google ਸਾਈਟ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਜਾਣ 'ਤੇ ਪੰਨਿਆਂ ਨੂੰ Google ਸਰਵਰਾਂ ਰਾਹੀਂ ਪ੍ਰੀਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ।</translation> <translation id="7691043218961417207">ਅਨੁਸਰਣ ਕਰਨ ਲਈ ਸਮੱਗਰੀ ਦੀ ਪੜਚੋਲ ਕਰੋ</translation> +<translation id="7697383401610880082">ਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> ਵਿੱਚ ਈਮੇਲ ਬਣਾਓ</translation> <translation id="7707922173985738739">ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤੋ</translation> <translation id="7709094866268987903">ਤੁਹਾਡੇ ਵੱਲੋਂ ਹਟਾਈਆਂ ਗਈਆਂ ਦਿਲਚਸਪੀਆਂ ਇੱਥੇ ਦਿਸਣਗੀਆਂ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 75ce478..43393917 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Obserwujesz stronę <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Aby zarządzać hasłami, zaktualizuj Usługi Google Play</translation> <translation id="1506061864768559482">Wyszukiwarka</translation> +<translation id="1508960385613684700">Przewodnik po prywatności <ph name="BEGIN_NEW" />Nowość<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Zakładki i historia online</translation> <translation id="1513814250881909472">Aby zobaczyć karty z innych urządzeń, włącz synchronizację</translation> <translation id="1513858653616922153">Usuń hasło</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Lista opcji udostępniania jest zamknięta.</translation> <translation id="1919130412786645364">Zezwalaj na logowanie się w Chrome</translation> <translation id="1922362554271624559">Sugerowane języki</translation> +<translation id="1924255092154549435">Karta jest rozwinięta</translation> <translation id="1925021887439448749">Wpisz niestandardowy adres internetowy</translation> <translation id="1928696683969751773">Aktualizacje</translation> <translation id="19288952978244135">Uruchom ponownie Chrome.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Tytuł jest wymagany</translation> <translation id="5170568018924773124">Pokaż w folderze</translation> <translation id="5171045022955879922">Wyszukaj lub wpisz URL</translation> +<translation id="5174700554036517242">Karta wróciła do początkowej wysokości</translation> <translation id="5184329579814168207">Otwórz w Chrome</translation> <translation id="5191251636205085390">Poznaj nowe technologie, które będą używane zamiast plików cookie innych firm, i naucz się je kontrolować</translation> <translation id="5193988420012215838">Skopiowane do schowka</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Więcej informacji o reklamach sugerowanych przez witrynę</translation> <translation id="768618399695552958">Niektóre z odwiedzanych przez Ciebie stron są wstępnie wczytywane. Serwery Google mogą wstępnie wczytywać strony, gdy prowadzą do nich linki z witryny Google.</translation> <translation id="7691043218961417207">Odkrywaj treści, które warto obserwować</translation> +<translation id="7697383401610880082">Uchwyt do przeciągania</translation> <translation id="7698359219371678927">Utwórz e-maila w aplikacji <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Użycie mobilnej transmisji danych</translation> <translation id="7709094866268987903">Tutaj będą widoczne usunięte zainteresowania</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index 07d1391..5b0fda1f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">A lista de opções de partilha está fechada.</translation> <translation id="1919130412786645364">Permitir o início de sessão no Chrome</translation> <translation id="1922362554271624559">Idiomas sugeridos</translation> +<translation id="1924255092154549435">O separador está expandido</translation> <translation id="1925021887439448749">Introduzir endereço Web personalizado</translation> <translation id="1928696683969751773">Atualizações</translation> <translation id="19288952978244135">Reabra o Chrome.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">Título obrigatório</translation> <translation id="5170568018924773124">Mostrar numa pasta</translation> <translation id="5171045022955879922">Pesquise ou escreva URL</translation> +<translation id="5174700554036517242">O separador está de novo na altura inicial</translation> <translation id="5184329579814168207">Abrir no Chrome</translation> <translation id="5191251636205085390">Saiba mais e controle novas tecnologias que visam substituir cookies de terceiros.</translation> <translation id="5193988420012215838">Copiado para a área de transferência.</translation> @@ -1063,7 +1065,7 @@ <translation id="6684809838922667136">Melhore o Chrome</translation> <translation id="670498945988402717">Última verificação ontem</translation> <translation id="6710213216561001401">Anterior</translation> -<translation id="671481426037969117">O temporizador da aplicação <ph name="FQDN" /> terminou. Recomeça amanhã.</translation> +<translation id="671481426037969117">O temporizador da app <ph name="FQDN" /> terminou. Recomeça amanhã.</translation> <translation id="6715020873764921614">Pretende transferir <ph name="FILE_NAME" /> (<ph name="FILE_SIZE" />) mesmo assim?</translation> <translation id="6719634564325948108">Ligar com um código QR?</translation> <translation id="6737612727720318154">Permita um interesse ou um site se considerar que os anúncios relacionados com o item lhe seriam úteis</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">Mais informações acerca de anúncios sugeridos por sites</translation> <translation id="768618399695552958">Algumas das páginas que visita são pré-carregadas. As páginas podem ser pré-carregadas através dos servidores da Google quando contêm links de um site Google.</translation> <translation id="7691043218961417207">Explore conteúdo a seguir</translation> +<translation id="7697383401610880082">Indicador para arrastar</translation> <translation id="7698359219371678927">Criar email no <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Usar dados móveis</translation> <translation id="7709094866268987903">Os interesses que removeu serão apresentados aqui</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index 4a58bfb..fb3956a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Lista cu opțiuni de permitere a accesului este închisă.</translation> <translation id="1919130412786645364">Permite conectarea la Chrome</translation> <translation id="1922362554271624559">Limbi sugerate</translation> +<translation id="1924255092154549435">Fila este extinsă</translation> <translation id="1925021887439448749">Introdu adresa web personalizată</translation> <translation id="1928696683969751773">Actualizări</translation> <translation id="19288952978244135">Redeschide Chrome.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Titlul este obligatoriu</translation> <translation id="5170568018924773124">Afișează în dosar</translation> <translation id="5171045022955879922">Caută sau introdu adresa URL</translation> +<translation id="5174700554036517242">Fila a revenit la înălțimea inițială</translation> <translation id="5184329579814168207">Deschide în Chrome</translation> <translation id="5191251636205085390">Află despre și folosește tehnologii noi, destinate să înlocuiască cookie-urile terță parte</translation> <translation id="5193988420012215838">Copiat în clipboard</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Mai multe despre anunțurile sugerate de site-uri</translation> <translation id="768618399695552958">Unele pagini pe care le accesezi sunt preîncărcate. Este posibil ca paginile să fie preîncărcate prin serverele Google atunci când un site Google trimite un link spre ele.</translation> <translation id="7691043218961417207">Explorează conținutul de urmărit</translation> +<translation id="7697383401610880082">Ghidaj de tragere</translation> <translation id="7698359219371678927">Creează un e-mail în <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">va folosi datele mobile;</translation> <translation id="7709094866268987903">Interesele eliminate vor apărea aici</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index a97b210..4516053 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Список способов отправки закрыт.</translation> <translation id="1919130412786645364">Разрешить вход в Chrome</translation> <translation id="1922362554271624559">Рекомендуемые языки</translation> +<translation id="1924255092154549435">Вкладка развернута</translation> <translation id="1925021887439448749">Введите веб-адрес</translation> <translation id="1928696683969751773">Обновления</translation> <translation id="19288952978244135">Снова запустите браузер Chrome.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Введите название</translation> <translation id="5170568018924773124">Показать в папке</translation> <translation id="5171045022955879922">Введите запрос или URL</translation> +<translation id="5174700554036517242">Возвращена исходная высота вкладки</translation> <translation id="5184329579814168207">Открыть в Chrome</translation> <translation id="5191251636205085390">Узнайте больше о новых технологиях, которые придут на смену сторонним файлам cookie.</translation> <translation id="5193988420012215838">Скопировано в буфер обмена.</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Сведения о рекламе, рекомендуемой сайтами</translation> <translation id="768618399695552958">Некоторые посещаемые вами страницы загружаются предварительно. Если переход выполняется с сайта на платформе Google, предзагрузка может осуществляться через серверы Google.</translation> <translation id="7691043218961417207">Находите интересный контент</translation> +<translation id="7697383401610880082">Маркер перемещения</translation> <translation id="7698359219371678927">Написать письмо в приложении "<ph name="APP_NAME" />"</translation> <translation id="7707922173985738739">Использовать мобильный Интернет</translation> <translation id="7709094866268987903">Здесь будут появляться удаленные вами интересы.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 0b0723d..5f103c7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">බෙදා ගැනීමේ විකල්ප ලැයිස්තුව වසා ඇත.</translation> <translation id="1919130412786645364">Chrome පුරනයට ඉඩ දෙන්න</translation> <translation id="1922362554271624559">යෝජිත භාෂා</translation> +<translation id="1924255092154549435">පටිත්ත පුළුල් කර ඇත</translation> <translation id="1925021887439448749">අභිරුචි වෙබ් ලිපිනය ඇතුළු කරන්න</translation> <translation id="1928696683969751773">යාවත්කාලීන</translation> <translation id="19288952978244135">Chrome යළි විවෘත කරන්න.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">මාතෘකාව අවශ්යයි</translation> <translation id="5170568018924773124">ෆෝල්ඩරයේ පෙන්වන්න</translation> <translation id="5171045022955879922">සොයන්න හෝ ලිපිනය යොදන්න</translation> +<translation id="5174700554036517242">පටිත්ත ආරම්භක උසට ආපසු ගොස් ඇත</translation> <translation id="5184329579814168207">Chrome තුළ විවෘත කරන්න</translation> <translation id="5191251636205085390">තෙවන පාර්ශ්ව කුකි ප්රතිස්ථාපනය කිරීම අරමුණු කර ගත් නව තාක්ෂණ ගැනදැන ගන්න සහ පාලනය කරන්න</translation> <translation id="5193988420012215838">ඔබේ පසුරු පුවරුවට පිටපත් කළා</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">අඩවි-යෝජිත දැන්වීම් පිළිබඳ වැඩිදුර</translation> <translation id="768618399695552958">ඔබ පිවිසෙන සමහර පිටු පූර්ව පූරණය කර ඇත. Google අඩවියකින් සම්බන්ධ කළ විට පිටු Google සේවාදායක හරහා පූර්ව පූරණය කළ හැකිය.</translation> <translation id="7691043218961417207">අනුගමනය කිරීමට අන්තර්ගතය ගවේෂණය කරන්න</translation> +<translation id="7697383401610880082">ඇදීම් හැඬලය</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> තුළ ඊ-තැපෑලක් සාදන්න</translation> <translation id="7707922173985738739">ජංගම දත්ත භාවිත කරන්න</translation> <translation id="7709094866268987903">ඔබ ඉවත් කළ ලැදිකම් මෙහි දිස් වනු ඇත</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 1f81a33..7a0d48d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Sledujete web <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Ak chcete svoje heslá spravovať, aktualizujte Služby Google Play</translation> <translation id="1506061864768559482">Vyhľadávač</translation> +<translation id="1508960385613684700">Sprievodca ochranou súkromia <ph name="BEGIN_NEW" />Novinka<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Záložky a webová história</translation> <translation id="1513814250881909472">Zapnite synchronizáciu a získajte tak karty zo svojich ostatných zariadení</translation> <translation id="1513858653616922153">Odstrániť heslo</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index 06b7abf..09c6b097 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">Seznam možnosti deljenja z drugimi je zaprt.</translation> <translation id="1919130412786645364">Omogočanje prijave v Chrome</translation> <translation id="1922362554271624559">Predlagani jeziki</translation> +<translation id="1924255092154549435">Zavihek je razširjen</translation> <translation id="1925021887439448749">Vnesite spletni naslov po meri</translation> <translation id="1928696683969751773">Posodobitve</translation> <translation id="19288952978244135">Znova odprite Chrome.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">Naslov je obvezen</translation> <translation id="5170568018924773124">Prikaži v mapi</translation> <translation id="5171045022955879922">Poiščite ali vnesite URL</translation> +<translation id="5174700554036517242">Zavihek je spet na začetni višini</translation> <translation id="5184329579814168207">Odpri v Chromu</translation> <translation id="5191251636205085390">Preberite več o novih tehnologijah, katerih namen je zamenjava piškotkov drugih ponudnikov, in jih nadzirajte.</translation> <translation id="5193988420012215838">Kopirano v odložišče</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">Več o oglasih, ki jih predlaga spletno mesto</translation> <translation id="768618399695552958">Nekatere strani, ki jih obiskujete, so vnaprej naložene. Strani bodo morda vnaprej naložene prek Googlovih strežnikov, ko nanje vodi povezava z Googlovega spletnega mesta.</translation> <translation id="7691043218961417207">Raziščite vsebino, ki jo želite spremljati</translation> +<translation id="7697383401610880082">Ročica za vlečenje</translation> <translation id="7698359219371678927">Ustvarite e-poštno sporočilo v aplikaciji <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Uporaba prenosa podatkov v mobilnem omrežju</translation> <translation id="7709094866268987903">Zanimanja, ki ste jih odstranili, bodo prikazana tukaj.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index 57cf81dd..ea7225e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Lista opcija za deljenje je zatvorena.</translation> <translation id="1919130412786645364">Dozvoli prijavljivanje u Chrome</translation> <translation id="1922362554271624559">Predloženi jezici</translation> +<translation id="1924255092154549435">Kartica je proširena</translation> <translation id="1925021887439448749">Unesite prilagođenu veb-adresu</translation> <translation id="1928696683969751773">Ažuriranja</translation> <translation id="19288952978244135">Ponovo otvorite Chrome.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Naslov je obavezan</translation> <translation id="5170568018924773124">Prikaži u direktorijumu</translation> <translation id="5171045022955879922">Pretražite ili unesite URL adresu</translation> +<translation id="5174700554036517242">Kartica se vratila na početnu visinu</translation> <translation id="5184329579814168207">Otvori u Chrome-u</translation> <translation id="5191251636205085390">Saznajte više o novim tehnologijama čiji je cilj da zamene kolačiće trećih strana i upravljajte njima</translation> <translation id="5193988420012215838">Kopirano je u privremenu memoriju</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Više o oglasima koje predlažu sajtovi</translation> <translation id="768618399695552958">Neke od stranice koje posećujete su predučitane. Stranice mogu da budu predučitane preko Google servera kada do njih vodi link sa Google sajta.</translation> <translation id="7691043218961417207">Istražite sadržaj za praćenje</translation> +<translation id="7697383401610880082">Identifikator za prevlačenje</translation> <translation id="7698359219371678927">Napišite imejl u aplikaciji <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Koristi mobilne podatke</translation> <translation id="7709094866268987903">Uklonjena interesovanja će se prikazivati ovde</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index f518024..a3779d29 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -162,6 +162,7 @@ <translation id="1910950723001426294">Листа опција за дељење је затворена.</translation> <translation id="1919130412786645364">Дозволи пријављивање у Chrome</translation> <translation id="1922362554271624559">Предложени језици</translation> +<translation id="1924255092154549435">Картица је проширена</translation> <translation id="1925021887439448749">Унесите прилагођену веб-адресу</translation> <translation id="1928696683969751773">Ажурирања</translation> <translation id="19288952978244135">Поново отворите Chrome.</translation> @@ -770,6 +771,7 @@ <translation id="5161254044473106830">Наслов је обавезан</translation> <translation id="5170568018924773124">Прикажи у директоријуму</translation> <translation id="5171045022955879922">Претражите или унесите URL адресу</translation> +<translation id="5174700554036517242">Картица се вратила на почетну висину</translation> <translation id="5184329579814168207">Отвори у Chrome-у</translation> <translation id="5191251636205085390">Сазнајте више о новим технологијама чији је циљ да замене колачиће трећих страна и управљајте њима</translation> <translation id="5193988420012215838">Копирано је у привремену меморију</translation> @@ -1252,6 +1254,7 @@ <translation id="7686086654630106285">Више о огласима које предлажу сајтови</translation> <translation id="768618399695552958">Неке од странице које посећујете су предучитане. Странице могу да буду предучитане преко Google сервера када до њих води линк са Google сајта.</translation> <translation id="7691043218961417207">Истражите садржај за праћење</translation> +<translation id="7697383401610880082">Идентификатор за превлачење</translation> <translation id="7698359219371678927">Напишите имејл у апликацији <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Користи мобилне податке</translation> <translation id="7709094866268987903">Уклоњена интересовања ће се приказивати овде</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index dc3a232..72112593 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -161,6 +161,7 @@ <translation id="1910950723001426294">Orodha ya chaguo za kushiriki imefungwa.</translation> <translation id="1919130412786645364">Ruhusu kuingia katika akaunti ya Chrome</translation> <translation id="1922362554271624559">Lugha zinazopendekezwa</translation> +<translation id="1924255092154549435">Kichupo kimepanuliwa</translation> <translation id="1925021887439448749">Weka anwani maalum ya wavuti</translation> <translation id="1928696683969751773">Usasishaji</translation> <translation id="19288952978244135">Fungua Chrome Upya.</translation> @@ -769,6 +770,7 @@ <translation id="5161254044473106830">Kichwa kinahitajika</translation> <translation id="5170568018924773124">Onyesha katika folda</translation> <translation id="5171045022955879922">Tafuta au charaza URL</translation> +<translation id="5174700554036517242">Kichupo kimekunjwa kiwe katika kimo cha awali</translation> <translation id="5184329579814168207">Fungulia katika Chrome</translation> <translation id="5191251636205085390">Pata maelezo na udhibiti teknolojia mpya zinazokusudia kuchukua nafasi ya vidakuzi vya wengine</translation> <translation id="5193988420012215838">Imenakiliwa kwenye ubao wa kunakili</translation> @@ -1251,6 +1253,7 @@ <translation id="7686086654630106285">Maelezo zaidi kuhusu matangazo yanayopendekezwa na tovuti</translation> <translation id="768618399695552958">Baadhi ya kurasa unazotembelea huwa zimepakiwa mapema. Huenda kurasa zikapakiwa mapema kupitia seva za Google wakati viungo vya kurasa hizo vipo kwenye tovuti ya Google.</translation> <translation id="7691043218961417207">Gundua maudhui ya kufuatilia</translation> +<translation id="7697383401610880082">Aikoni ya buruta</translation> <translation id="7698359219371678927">Tunga barua pepe katika <ph name="APP_NAME" /></translation> <translation id="7707922173985738739">Tumia data ya mtandao wa simu</translation> <translation id="7709094866268987903">Mambo yanayokuvutia uliyoyaondoa yataonekana hapa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index a266e5c1..77351d85 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> தளத்தைப் பின்தொடர்கிறீர்கள்</translation> <translation id="1502010315804028179">கடவுச்சொற்களை நிர்வகிக்க Google Play சேவைகளைப் புதுப்பிக்க வேண்டும்</translation> <translation id="1506061864768559482">தேடல் இன்ஜின்</translation> +<translation id="1508960385613684700">தனியுரிமை வழிகாட்டி <ph name="BEGIN_NEW" />புதிது<ph name="END_NEW" /></translation> <translation id="1513352483775369820">புத்தகக்குறிகளும் இணைய வரலாறும்</translation> <translation id="1513814250881909472">உங்கள் பிற சாதனங்களின் உலாவிப் பக்கங்களில் உள்ளவற்றைப் பெற ஒத்திசையுங்கள்</translation> <translation id="1513858653616922153">கடவுச்சொல்லை நீக்கு</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">பகிர்தல் விருப்பங்களுக்கான பட்டியல் மூடப்பட்டது.</translation> <translation id="1919130412786645364">Chrome உள்நுழைவை அனுமதித்தல்</translation> <translation id="1922362554271624559">பரிந்துரைக்கப்படும் மொழிகள்</translation> +<translation id="1924255092154549435">உலாவிப் பக்கம் விரிவாக்கப்பட்டது</translation> <translation id="1925021887439448749">பிரத்தியேக இணைய முகவரியை உள்ளிடவும்</translation> <translation id="1928696683969751773">புதுப்பிப்புகள்</translation> <translation id="19288952978244135">Chromeமை மீண்டும் திறக்கவும்.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">தலைப்பு அவசியம்</translation> <translation id="5170568018924773124">ஃபோல்டரில் காண்பி</translation> <translation id="5171045022955879922">தேடுக அல்லது URLலை உள்ளிடுக</translation> +<translation id="5174700554036517242">உலாவிப் பக்கம் தொடக்க உயரத்திற்கு மீண்டும் அமைக்கப்பட்டது</translation> <translation id="5184329579814168207">Chrome இல் திற</translation> <translation id="5191251636205085390">மூன்றாம் தரப்புக் குக்கீகளுக்கு மாற்றாகப் பயன்படுத்த உதவும் புதிய தொழில்நுட்பங்கள் குறித்தும் அவற்றைக் கட்டுப்படுத்துவது குறித்தும் மேலும் அறிக</translation> <translation id="5193988420012215838">கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">'தளம் பரிந்துரைக்கும் விளம்பரங்கள்' குறித்த கூடுதல் தகவல்</translation> <translation id="768618399695552958">நீங்கள் பார்வையிடும் சில பக்கங்கள் முன்கூட்டியே ஏற்றப்பட்டிருக்கும். Google தளத்தில் இருந்து இணைக்கப்படும்போது Google சேவையகங்கள் மூலம் பக்கங்கள் முன்கூட்டியே ஏற்றப்படக்கூடும்.</translation> <translation id="7691043218961417207">பின்தொடர வேண்டிய உள்ளடக்கத்தைக் கண்டறியுங்கள்</translation> +<translation id="7697383401610880082">இழுப்பதற்கான ஹேண்டில்</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> இல் மின்னஞ்சலை உருவாக்கவும்</translation> <translation id="7707922173985738739">மொபைல் டேட்டாவைப் பயன்படுத்து</translation> <translation id="7709094866268987903">நீங்கள் அகற்றிய ஆர்வங்கள் இங்கே காட்டப்படும்</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 3b297df4b..c70eccc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">మీరు <ph name="SITE_NAME" />ను ఫాలో చేస్తున్నారు</translation> <translation id="1502010315804028179">మీ పాస్వర్డ్లను మేనేజ్ చేయడానికి, Google Play సర్వీసులను అప్డేట్ చేయండి</translation> <translation id="1506061864768559482">సెర్చ్ ఇంజిన్</translation> +<translation id="1508960385613684700"><ph name="BEGIN_NEW" />కొత్త<ph name="END_NEW" /> గోప్యతా గైడ్</translation> <translation id="1513352483775369820">బుక్మార్క్లు మరియు వెబ్ హిస్టరీ</translation> <translation id="1513814250881909472">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్లను పొందడానికి సింక్ చేయండి</translation> <translation id="1513858653616922153">పాస్వర్డ్ను తొలగించండి</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 859e587..0b1eb44 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723"><ph name="SITE_NAME" /> kaynağını takip ediyorsunuz</translation> <translation id="1502010315804028179">Şifrelerinizi yönetmek için Google Play Hizmetlerini güncelleyin</translation> <translation id="1506061864768559482">Arama motoru</translation> +<translation id="1508960385613684700">Gizlilik Rehberi <ph name="BEGIN_NEW" />Yeni<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Yer işaretleri ve web geçmişi</translation> <translation id="1513814250881909472">Diğer cihazlarınızdaki sekmelerinize ulaşmak için senkronize edin</translation> <translation id="1513858653616922153">Şifreyi sil</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">Paylaşım seçenekleri listesi kapalı.</translation> <translation id="1919130412786645364">Chrome'da oturum açmaya izin verin</translation> <translation id="1922362554271624559">Önerilen diller</translation> +<translation id="1924255092154549435">Sekme genişletildi</translation> <translation id="1925021887439448749">Özel web adresini girin</translation> <translation id="1928696683969751773">Güncellemeler</translation> <translation id="19288952978244135">Chrome'u yeniden açın.</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">Başlık gerekiyor</translation> <translation id="5170568018924773124">Klasörde göster</translation> <translation id="5171045022955879922">Arayın veya URL'yi yazın</translation> +<translation id="5174700554036517242">Sekme, ilk yüksekliğe döndürüldü</translation> <translation id="5184329579814168207">Chrome'da aç</translation> <translation id="5191251636205085390">Üçüncü taraf çerezlerin yerini alması amaçlanan yeni teknolojileri öğrenip kontrol edin</translation> <translation id="5193988420012215838">Panonuza kopyalandı</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">Site tarafından önerilen reklamlar hakkında daha fazla bilgi</translation> <translation id="768618399695552958">Ziyaret ettiğiniz sayfaların bazıları önceden yüklenir. Bir Google sitesinden bağlantı verildiğinde sayfalar Google sunucuları aracılığıyla önceden yüklenebilir.</translation> <translation id="7691043218961417207">Takip edilecek içerikleri keşfedin</translation> +<translation id="7697383401610880082">Sürükleme tutamacı</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> adlı uygulamada e-posta oluşturun</translation> <translation id="7707922173985738739">Mobil veri kullanın</translation> <translation id="7709094866268987903">Kaldırdığınız ilgi alanları burada görünür</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index 9326c59..6fd2659d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">Ви підписалися на сайт <ph name="SITE_NAME" /></translation> <translation id="1502010315804028179">Щоб керувати паролями, оновіть сервіси Google Play</translation> <translation id="1506061864768559482">Пошукова система</translation> +<translation id="1508960385613684700">Посібник із конфіденційності <ph name="BEGIN_NEW" />Новинка<ph name="END_NEW" /></translation> <translation id="1513352483775369820">Закладки й історія веб-пошуку</translation> <translation id="1513814250881909472">Увімкніть синхронізацію, щоб переглядати вкладки на інших пристроях</translation> <translation id="1513858653616922153">Видалити пароль</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 343f100c..7c91aa9 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -107,6 +107,7 @@ <translation id="1493287004536771723">آپ <ph name="SITE_NAME" /> کی پیروی کر رہے ہیں</translation> <translation id="1502010315804028179">اپنے پاس ورڈز کا نظم کرنے کے لیے، Google Play سروسز کو اپ ڈیٹ کریں</translation> <translation id="1506061864768559482">تلاش انجن</translation> +<translation id="1508960385613684700">رازداری کی گائیڈ <ph name="BEGIN_NEW" />نئی<ph name="END_NEW" /></translation> <translation id="1513352483775369820">بُک مارکس اور ویب سرگزشت</translation> <translation id="1513814250881909472">اپنے دوسرے آلات سے اپنے ٹیبز حاصل کرنے کے لیے مطابقت پذیری کریں</translation> <translation id="1513858653616922153">پاس ورڈ حذف کریں</translation> @@ -161,6 +162,7 @@ <translation id="1910950723001426294">اشتراک کرنے کے اختیارات کی فہرست بند ہے۔</translation> <translation id="1919130412786645364">Chrome میں سائن ان کی اجازت دیں</translation> <translation id="1922362554271624559">تجویز کردہ زبانیں</translation> +<translation id="1924255092154549435">ٹیب کو پھیلا دیا گیا ہے</translation> <translation id="1925021887439448749">حسب ضرورت ویب پتہ درج کریں</translation> <translation id="1928696683969751773">اپ ڈيٹس</translation> <translation id="19288952978244135">Chrome دوبارہ کھولیں۔</translation> @@ -769,6 +771,7 @@ <translation id="5161254044473106830">عنوان درکار ہے</translation> <translation id="5170568018924773124">فولڈر میں دکھائیں</translation> <translation id="5171045022955879922">تلاش کریں یا URL ٹائپ کریں</translation> +<translation id="5174700554036517242">ٹیب ابتدائی اونچائی پر واپس آ گیا ہے</translation> <translation id="5184329579814168207">Chrome میں کھولیں</translation> <translation id="5191251636205085390">ان نئی ٹیکنالوجیز کے بارے میں جانیں اور کنٹرول کریں جن کا مقصد فریق ثالث کے کوکیز کو تبدیل کرنا ہے</translation> <translation id="5193988420012215838">آپ کے کلپ بورڈ پر کاپی کر دیا گیا</translation> @@ -1251,6 +1254,7 @@ <translation id="7686086654630106285">سائٹ کے تجویز کردہ اشتہارات کے بارے میں مزید</translation> <translation id="768618399695552958">آپ کے ملاحظہ کردہ صفحات میں سے کچھ پیشگی لوڈ کردہ ہیں۔ کسی Google سائٹ سے لنک ہونے پر صفحات کو Google سرورز کے ذریعے پیشگی لوڈ کیا جا سکتا ہے۔</translation> <translation id="7691043218961417207">پیروی کرنے کے لیے مواد کو دریافت کریں</translation> +<translation id="7697383401610880082">گھسیٹنے کا ہینڈل</translation> <translation id="7698359219371678927"><ph name="APP_NAME" /> میں ای میل تخلیق کریں</translation> <translation id="7707922173985738739">موبائل ڈیٹا استعمال کریں</translation> <translation id="7709094866268987903">آپ کی ہٹائی گئی دلچسپیاں یہاں ظاہر ہوں گی</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index bc7b61ef4..69a540f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -107,7 +107,7 @@ <translation id="1493287004536771723">您正在追蹤「<ph name="SITE_NAME" />」</translation> <translation id="1502010315804028179">如要管理密碼,請更新 Google Play 服務</translation> <translation id="1506061864768559482">搜尋引擎</translation> -<translation id="1508960385613684700">隱私權指南 <ph name="BEGIN_NEW" />新功能<ph name="END_NEW" /></translation> +<translation id="1508960385613684700">私隱權指南 <ph name="BEGIN_NEW" />新功能<ph name="END_NEW" /></translation> <translation id="1513352483775369820">書籤和網頁記錄</translation> <translation id="1513814250881909472">進行同步處理,取得您在其他裝置上的分頁</translation> <translation id="1513858653616922153">刪除密碼</translation>
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index a5abb316..3981f97 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -26,6 +26,8 @@ #include "chrome/browser/autofill/personal_data_manager_factory.h" #include "chrome/browser/autofill/strike_database_factory.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/device_reauth/chrome_device_authenticator_factory.h" +#include "chrome/browser/fast_checkout/fast_checkout_client_impl.h" #include "chrome/browser/fast_checkout/fast_checkout_features.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/password_manager/password_manager_settings_service_factory.h" @@ -370,6 +372,14 @@ : profile_metrics::BrowserProfileType::kRegular; } +FastCheckoutClient* ChromeAutofillClient::GetFastCheckoutClient() { +#if BUILDFLAG(IS_ANDROID) + return fast_checkout_client_.get(); +#else + return nullptr; +#endif +} + std::unique_ptr<webauthn::InternalAuthenticator> ChromeAutofillClient::CreateCreditCardInternalAuthenticator( AutofillDriver* driver) { @@ -768,8 +778,8 @@ base::WeakPtr<AutofillManager> autofill_manager) { #if BUILDFLAG(IS_ANDROID) const GURL& url = web_contents()->GetLastCommittedURL(); - return FastCheckoutClient::GetOrCreateForWebContents(web_contents()) - ->TryToStart(url, form, field, autofill_manager); + return GetFastCheckoutClient()->TryToStart(url, form, field, + autofill_manager); #else return false; #endif @@ -778,8 +788,7 @@ void ChromeAutofillClient::HideFastCheckout(bool allow_further_runs) { #if BUILDFLAG(IS_ANDROID) if (IsShowingFastCheckoutUI()) { - FastCheckoutClient::GetOrCreateForWebContents(web_contents()) - ->Stop(/*allow_further_runs=*/allow_further_runs); + GetFastCheckoutClient()->Stop(/*allow_further_runs=*/allow_further_runs); } #endif } @@ -790,8 +799,7 @@ const AutofillManager& autofill_manager) { #if BUILDFLAG(IS_ANDROID) return base::FeatureList::IsEnabled(::features::kFastCheckout) && - FastCheckoutClient::GetOrCreateForWebContents(web_contents()) - ->IsSupported(form, field, autofill_manager); + GetFastCheckoutClient()->IsSupported(form, field, autofill_manager); #else return false; #endif @@ -799,8 +807,7 @@ bool ChromeAutofillClient::IsShowingFastCheckoutUI() { #if BUILDFLAG(IS_ANDROID) - return FastCheckoutClient::GetOrCreateForWebContents(web_contents()) - ->IsShowing(); + return GetFastCheckoutClient()->IsShowing(); #else return false; #endif @@ -1135,6 +1142,15 @@ return flow_id_; } +scoped_refptr<device_reauth::DeviceAuthenticator> +ChromeAutofillClient::GetDeviceAuthenticator() const { +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + return ChromeDeviceAuthenticatorFactory::GetDeviceAuthenticator(); +#else + return nullptr; +#endif +} + void ChromeAutofillClient::LoadRiskData( base::OnceCallback<void(const std::string&)> callback) { risk_util::LoadRiskData(0, web_contents(), std::move(callback)); @@ -1214,6 +1230,10 @@ zoom::ZoomController::FromWebContents(web_contents)) { zoom_observation_.Observe(zoom_controller); } +#else + if (base::FeatureList::IsEnabled(::features::kFastCheckout)) { + fast_checkout_client_ = std::make_unique<FastCheckoutClientImpl>(this); + } #endif }
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h index 5984dbf9..3c9474f 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.h +++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -30,9 +30,9 @@ #include "content/public/browser/web_contents_observer.h" #if BUILDFLAG(IS_ANDROID) -#include "chrome/browser/fast_checkout/fast_checkout_client.h" #include "chrome/browser/touch_to_fill/payments/android/touch_to_fill_credit_card_controller.h" #include "chrome/browser/ui/android/autofill/save_update_address_profile_flow_manager.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "components/autofill/core/browser/ui/payments/card_expiration_date_fix_flow_controller_impl.h" #include "components/autofill/core/browser/ui/payments/card_name_fix_flow_controller_impl.h" #else @@ -121,6 +121,7 @@ translate::TranslateDriver* GetTranslateDriver() override; std::string GetVariationConfigCountryCode() const override; profile_metrics::BrowserProfileType GetProfileType() const override; + FastCheckoutClient* GetFastCheckoutClient() override; std::unique_ptr<webauthn::InternalAuthenticator> CreateCreditCardInternalAuthenticator(AutofillDriver* driver) override; @@ -259,6 +260,8 @@ void OpenPromoCodeOfferDetailsURL(const GURL& url) override; LogManager* GetLogManager() const override; FormInteractionsFlowId GetCurrentFormInteractionsFlowId() override; + scoped_refptr<device_reauth::DeviceAuthenticator> GetDeviceAuthenticator() + const override; // RiskDataLoader: void LoadRiskData( @@ -323,6 +326,7 @@ TouchToFillCreditCardController touch_to_fill_credit_card_controller_{this}; std::unique_ptr<AutofillSnackbarControllerImpl> autofill_snackbar_controller_impl_; + std::unique_ptr<FastCheckoutClient> fast_checkout_client_; #endif std::unique_ptr<CardUnmaskPromptControllerImpl> unmask_controller_; AutofillErrorDialogControllerImpl autofill_error_dialog_controller_;
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc index 0b58ffd..d6ad82e 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc
@@ -19,6 +19,7 @@ #include "components/autofill/core/browser/test_autofill_clock.h" #include "components/autofill/core/browser/test_browser_autofill_manager.h" #include "components/autofill/core/browser/test_personal_data_manager.h" +#include "components/autofill/core/browser/ui/mock_fast_checkout_client.h" #include "components/autofill/core/common/form_interactions_flow.h" #include "components/prefs/pref_service.h" #include "components/unified_consent/pref_names.h" @@ -35,41 +36,21 @@ public: explicit TestChromeAutofillClient(content::WebContents* web_contents) : ChromeAutofillClient(web_contents) {} -}; #if BUILDFLAG(IS_ANDROID) -class MockFastCheckoutClient : public FastCheckoutClientImpl { - public: - explicit MockFastCheckoutClient(content::WebContents* web_contents) - : FastCheckoutClientImpl(web_contents) {} - ~MockFastCheckoutClient() override = default; + MockFastCheckoutClient* GetFastCheckoutClient() override { + return &fast_checkout_client_; + } - MOCK_METHOD(bool, - TryToStart, - (const GURL&, - const FormData&, - const FormFieldData&, - base::WeakPtr<AutofillManager>), - (override)); - MOCK_METHOD(void, Stop, (bool reset), (override)); - MOCK_METHOD(bool, IsRunning, (), (const override)); - MOCK_METHOD(bool, IsShowing, (), (const override)); -}; + MockFastCheckoutClient fast_checkout_client_; #endif +}; class ChromeAutofillClientTest : public ChromeRenderViewHostTestHarness { public: void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); PreparePersonalDataManager(); -#if BUILDFLAG(IS_ANDROID) - auto fast_checkout_client = - std::make_unique<MockFastCheckoutClient>(web_contents()); - fast_checkout_client_ = fast_checkout_client.get(); - const void* key = - content::WebContentsUserData<FastCheckoutClientImpl>::UserDataKey(); - web_contents()->SetUserData(key, std::move(fast_checkout_client)); -#endif // Creates the AutofillDriver and AutofillManager. NavigateAndCommit(GURL("about:blank")); } @@ -93,7 +74,8 @@ #if BUILDFLAG(IS_ANDROID) MockFastCheckoutClient* fast_checkout_client() { - return fast_checkout_client_; + return static_cast<MockFastCheckoutClient*>( + client()->GetFastCheckoutClient()); } #endif @@ -123,10 +105,6 @@ test_autofill_driver_injector_; TestAutofillManagerInjector<TestBrowserAutofillManager> test_autofill_manager_injector_; - -#if BUILDFLAG(IS_ANDROID) - raw_ptr<MockFastCheckoutClient> fast_checkout_client_; -#endif }; TEST_F(ChromeAutofillClientTest, GetFormInteractionsFlowId_BelowMaxFlowTime) {
diff --git a/chrome/browser/ui/browser_command_controller_unittest.cc b/chrome/browser/ui/browser_command_controller_unittest.cc index 46aafa14..4f5f740 100644 --- a/chrome/browser/ui/browser_command_controller_unittest.cc +++ b/chrome/browser/ui/browser_command_controller_unittest.cc
@@ -38,10 +38,6 @@ class BrowserCommandControllerTest : public BrowserWithTestWindowTest { public: BrowserCommandControllerTest() = default; - - private: - base::test::ScopedFeatureList scoped_feature_list_{ - performance_manager::features::kHighEfficiencyModeAvailable}; }; TEST_F(BrowserCommandControllerTest, IsReservedCommandOrKey) {
diff --git a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm index c04c694..6e57ffb 100644 --- a/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm +++ b/chrome/browser/ui/cocoa/applescript/bookmark_node_applescript.mm
@@ -57,7 +57,7 @@ } if ((self = [super init])) { - _bookmarkGUID = bookmarkNode->guid(); + _bookmarkGUID = bookmarkNode->uuid(); self.uniqueID = [NSString stringWithFormat:@"%s", _bookmarkGUID.AsLowercaseString().c_str()]; } @@ -75,13 +75,13 @@ - (void)didCreateBookmarkNode:(const bookmarks::BookmarkNode*)bookmarkNode { CHECK(bookmarkNode); - CHECK_EQ(bookmarkNode->guid(), _bookmarkGUID); + CHECK_EQ(bookmarkNode->uuid(), _bookmarkGUID); self.title = self.tempTitle; } - (const bookmarks::BookmarkNode*)bookmarkNode { - return bookmarks::GetBookmarkNodeByGUID(self.bookmarkModel, _bookmarkGUID); + return bookmarks::GetBookmarkNodeByUuid(self.bookmarkModel, _bookmarkGUID); } - (NSString*)title {
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm index 519f1c7e..ab49b0b 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge.mm
@@ -270,7 +270,7 @@ if (!recurse) [submenu setDelegate:controller_]; [items setTag:node->id()]; - tag_to_guid_[node->id()] = node->guid(); + tag_to_guid_[node->id()] = node->uuid(); [menu addItem:items]; @@ -301,7 +301,7 @@ action:nil keyEquivalent:@""]); bookmark_nodes_[child.get()] = item; - tag_to_guid_[child->id()] = child->guid(); + tag_to_guid_[child->id()] = child->uuid(); ConfigureMenuItem(child.get(), item, false); [menu addItem:item]; } @@ -316,7 +316,7 @@ [item setTarget:controller_]; [item setAction:@selector(openBookmarkMenuItem:)]; [item setTag:node->id()]; - tag_to_guid_[node->id()] = node->guid(); + tag_to_guid_[node->id()] = node->uuid(); if (node->is_url()) [item setToolTip:[BookmarkMenuCocoaController tooltipForNode:node]]; // Check to see if we have a favicon.
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm index 372d8e0..632a8cf 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_bridge_unittest.mm
@@ -397,14 +397,14 @@ // + Item 2 const BookmarkNode* item1 = model->AddURL(root, 0, u"Item 1", GURL("http://item-1/")); - base::GUID item1_guid = item1->guid(); + base::GUID item1_guid = item1->uuid(); const BookmarkNode* folder1 = model->AddFolder(root, 1, u"Folder 1"); - base::GUID folder1_guid = folder1->guid(); + base::GUID folder1_guid = folder1->uuid(); const BookmarkNode* folder2 = model->AddFolder(folder1, 0, u"Folder 2"); - base::GUID folder2_guid = folder2->guid(); + base::GUID folder2_guid = folder2->uuid(); const BookmarkNode* item2 = model->AddURL(folder2, 0, u"Item 2", GURL("http://item-2/")); - base::GUID item2_guid = item2->guid(); + base::GUID item2_guid = item2->uuid(); // We didn't show the menu or any submenus, so it shouldn't contain these // items.
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm index 080b7317..ada0a72 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller.mm
@@ -117,8 +117,9 @@ void BookmarkRestorer::BookmarkModelLoaded(BookmarkModel* model, bool ids_reassigned) { model->RemoveObserver(this); - if (const auto* node = bookmarks::GetBookmarkNodeByGUID(model, guid_)) + if (const auto* node = bookmarks::GetBookmarkNodeByUuid(model, guid_)) { DoOpenBookmark(profile_, disposition_, node); + } delete this; } @@ -135,7 +136,7 @@ if (!model) return; // Should never be reached. - if (const auto* node = bookmarks::GetBookmarkNodeByGUID(model, guid)) { + if (const auto* node = bookmarks::GetBookmarkNodeByUuid(model, guid)) { // BookmarkModel already loaded this bookmark. Open it immediately. DoOpenBookmark(profile, disposition, node); } else { @@ -183,7 +184,7 @@ return; // Unfortunately, we can't update a menu with a dead profile. const auto* model = BookmarkModelFactory::GetForBrowserContext(profile); base::GUID guid = _bridge->TagToGUID([item tag]); - const auto* node = bookmarks::GetBookmarkNodeByGUID(model, guid); + const auto* node = bookmarks::GetBookmarkNodeByUuid(model, guid); _bridge->UpdateMenu(menu, node, /*recurse=*/false); }
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm index af4592df..5c7db7b7c 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_menu_cocoa_controller_unittest.mm
@@ -48,13 +48,13 @@ if ((identifier < 0) || (identifier >= 2)) return base::GUID(); DCHECK(_nodes[identifier]); - return _nodes[identifier]->guid(); + return _nodes[identifier]->uuid(); } - (void)openURLForGUID:(base::GUID)guid { base::span<const BookmarkNode*> nodes = base::make_span(_nodes); auto it = base::ranges::find_if(nodes, [&guid](const BookmarkNode* node) { - return node->guid() == guid; + return node->uuid() == guid; }); ASSERT_NE(it, nodes.end());
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc index 0e19fca..870e3ca 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc
@@ -21,8 +21,6 @@ PrefService* local_state = g_browser_process->local_state(); if (local_state) { if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) && - base::FeatureList::IsEnabled( performance_manager::features:: kPerformanceControlsHighEfficiencyOptOutSurvey)) { performance_manager::user_tuning::UserPerformanceTuningManager::
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc index 8a72895..98614c6f 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc
@@ -53,11 +53,6 @@ return nullptr; } - // Restrict these surveys to users who have HighEfficiency mode available. - if (!base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - return nullptr; - } Profile* profile = Profile::FromBrowserContext(context); // If there is no HaTS service, or the HaTS service reports the user is not
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc index ece2871c..c428f306 100644 --- a/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc +++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc
@@ -138,7 +138,6 @@ {performance_manager::features:: kPerformanceControlsHighEfficiencyOptOutSurvey, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, {}}, }; } };
diff --git a/chrome/browser/ui/quick_answers/BUILD.gn b/chrome/browser/ui/quick_answers/BUILD.gn index 28817d9..d9e6aca4 100644 --- a/chrome/browser/ui/quick_answers/BUILD.gn +++ b/chrome/browser/ui/quick_answers/BUILD.gn
@@ -18,6 +18,8 @@ "ui/quick_answers_pre_target_handler.h", "ui/quick_answers_view.cc", "ui/quick_answers_view.h", + "ui/rich_answers_definition_view.cc", + "ui/rich_answers_definition_view.h", "ui/rich_answers_pre_target_handler.cc", "ui/rich_answers_pre_target_handler.h", "ui/rich_answers_translation_view.cc",
diff --git a/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.cc b/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.cc new file mode 100644 index 0000000..07dcc36 --- /dev/null +++ b/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.cc
@@ -0,0 +1,31 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.h" + +#include "base/functional/bind.h" +#include "chrome/browser/ui/quick_answers/quick_answers_ui_controller.h" +#include "chromeos/components/quick_answers/quick_answers_model.h" +#include "ui/views/layout/fill_layout.h" + +// RichAnswersDefinitionView +// ----------------------------------------------------------- + +RichAnswersDefinitionView::RichAnswersDefinitionView( + const quick_answers::QuickAnswer& result) { + InitLayout(); + + // TODO (b/274184670): Add custom focus behavior according to + // approved greenlines. +} + +RichAnswersDefinitionView::~RichAnswersDefinitionView() = default; + +const char* RichAnswersDefinitionView::GetClassName() const { + return "RichAnswersDefinitionView"; +} + +void RichAnswersDefinitionView::InitLayout() { + // TODO (b/265254908): Populate definition view contents. +}
diff --git a/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.h b/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.h new file mode 100644 index 0000000..5b168e7 --- /dev/null +++ b/chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.h
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_QUICK_ANSWERS_UI_RICH_ANSWERS_DEFINITION_VIEW_H_ +#define CHROME_BROWSER_UI_QUICK_ANSWERS_UI_RICH_ANSWERS_DEFINITION_VIEW_H_ + +#include "base/memory/raw_ptr.h" +#include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/quick_answers/ui/rich_answers_view.h" +#include "ui/views/view.h" + +// A bubble style view to show QuickAnswer. +class RichAnswersDefinitionView : public views::View { + public: + explicit RichAnswersDefinitionView(const quick_answers::QuickAnswer& result); + + RichAnswersDefinitionView(const RichAnswersDefinitionView&) = delete; + RichAnswersDefinitionView& operator=(const RichAnswersDefinitionView&) = + delete; + + ~RichAnswersDefinitionView() override; + + // views::View: + const char* GetClassName() const override; + + private: + void InitLayout(); + + base::WeakPtrFactory<RichAnswersDefinitionView> weak_factory_{this}; +}; + +#endif // CHROME_BROWSER_UI_QUICK_ANSWERS_UI_RICH_ANSWERS_DEFINITION_VIEW_H_
diff --git a/chrome/browser/ui/quick_answers/ui/rich_answers_view.cc b/chrome/browser/ui/quick_answers/ui/rich_answers_view.cc index cd1c3dd19..400df35 100644 --- a/chrome/browser/ui/quick_answers/ui/rich_answers_view.cc +++ b/chrome/browser/ui/quick_answers/ui/rich_answers_view.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/quick_answers/quick_answers_ui_controller.h" #include "chrome/browser/ui/quick_answers/ui/quick_answers_view.h" +#include "chrome/browser/ui/quick_answers/ui/rich_answers_definition_view.h" #include "chrome/browser/ui/quick_answers/ui/rich_answers_pre_target_handler.h" #include "chrome/browser/ui/quick_answers/ui/rich_answers_translation_view.h" #include "chromeos/components/quick_answers/quick_answers_model.h" @@ -152,12 +153,15 @@ AddFrameButtons(); switch (result.result_type) { + case quick_answers::ResultType::kDefinitionResult: + content_view_ = base_view_->AddChildView( + std::make_unique<RichAnswersDefinitionView>(result)); + return; case quick_answers::ResultType::kTranslationResult: { content_view_ = base_view_->AddChildView( std::make_unique<RichAnswersTranslationView>(result)); return; } - case quick_answers::ResultType::kDefinitionResult: case quick_answers::ResultType::kUnitConversionResult: default: { // TODO(b/259440976): Add child views for each result type.
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc index caaa5ca6..db5c01d 100644 --- a/chrome/browser/ui/tab_helpers.cc +++ b/chrome/browser/ui/tab_helpers.cc
@@ -491,10 +491,7 @@ SadTabHelper::CreateForWebContents(web_contents); SearchTabHelper::CreateForWebContents(web_contents); TabDialogs::CreateForWebContents(web_contents); - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - HighEfficiencyChipTabHelper::CreateForWebContents(web_contents); - } + HighEfficiencyChipTabHelper::CreateForWebContents(web_contents); if (base::FeatureList::IsEnabled(features::kTabHoverCardImages) || base::FeatureList::IsEnabled(features::kWebUITabStrip)) { ThumbnailTabHelper::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc index a5f690a..dd780fd 100644 --- a/chrome/browser/ui/toolbar/app_menu_model.cc +++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -253,14 +253,9 @@ if (!base::FeatureList::IsEnabled(features::kExtensionsMenuInAppMenu)) { AddItemWithStringId(IDC_MANAGE_EXTENSIONS, IDS_SHOW_EXTENSIONS); } - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable)) { - AddItemWithStringId(IDC_PERFORMANCE, IDS_SHOW_PERFORMANCE); - SetElementIdentifierAt(GetIndexOfCommandId(IDC_PERFORMANCE).value(), - kPerformanceMenuItem); - } + AddItemWithStringId(IDC_PERFORMANCE, IDS_SHOW_PERFORMANCE); + SetElementIdentifierAt(GetIndexOfCommandId(IDC_PERFORMANCE).value(), + kPerformanceMenuItem); if (chrome::CanOpenTaskManager()) AddItemWithStringId(IDC_TASK_MANAGER, IDS_TASK_MANAGER); #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc b/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc index 95ae0a9..71b6820 100644 --- a/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc +++ b/chrome/browser/ui/toolbar/app_menu_model_interactive_uitest.cc
@@ -45,9 +45,6 @@ void SetUp() override { set_open_about_blank_on_browser_launch(true); ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - performance_manager::features::kHighEfficiencyModeAvailable); InteractiveBrowserTest::SetUp(); }
diff --git a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc index 8e91fad0..9102b15 100644 --- a/chrome/browser/ui/toolbar/app_menu_model_unittest.cc +++ b/chrome/browser/ui/toolbar/app_menu_model_unittest.cc
@@ -311,10 +311,7 @@ } } -TEST_F(AppMenuModelTest, EnabledPerformanceItem) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - performance_manager::features::kHighEfficiencyModeAvailable); +TEST_F(AppMenuModelTest, PerformanceItem) { AppMenuModel model(this, browser()); model.Init(); ToolsMenuModel toolModel(&model, browser()); @@ -323,18 +320,6 @@ EXPECT_TRUE(toolModel.IsEnabledAt(performance_index)); } -TEST_F(AppMenuModelTest, DisabledPerformanceItem) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - /*enabled_features=*/{}, /*disabled_features=*/{ - performance_manager::features::kHighEfficiencyModeAvailable, - performance_manager::features::kBatterySaverModeAvailable}); - AppMenuModel model(this, browser()); - model.Init(); - ToolsMenuModel toolModel(&model, browser()); - EXPECT_FALSE(toolModel.GetIndexOfCommandId(IDC_PERFORMANCE).has_value()); -} - #if BUILDFLAG(IS_CHROMEOS) // Tests settings menu items is disabled in the app menu when // kSystemFeaturesDisableList is set.
diff --git a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc index 98ff85e..918e17b 100644 --- a/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/iban_bubble_view_uitest.cc
@@ -178,7 +178,7 @@ ResetEventWaiterForSequence( {DialogEvent::OFFERED_LOCAL_SAVE, DialogEvent::BUBBLE_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); } @@ -356,7 +356,9 @@ FindViewInBubbleById(DialogViewId::NICKNAME_TEXTFIELD)); } - void WaitForObservedEvent() { event_waiter_->Wait(); } + [[nodiscard]] testing::AssertionResult WaitForObservedEvent() { + return event_waiter_->Wait(); + } raw_ptr<IBANSaveManager> iban_save_manager_ = nullptr; @@ -405,7 +407,7 @@ // Clicking 'No thanks' should cancel and close it. ResetEventWaiterForSequence({DialogEvent::DECLINE_SAVE_IBAN_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(GetSaveIbanBubbleView()); EXPECT_EQ( @@ -436,7 +438,7 @@ ResetEventWaiterForSequence({DialogEvent::DECLINE_SAVE_IBAN_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } EXPECT_EQ( iban_save_manager_->GetIBANSaveStrikeDatabaseForTesting()->GetStrikes( @@ -450,7 +452,7 @@ ResetEventWaiterForSequence( {DialogEvent::OFFERED_LOCAL_SAVE, DialogEvent::ICON_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE( iban_save_manager_->GetIBANSaveStrikeDatabaseForTesting() @@ -463,7 +465,7 @@ // Click the icon to show the bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveIbanIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); histogram_tester.ExpectUniqueSample( @@ -471,7 +473,7 @@ autofill_metrics::SaveIbanPromptOffer::kShown, 1); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); histogram_tester.ExpectBucketCount( "Autofill.SaveIbanPromptOffer.Local.FirstShow", autofill_metrics::SaveIbanPromptOffer::kNotShownMaxStrikesReached, 1); @@ -490,7 +492,7 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); ClickOnSaveButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(GetSaveIbanBubbleView()); histogram_tester.ExpectUniqueSample( @@ -514,7 +516,7 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); ClickOnSaveButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(GetSaveIbanBubbleView()); histogram_tester.ExpectUniqueSample( @@ -579,12 +581,12 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); ClickOnSaveButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Open up manage IBANs bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveIbanIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); const views::Label* nickname_label = static_cast<views::Label*>( FindViewInBubbleById(DialogViewId::NICKNAME_LABEL)); @@ -603,12 +605,12 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); ClickOnSaveButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Open up manage IBANs bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveIbanIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(FindViewInBubbleById(DialogViewId::NICKNAME_LABEL)); // Verify the bubble type is manage saved IBAN. @@ -624,12 +626,12 @@ ResetEventWaiterForSequence({DialogEvent::ACCEPT_SAVE_IBAN_COMPLETE}); ClickOnSaveButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Open up manage IBANs bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveIbanIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Verify the bubble type is manage saved IBAN. ASSERT_EQ(GetBubbleType(), IbanBubbleType::kManageSavedIban);
diff --git a/chrome/browser/ui/views/autofill/payments/local_card_migration_uitest.cc b/chrome/browser/ui/views/autofill/payments/local_card_migration_uitest.cc index 35de7b0..1198834 100644 --- a/chrome/browser/ui/views/autofill/payments/local_card_migration_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/local_card_migration_uitest.cc
@@ -351,14 +351,14 @@ {DialogEvent::REQUESTED_LOCAL_CARD_MIGRATION, DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE}); FillAndSubmitFormWithCard(card_number); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } void ClickOnSaveButtonAndWaitForMigrationResults() { ResetEventWaiterForSequence({DialogEvent::SENT_MIGRATE_CARDS_REQUEST, DialogEvent::RECEIVED_MIGRATE_CARDS_RESPONSE}); ClickOnOkButton(GetLocalCardMigrationMainDialogView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } void FillAndSubmitFormWithCard(std::string card_number) { @@ -514,7 +514,9 @@ std::make_unique<EventWaiter<DialogEvent>>(std::move(event_sequence)); } - void WaitForObservedEvent() { event_waiter_->Wait(); } + [[nodiscard]] testing::AssertionResult WaitForObservedEvent() { + return event_waiter_->Wait(); + } network::TestURLLoaderFactory* test_url_loader_factory() { return &test_url_loader_factory_;
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_browsertest.cc index 24deed34..f0bbd5b 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_browsertest.cc
@@ -57,7 +57,7 @@ ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateToAndWaitForForm("https://www.example.com/first/"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); @@ -72,7 +72,7 @@ ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateToAndWaitForForm("https://www.example.com/first/"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); @@ -127,7 +127,7 @@ ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateToAndWaitForForm("https://www.example.com/first/"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews());
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc index eded56a..6dab49c 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
@@ -79,7 +79,7 @@ GURL("https://www.merchantsite2.com/")}); ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateTo("https://www.merchantsite1.com/first"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); } @@ -92,7 +92,7 @@ GURL("https://www.merchantsite2.com/")}); ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateTo("https://www.merchantsite1.com/first"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); } @@ -105,7 +105,7 @@ GURL("https://www.merchantsite2.com/")}); ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateTo("https://www.merchantsite1.com/first"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); } @@ -125,7 +125,7 @@ EXPECT_TRUE(icon); ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); chrome::ExecuteCommand(browser(), IDC_OFFERS_AND_REWARDS_FOR_PAGE); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); } @@ -202,7 +202,7 @@ ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); NavigateTo("https://www.merchantsite1.com/first"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Bubble should be visible. ASSERT_TRUE(IsIconVisible()); @@ -276,7 +276,7 @@ // Change to the first background tab. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); browser()->tab_strip_model()->ActivateTabAt(1); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Icon should always be visible, and the bubble should be visible too. EXPECT_TRUE(IsIconVisible()); ASSERT_TRUE(GetOfferNotificationBubbleViews());
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.h b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.h index 624b0f2..42cac36 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.h +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_test_base.h
@@ -124,7 +124,9 @@ AutofillOfferManager* GetOfferManager(); - void WaitForObservedEvent() { event_waiter_->Wait(); } + [[nodiscard]] testing::AssertionResult WaitForObservedEvent() { + return event_waiter_->Wait(); + } PersonalDataManager* personal_data() { return personal_data_; }
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index 2d51a1bf..fb5acac 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -363,7 +363,7 @@ ResetEventWaiterForSequence( {DialogEvent::OFFERED_LOCAL_SAVE, DialogEvent::BUBBLE_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); } @@ -376,7 +376,7 @@ DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE, DialogEvent::OFFERED_UPLOAD_SAVE, DialogEvent::BUBBLE_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_UPLOAD) ->GetVisible()); EXPECT_TRUE( @@ -740,7 +740,9 @@ std::make_unique<EventWaiter<DialogEvent>>(std::move(event_sequence)); } - void WaitForObservedEvent() { event_waiter_->Wait(); } + [[nodiscard]] testing::AssertionResult WaitForObservedEvent() { + return event_waiter_->Wait(); + } network::TestURLLoaderFactory* test_url_loader_factory() { return &test_url_loader_factory_; @@ -767,7 +769,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // UMA should have recorded bubble rejection. histogram_tester.ExpectUniqueSample( @@ -830,7 +832,7 @@ // Open up Manage Cards prompt. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveCardIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Click on the redirect button. ClickOnDialogViewWithId(DialogViewId::MANAGE_CARDS_BUTTON); @@ -1016,7 +1018,7 @@ DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE, DialogEvent::OFFERED_LOCAL_SAVE, DialogEvent::BUBBLE_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); @@ -1089,7 +1091,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // UMA should have recorded bubble rejection. histogram_tester.ExpectUniqueSample( @@ -1374,7 +1376,7 @@ NavigateToAndWaitForForm(kCreditCardAndAddressUploadForm); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); } @@ -1400,7 +1402,7 @@ NavigateToAndWaitForForm(kCreditCardAndAddressUploadForm); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); } @@ -1440,7 +1442,7 @@ DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE, DialogEvent::OFFERED_UPLOAD_SAVE, DialogEvent::BUBBLE_SHOWN}); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(GetSaveCardBubbleViews()); } @@ -1465,7 +1467,7 @@ DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE}); FillFormWithCardDetailsOnly(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(GetSaveCardBubbleViews()); } @@ -1482,7 +1484,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillFormWithoutCvc(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests the upload save logic. Ensures that Chrome lets Payments decide whether @@ -1499,7 +1501,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillFormWithInvalidCvc(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests the upload save logic. Ensures that Chrome lets Payments decide whether @@ -1517,7 +1519,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillFormWithoutName(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests the upload save logic. Ensures that Chrome lets Payments decide whether @@ -1539,7 +1541,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests the upload save logic. Ensures that Chrome lets Payments decide whether @@ -1556,7 +1558,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillFormWithoutAddress(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests the upload save logic. Ensures that Chrome lets Payments decide whether @@ -1578,7 +1580,7 @@ ResetEventWaiterForSequence({DialogEvent::REQUESTED_UPLOAD_SAVE}); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } // Tests UMA logging for the upload save bubble. Ensures that if the user @@ -1810,7 +1812,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Ensure that a strike was added. histogram_tester.ExpectUniqueSample( @@ -1833,7 +1835,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Ensure that a strike was added. histogram_tester.ExpectUniqueSample( @@ -1858,7 +1860,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Ensure that a strike was added due to the bubble being declined. // The sample logged is the Nth strike added, or (i+1). @@ -1875,14 +1877,14 @@ {DialogEvent::OFFERED_LOCAL_SAVE, DialogEvent::ICON_SHOWN}); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(GetSaveCardIconView()->GetVisible()); EXPECT_FALSE(GetSaveCardBubbleViews()); // Click the icon to show the bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveCardIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_LOCAL) ->GetVisible()); @@ -1925,7 +1927,7 @@ ResetEventWaiterForSequence({DialogEvent::STRIKE_CHANGE_COMPLETE}); ClickOnCancelButton(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Ensure that a strike was added due to the bubble being declined. // The sample logged is the Nth strike added, or (i+1). @@ -1945,14 +1947,14 @@ NavigateToAndWaitForForm(kCreditCardAndAddressUploadForm); FillForm(); SubmitForm(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(GetSaveCardIconView()->GetVisible()); EXPECT_FALSE(GetSaveCardBubbleViews()); // Click the icon to show the bubble. ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveCardIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::MAIN_CONTENT_VIEW_UPLOAD) ->GetVisible()); EXPECT_TRUE(FindViewInBubbleById(DialogViewId::FOOTNOTE_VIEW)->GetVisible()); @@ -2055,7 +2057,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveCardIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Bubble should be showing. EXPECT_TRUE( @@ -2084,7 +2086,7 @@ base::HistogramTester histogram_tester; ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); ClickOnView(GetSaveCardIconView()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Click on the [Done] button. ClickOnDialogViewWithIdAndWait(DialogViewId::OK_BUTTON);
diff --git a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc index 11c264b..8d5fa164 100644 --- a/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/virtual_card_manual_fallback_bubble_views_interactive_uitest.cc
@@ -119,13 +119,13 @@ options.virtual_card_cvc = virtual_card_cvc; options.card_image = gfx::test::CreateImage(32, 20); GetController()->ShowBubble(options); - event_waiter_->Wait(); + ASSERT_TRUE(event_waiter_->Wait()); } void ReshowBubble() { ResetEventWaiterForSequence({BubbleEvent::BUBBLE_SHOWN}); GetController()->ReshowBubble(); - event_waiter_->Wait(); + ASSERT_TRUE(event_waiter_->Wait()); } bool IsIconVisible() { return GetIconView() && GetIconView()->GetVisible(); }
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index f55b57d..2577e40 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -926,12 +926,8 @@ #endif // High Efficiency mode is default off but is available to turn on - if (!performance_manager::features::kHighEfficiencyModeDefaultState.Get() && - base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - high_efficiency_opt_in_iph_controller_ = - std::make_unique<HighEfficiencyOptInIPHController>(browser_.get()); - } + high_efficiency_opt_in_iph_controller_ = + std::make_unique<HighEfficiencyOptInIPHController>(browser_.get()); } BrowserView::~BrowserView() {
diff --git a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc index f181ad4e..6d29a8b 100644 --- a/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc +++ b/chrome/browser/ui/views/frame/picture_in_picture_browser_frame_view.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/ui/views/chrome_layout_provider.h" #include "chrome/browser/ui/views/chrome_typography.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/top_container_view.h" #include "chrome/browser/ui/views/overlay/overlay_window_image_button.h" #include "chrome/browser/ui/views/page_info/page_info_bubble_view.h" #include "chrome/grit/generated_resources.h" @@ -27,6 +28,7 @@ #include "ui/display/screen.h" #include "ui/events/event_observer.h" #include "ui/gfx/animation/animation_container.h" +#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/animation/compositor_animation_runner.h" #include "ui/views/event_monitor.h" #include "ui/views/layout/animating_layout_manager.h" @@ -245,6 +247,13 @@ gfx::Tween::Type::ZERO, 0.0, 0.0)}) { + // We create our own top container, so we hide the one created by default (and + // its children) from the user and accessibility tools. + browser_view->top_container()->SetVisible(false); + browser_view->top_container()->SetEnabled(false); + browser_view->top_container()->GetViewAccessibility().OverrideIsIgnored(true); + browser_view->top_container()->GetViewAccessibility().OverrideIsLeaf(true); + location_bar_model_ = std::make_unique<LocationBarModelImpl>( this, content::kMaxURLDisplayChars);
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest_chromeos.cc b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest_chromeos.cc index f2361c893..be97c7c 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view_browsertest_chromeos.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view_browsertest_chromeos.cc
@@ -1282,14 +1282,8 @@ // launching an app window for. In this case, the prerender should be canceled // and the app shouldn't be opened. // TODO(https://crbug.com/1428425): flakily times out -#if defined(MEMORY_SANITIZER) -#define MAYBE_AppLaunchURLCancelsPrerendering \ - DISABLED_AppLaunchURLCancelsPrerendering -#else -#define MAYBE_AppLaunchURLCancelsPrerendering AppLaunchURLCancelsPrerendering -#endif IN_PROC_BROWSER_TEST_F(IntentPickerBubbleViewPrerenderingBrowserTestChromeOS, - MAYBE_AppLaunchURLCancelsPrerendering) { + DISABLED_AppLaunchURLCancelsPrerendering) { // Prerendering is currently limited to same-origin pages so we need to start // it from an arbitrary page on the same origin, rather than about:blank. const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html");
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc index 48d8868d..508b691 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls_bubble_view_browsertest.cc
@@ -161,8 +161,14 @@ } // Test opening cookie controls bubble and clicking on "not working" link. +// TODO(crbug.com/1332525): Failing on Linux ChromeOS debug build. +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_InvokeUi_NotWorkingClicked DISABLED_InvokeUi_NotWorkingClicked +#else +#define MAYBE_InvokeUi_NotWorkingClicked InvokeUi_NotWorkingClicked +#endif IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, - InvokeUi_NotWorkingClicked) { + MAYBE_InvokeUi_NotWorkingClicked) { // Block 3p cookies. SetThirdPartyCookieBlocking(true); @@ -172,8 +178,14 @@ // Test opening cookie controls bubble while 3p cookies are allowed for this // page. +// TODO(crbug.com/1332525): Failing on Linux ChromeOS debug build. +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_InvokeUi_BlockingDisabled DISABLED_InvokeUi_BlockingDisabled +#else +#define MAYBE_InvokeUi_BlockingDisabled InvokeUi_BlockingDisabled +#endif IN_PROC_BROWSER_TEST_F(CookieControlsBubbleViewTest, - InvokeUi_BlockingDisabled) { + MAYBE_InvokeUi_BlockingDisabled) { // Block 3p cookies in general but allow them for this site. SetThirdPartyCookieBlocking(true); GURL origin = embedded_test_server()->GetURL("a.com", "/");
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index f6e5685b..09b222c 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -323,10 +323,7 @@ params.types_enabled.push_back(PageActionIconType::kCookieControls); params.types_enabled.push_back( PageActionIconType::kPaymentsOfferNotification); - if (base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)) { - params.types_enabled.push_back(PageActionIconType::kHighEfficiency); - } + params.types_enabled.push_back(PageActionIconType::kHighEfficiency); } // Add icons only when feature is not enabled. Otherwise icons will // be added to the ToolbarPageActionIconContainerView.
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc index 43e3ce3..3b003b75e 100644 --- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller_browsertest.cc
@@ -449,7 +449,7 @@ " phone: 'PHONE ERROR'" " }" "});")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_EQ(u"EMAIL ERROR", GetErrorLabelForType(autofill::EMAIL_ADDRESS)); EXPECT_EQ(u"NAME ERROR", GetErrorLabelForType(autofill::NAME_FULL)); @@ -504,7 +504,7 @@ " phone: 'PHONE ERROR'" " }" "});")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_EQ(u"EMAIL ERROR", GetErrorLabelForType(autofill::EMAIL_ADDRESS)); EXPECT_EQ(u"NAME ERROR", GetErrorLabelForType(autofill::NAME_FULL)); @@ -554,7 +554,7 @@ " phone: 'PHONE ERROR'" " }" "});")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); const int kErrorLabelOffset = static_cast<int>(DialogViewID::ERROR_LABEL_OFFSET);
diff --git a/chrome/browser/ui/views/payments/error_message_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/error_message_view_controller_browsertest.cc index eb8d8a64..5986fc15 100644 --- a/chrome/browser/ui/views/payments/error_message_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/error_message_view_controller_browsertest.cc
@@ -69,7 +69,7 @@ ResetEventWaiter(DialogEvent::DIALOG_CLOSED); EXPECT_TRUE(error_sheet->AcceleratorPressed( ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } IN_PROC_BROWSER_TEST_F(PaymentRequestErrorMessageTest,
diff --git a/chrome/browser/ui/views/payments/order_summary_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/order_summary_view_controller_browsertest.cc index 4d68419..28942310 100644 --- a/chrome/browser/ui/views/payments/order_summary_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/order_summary_view_controller_browsertest.cc
@@ -64,7 +64,7 @@ {DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); EXPECT_TRUE(summary_sheet->AcceleratorPressed( ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } IN_PROC_BROWSER_TEST_F(PaymentRequestOrderSummaryViewControllerTest,
diff --git a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc index c7486b6..ab8f682 100644 --- a/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_header_view_ui_browsertest.cc
@@ -77,7 +77,7 @@ content::EvalJs( GetActiveWebContents(), content::JsReplace("launchWithoutWaitForResponse($1)", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // We always push the initial browser sheet to the stack, even if it isn't // shown. Since it also defines a SHEET_TITLE, we have to explicitly test the @@ -128,7 +128,7 @@ content::EvalJs( GetActiveWebContents(), content::JsReplace("launchWithoutWaitForResponse($1)", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Select the installed payment app. OpenPaymentMethodScreen(); @@ -173,7 +173,7 @@ "launchWithoutWaitForResponseWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Select the installed payment app. OpenPaymentMethodScreen(); @@ -230,7 +230,7 @@ content::EvalJs( GetActiveWebContents(), content::JsReplace("launchWithoutWaitForResponse($1)", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ViewStack* view_stack = dialog_view()->view_stack_for_testing(); int header_height_with_title = @@ -256,7 +256,7 @@ content::JsReplace("launchWithoutWaitForResponse($1, " "'payment_handler_window_no_title.html')", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Expect the dialog and header height with a title to be the same as before. view_stack = dialog_view()->view_stack_for_testing(); @@ -293,7 +293,7 @@ content::EvalJs( GetActiveWebContents(), content::JsReplace("launchWithoutWaitForResponse($1)", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // We always push the initial browser sheet to the stack, even if it isn't // shown. Since it also defines a SHEET_TITLE, we have to explicitly test the
diff --git a/chrome/browser/ui/views/payments/payment_handler_icon_refetch_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_icon_refetch_browsertest.cc index fb2dd88..1125309 100644 --- a/chrome/browser/ui/views/payments/payment_handler_icon_refetch_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_icon_refetch_browsertest.cc
@@ -69,7 +69,7 @@ GetActiveWebContents(), "testPaymentMethods([{supportedMethods: 'https://kylepay.test/webpay'}], " "/* requestShippingContact= */ true);"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // App with missing icon is not preselectable. EXPECT_FALSE(IsPayButtonEnabled()); @@ -105,7 +105,7 @@ GetActiveWebContents(), "testPaymentMethods([{supportedMethods: 'https://kylepay.test/webpay'}], " "/* requestShippingContact= */ true);")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({"kylepay.test/webpay"}); // Navigate to the first merchant again and confirm that skip the sheet flow @@ -121,7 +121,7 @@ GetActiveWebContents(), "testPaymentMethods([{supportedMethods: 'https://kylepay.test/webpay'}], " "/* requestShippingContact= */ true);")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({"kylepay.test/webpay"}); } } // namespace payments
diff --git a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_browsertest.cc index caeaa97..0015f78 100644 --- a/chrome/browser/ui/views/payments/payment_handler_web_flow_view_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_web_flow_view_browsertest.cc
@@ -34,7 +34,7 @@ content::EvalJs( GetActiveWebContents(), content::JsReplace("launchWithoutWaitForResponse($1)", method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // We always push the initial browser sheet to the stack, even if it isn't // shown. Since it also defines a CONTENT_VIEW, we have to explicitly test the
diff --git a/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc b/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc index b74d816..d867f1a 100644 --- a/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_handler_window_size_browsertest.cc
@@ -70,7 +70,7 @@ "paymentRequestWithOptions({requestShipping: true}, $1)", payment_method), /*options=*/content::EXECUTE_SCRIPT_NO_RESOLVE_PROMISES)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_EQ(expected_payment_request_dialog_size_, DialogViewSize()); gfx::Size expected_payment_handler_dialog_size;
diff --git a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc index 38010f2b..4eefb11 100644 --- a/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_method_view_controller_browsertest.cc
@@ -81,7 +81,7 @@ {supportedMethods: 'https://kylepay.test/webpay'}, ]); )"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Confirm that "Add card" button is not shown since "basic-card" is not // requested.
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_browsertest.cc index fcbce1a..0de564b 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest.cc
@@ -73,21 +73,21 @@ OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); NavigateTo("/non-existent.html"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndNavigateToSame) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); NavigateTo("/payment_request_no_shipping_test.html"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndReload) { OpenPaymentRequestDialog(); ResetEventWaiter(DialogEvent::DIALOG_CLOSED); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } IN_PROC_BROWSER_TEST_F(PaymentRequestNoShippingTest, OpenAndClickCancel) { @@ -171,7 +171,7 @@ "(function() { document.getElementById('abort').click(); })();"; ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({"Aborted"});
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc index 2e65e7b..e31f906 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -310,7 +310,7 @@ content::WebContents* web_contents = GetActiveWebContents(); ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // The web-modal dialog should be open. web_modal::WebContentsModalDialogManager* web_contents_modal_dialog_manager = @@ -580,7 +580,7 @@ if (wait_for_animation) { WaitForAnimation(dialog_view); } - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } void PaymentRequestBrowserTestBase::ClickOnDialogView(views::View* view) { @@ -683,7 +683,7 @@ ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "retry(" + validation_errors + ");")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } void PaymentRequestBrowserTestBase::RetryPaymentRequest( @@ -699,7 +699,7 @@ ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "retry(" + validation_errors + ");")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } bool PaymentRequestBrowserTestBase::IsViewVisible(DialogViewID view_id) const { @@ -885,8 +885,8 @@ DialogEvent::DIALOG_OPENED}); } -void PaymentRequestBrowserTestBase::WaitForObservedEvent() { - event_waiter_->Wait(); +testing::AssertionResult PaymentRequestBrowserTestBase::WaitForObservedEvent() { + return event_waiter_->Wait(); } base::WeakPtr<CSPChecker>
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h index be91f33..76b0eab 100644 --- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.h +++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.h
@@ -300,7 +300,7 @@ // Resets the event waiter for the events that trigger when opening a dialog. void ResetEventWaiterForDialogOpened(); // Wait for the event(s) passed to ResetEventWaiter*() to occur. - void WaitForObservedEvent(); + [[nodiscard]] testing::AssertionResult WaitForObservedEvent(); // Return a weak pointer to a Content Security Policy (CSP) checker for tests. base::WeakPtr<CSPChecker> GetCSPCheckerForTests();
diff --git a/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc index 8744818..ec8bcfc 100644 --- a/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc
@@ -68,7 +68,7 @@ "queryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Flushing the PaymentRequest::AreRequestedMethodsSupportedCallback() // callback so that EVENT_SHOWN/SKIPPED_SHOW will be recorded. @@ -93,7 +93,7 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Flushing the PaymentRequest::AreRequestedMethodsSupportedCallback() // callback so that EVENT_SHOWN/SKIPPED_SHOW will be recorded. @@ -166,7 +166,7 @@ DialogEvent::HAS_ENROLLED_INSTRUMENT_RETURNED}); ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "queryNoShowWithUrlMethods();")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Navigate away to trigger the log. NavigateTo("/payment_request_email_test.html"); @@ -223,7 +223,7 @@ content::JsReplace("queryShowWithMethods([{supportedMethods:$1}" ",{supportedMethods:$2}]);", nickpay_method_name, nickpay2_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Flushing the PaymentRequest::AreRequestedMethodsSupportedCallback() // callback so that EVENT_SHOWN/SKIPPED_SHOW will be recorded. @@ -285,7 +285,7 @@ content::JsReplace("queryShowWithMethods([{supportedMethods:$1}" ",{supportedMethods:$2}]);", nickpay_method_name, nickpay2_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Flushing the PaymentRequest::AreRequestedMethodsSupportedCallback() // callback so that EVENT_SHOWN/SKIPPED_SHOW will be recorded. @@ -298,7 +298,7 @@ "(function() { document.getElementById('abort').click(); })();"; ASSERT_TRUE( content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets = @@ -352,7 +352,7 @@ content::JsReplace("queryShowWithMethods([{supportedMethods:$1}" ",{supportedMethods:$2}]);", nickpay_method_name, nickpay2_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Flushing the PaymentRequest::AreRequestedMethodsSupportedCallback() // callback so that EVENT_SHOWN/SKIPPED_SHOW will be recorded. @@ -452,7 +452,7 @@ "(function() { document.getElementById('abort').click(); })();"; ASSERT_TRUE( content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets = @@ -568,7 +568,7 @@ "(function() { document.getElementById('abort').click(); })();"; ASSERT_TRUE( content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure that no canMakePayment events were logged. std::vector<base::Bucket> buckets = @@ -645,7 +645,7 @@ GURL other_origin_url = https_server()->GetURL("b.com", "/payment_request_email_test.html"); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), other_origin_url)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets = @@ -685,7 +685,7 @@ // different page on the same origin. ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); NavigateTo("c.com", "/payment_request_email_test.html"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets = @@ -724,7 +724,7 @@ // Simulate that the user reloads the page containing the Payment Request. ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets = @@ -763,7 +763,7 @@ // Simulate that the user closes the tab containing the Payment Request. ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); chrome::CloseTab(browser()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the correct events were logged. std::vector<base::Bucket> buckets =
diff --git a/chrome/browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc index 2105fdb7..397be98 100644 --- a/chrome/browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc
@@ -86,13 +86,13 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // The merchant reloads the page. ResetEventWaiter(DialogEvent::DIALOG_CLOSED); ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "(function() { location.reload(); })();")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the metrics are logged correctly. histogram_tester.ExpectUniqueSample( @@ -148,7 +148,7 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // The merchant navigates away. ResetEventWaiter(DialogEvent::DIALOG_CLOSED); @@ -156,7 +156,7 @@ "(function() { window.location.href = " "'/payment_request_email_test.html'; " "})();")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the metrics are logged correctly. histogram_tester.ExpectUniqueSample( @@ -212,7 +212,7 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // The merchant aborts the Payment Request. ResetEventWaiterForSequence( @@ -221,7 +221,7 @@ "(function() { document.getElementById('abort').click(); })();"; ASSERT_TRUE( content::ExecuteScript(GetActiveWebContents(), click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the metrics are logged correctly. histogram_tester.ExpectUniqueSample( @@ -277,7 +277,7 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Navigate away. NavigateTo("/payment_request_email_test.html"); @@ -337,7 +337,7 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Click on the cancel button. ClickOnCancel(); @@ -397,12 +397,12 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Close the tab containing the Payment Request. ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); chrome::CloseTab(browser()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the metrics are logged correctly. histogram_tester.ExpectUniqueSample( @@ -458,12 +458,12 @@ "noQueryShowWithMethods([{supportedMethods:$1}" ", {supportedMethods:$2}])", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Reload the page containing the Payment Request. ResetEventWaiterForSequence({DialogEvent::DIALOG_CLOSED}); chrome::Reload(browser(), WindowOpenDisposition::CURRENT_TAB); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Make sure the metrics are logged correctly. histogram_tester.ExpectUniqueSample(
diff --git a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc index 489719f0..2e2b5af2 100644 --- a/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_journey_logger_browsertest.cc
@@ -94,7 +94,7 @@ const std::string click_buy_button_js = "(function() { document.getElementById('buy').click(); })();"; ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); histogram_tester.ExpectBucketCount( "PaymentRequest.CheckoutFunnel.NoShow", @@ -762,7 +762,7 @@ ", {supportedMethods:$2}]);", a_method_name, b_method_name))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Navigate away to abort the Payment Request and trigger the logs. NavigateTo("/payment_request_email_test.html"); @@ -897,7 +897,7 @@ content::JsReplace("triggerPaymentRequestWithMethods([{supportedMethods:$" "1}, {supportedMethods:$2}])", a_method, b_method))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Simulate that the user cancels the PR. ClickOnCancel();
diff --git a/chrome/browser/ui/views/payments/payment_request_payment_app_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_payment_app_browsertest.cc index 3b674886..e23ba75a 100644 --- a/chrome/browser/ui/views/payments/payment_request_payment_app_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_payment_app_browsertest.cc
@@ -388,7 +388,7 @@ DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::DIALOG_OPENED, DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ASSERT_TRUE(content::ExecJs(GetActiveWebContents(), "buy()")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({"bobpay.test"}); } @@ -424,7 +424,7 @@ // requested and both apps are installed. ResetEventWaiterForDialogOpened(); content::ExecuteScriptAsync(GetActiveWebContents(), "buy()"); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Click on pay. EXPECT_TRUE(IsPayButtonEnabled()); @@ -460,7 +460,7 @@ "testPaymentMethods([{supportedMethods: 'https://bobpay.test'}, " "{supportedMethods: 'https://kylepay.test'}], true /*= " "requestShippingContact */)")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({"kylepay.test"}); } @@ -485,7 +485,7 @@ "(function() { " "document.getElementById('buyWithRequestedEmail').click(); })();"; ASSERT_TRUE(content::ExecuteScript(web_contents, click_buy_button_js)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsPayButtonEnabled()); ResetEventWaiterForSequence( @@ -509,7 +509,7 @@ GetActiveWebContents(), "testPaymentMethods([{supportedMethods: 'https://kylepay.test/webpay'}], " "true /*= requestShippingContact */);")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Pay button should be enabled without any autofill profiles since the // selected payment instrument (kylepay) handles all merchant required
diff --git a/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc index b714df7..8d3bb4b 100644 --- a/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_payment_response_browsertest.cc
@@ -49,7 +49,7 @@ ResetEventWaiterForSequence( {DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ClickOnDialogViewAndWait(DialogViewID::PAY_BUTTON, dialog_view()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Test that the shipping address was sent to the merchant. ExpectBodyContains( @@ -84,7 +84,7 @@ ResetEventWaiterForSequence( {DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ClickOnDialogViewAndWait(DialogViewID::PAY_BUTTON, dialog_view()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Test that the contact details were sent to the merchant. ExpectBodyContains({"\"payerName\": \"John H. Doe\"", @@ -170,7 +170,7 @@ ResetEventWaiterForSequence( {DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ClickOnDialogViewAndWait(DialogViewID::PAY_BUTTON, dialog_view()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Test that the contact details were sent to the merchant. ExpectBodyContains({"\"payerName\": null",
diff --git a/chrome/browser/ui/views/payments/payment_request_retry_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_retry_browsertest.cc index 8be2375..eec0b1e 100644 --- a/chrome/browser/ui/views/payments/payment_request_retry_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_retry_browsertest.cc
@@ -59,7 +59,7 @@ " phone: 'PHONE ERROR'" " }" "});")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_EQ(1U, request->state()->available_apps().size()); }
diff --git a/chrome/browser/ui/views/payments/payment_request_sheet_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_sheet_controller_browsertest.cc index 48fb2c13..066868e 100644 --- a/chrome/browser/ui/views/payments/payment_request_sheet_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_sheet_controller_browsertest.cc
@@ -69,7 +69,7 @@ " phone: 'PHONE ERROR'" " }" "});")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_FALSE(dialog_view()->throbber_overlay_for_testing()->GetVisible()); EXPECT_TRUE(dialog_view()
diff --git a/chrome/browser/ui/views/payments/payment_request_shipping_address_instance_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_shipping_address_instance_browsertest.cc index 8775c55..45a7d10 100644 --- a/chrome/browser/ui/views/payments/payment_request_shipping_address_instance_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_shipping_address_instance_browsertest.cc
@@ -35,7 +35,7 @@ ResetEventWaiterForSequence( {DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ClickOnDialogViewAndWait(DialogViewID::PAY_BUTTON, dialog_view()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Verify that the shippingAddress instance in the request and response were // the same object instance.
diff --git a/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc index 6f2df6a..ec44f1ed4 100644 --- a/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_show_promise_browsertest.cc
@@ -44,7 +44,7 @@ ASSERT_TRUE( content::ExecuteScript(GetActiveWebContents(), content::JsReplace("buy($1)", payment_method_))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(web_modal::WebContentsModalDialogManager::FromWebContents( GetActiveWebContents()) ->IsDialogActive()); @@ -235,7 +235,7 @@ DialogEvent::PROCESSING_SPINNER_HIDDEN, DialogEvent::DIALOG_OPENED, DialogEvent::PROCESSING_SPINNER_SHOWN, DialogEvent::DIALOG_CLOSED}); ASSERT_TRUE(content::ExecuteScript(GetActiveWebContents(), "buy();")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); ExpectBodyContains({R"({"currency":"USD","value":"1.00"})"}); }
diff --git a/chrome/browser/ui/views/payments/payment_request_update_with_browsertest.cc b/chrome/browser/ui/views/payments/payment_request_update_with_browsertest.cc index e73f7cd..1a47f08 100644 --- a/chrome/browser/ui/views/payments/payment_request_update_with_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_request_update_with_browsertest.cc
@@ -31,7 +31,7 @@ ASSERT_TRUE(content::ExecuteScript( web_contents, function_name + "('" + payment_method_name + "');")); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } };
diff --git a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc index dce6979..df6171f 100644 --- a/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc
@@ -214,7 +214,7 @@ "paymentRequestWithOptions({requestShipping: true}, $1)", payment_method), /*options=*/content::EXECUTE_SCRIPT_NO_RESOLVE_PROMISES)); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsPayButtonEnabled()); EXPECT_FALSE(IsViewVisible(DialogViewID::PAYMENT_APP_OPENED_WINDOW_SHEET)); @@ -253,7 +253,7 @@ content::JsReplace( "launchWithoutWaitForResponse($1)", payment_method))); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsViewVisible(DialogViewID::BACK_BUTTON)); EXPECT_TRUE(IsViewVisible(DialogViewID::PAYMENT_APP_OPENED_WINDOW_SHEET));
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc index e7d0999..bc3a480 100644 --- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc +++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -194,7 +194,7 @@ } country_combobox->SetSelectedRow(i); country_combobox->OnBlur(); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); } PersonalDataLoadedObserverMock personal_data_observer_; @@ -409,7 +409,7 @@ country_combobox = nullptr; country_model = nullptr; region_combobox = nullptr; - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Some types could have been lost in previous countries and may now // available in this country. @@ -507,7 +507,7 @@ ResetEventWaiter(DialogEvent::EDITOR_VIEW_UPDATED); test_region_data_loader_.SendAsynchronousData( std::vector<std::pair<std::string, std::string>>()); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); // Now any textual value can be set for the ADDRESS_HOME_STATE. SetFieldTestValue(autofill::ADDRESS_HOME_STATE); @@ -1361,7 +1361,7 @@ DialogEvent::SHIPPING_ADDRESS_EDITOR_OPENED}); ClickOnChildInListViewAndWait(/*child_index=*/0, /*num_children=*/1, DialogViewID::SHIPPING_ADDRESS_SHEET_LIST_VIEW); - WaitForObservedEvent(); + ASSERT_TRUE(WaitForObservedEvent()); EXPECT_EQ(u"ADDRESS LINE ERROR", GetErrorLabelForType(autofill::ADDRESS_HOME_STREET_ADDRESS));
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.cc index fd96bc53..b2b3041 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view.cc
@@ -127,7 +127,8 @@ ResetSlideAnimation(false); } - if (performance_manager::features::kHighEfficiencyModeDefaultState.Get()) { + if (base::FeatureList::IsEnabled( + feature_engagement::kIPHHighEfficiencyInfoModeFeature)) { // Delay the IPH to ensure the chip is not animating when it appears. timer_.Start(FROM_HERE, kIPHDelayDuration, base::BindOnce(&HighEfficiencyChipView::MaybeShowIPH,
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_browsertest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_browsertest.cc index a60d660..aed3dbb 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_browsertest.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_browsertest.cc
@@ -174,70 +174,6 @@ }; IN_PROC_BROWSER_TEST_F(HighEfficiencyChipViewBrowserTest, - NavigatesOnIPHSettingsLinkClicked) { - auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting(); - EXPECT_FALSE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - - DiscardTabAt(0); - chrome::SelectNumberedTab(browser(), 0); - WaitForIPHToShow(); - - EXPECT_TRUE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - - ClickIPHSettingsButton(); - TabStripModel* tab_strip_model = browser()->tab_strip_model(); - EXPECT_EQ(3, tab_strip_model->count()); - content::WebContents* web_contents = tab_strip_model->GetWebContentsAt(2); - WaitForLoadStop(web_contents); - GURL expected(chrome::kChromeUIPerformanceSettingsURL); - EXPECT_EQ(expected.host(), web_contents->GetLastCommittedURL().host()); -} - -IN_PROC_BROWSER_TEST_F(HighEfficiencyChipViewBrowserTest, - PromoDismissesOnCancelClick) { - auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting(); - DiscardTabAt(0); - chrome::SelectNumberedTab(browser(), 0); - WaitForIPHToShow(); - - EXPECT_TRUE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - - ClickHighEfficiencyChip(); - - // Expect the bubble to be open and the promo to be closed. - EXPECT_FALSE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - EXPECT_NE(GetHighEfficiencyChipView()->GetBubble(), nullptr); -} - -IN_PROC_BROWSER_TEST_F(HighEfficiencyChipViewBrowserTest, - ShowAndHideInkDropWithPromo) { - auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting(); - EXPECT_FALSE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - - DiscardTabAt(0); - chrome::SelectNumberedTab(browser(), 0); - WaitForIPHToShow(); - - EXPECT_TRUE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - EXPECT_EQ(GetInkDropState(), views::InkDropState::ACTIVATED); - - ClickIPHCancelButton(); - - EXPECT_FALSE(GetFeaturePromoController()->IsPromoActive( - feature_engagement::kIPHHighEfficiencyInfoModeFeature)); - views::InkDropState current_state = GetInkDropState(); - // The deactivated state is HIDDEN on Mac but DEACTIVATED on Linux. - EXPECT_TRUE(current_state == views::InkDropState::HIDDEN || - current_state == views::InkDropState::DEACTIVATED); -} - -IN_PROC_BROWSER_TEST_F(HighEfficiencyChipViewBrowserTest, ShowAndHideInkDropOnDialog) { PageActionIconView* chip = GetHighEfficiencyChipView(); ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc index 1c693be..242f326b 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_chip_view_unittest.cc
@@ -57,8 +57,6 @@ HighEfficiencyChipViewTest() = default; void SetUp() override { - feature_list_.InitAndEnableFeature( - performance_manager::features::kHighEfficiencyModeAvailable); TestWithBrowserView::SetUp(); AddNewTab(kMemorySavingsKilobytes,
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_exclusion_list_browsertest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_exclusion_list_browsertest.cc index beab58f..417686b 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_exclusion_list_browsertest.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_exclusion_list_browsertest.cc
@@ -46,15 +46,6 @@ ~HighEfficiencyExclusionListBrowserTest() override = default; - void SetUp() override { - scoped_feature_list_.InitWithFeaturesAndParameters( - {{performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "true"}, {"time_before_discard", "1h"}}}}, - {}); - - InProcessBrowserTest::SetUp(); - } - void SetUpOnMainThread() override { InProcessBrowserTest::SetUpOnMainThread(); TabStripModel* tab_strip_model = browser()->tab_strip_model(); @@ -103,7 +94,6 @@ } private: - base::test::ScopedFeatureList scoped_feature_list_; base::SimpleTestTickClock test_clock_; resource_coordinator::ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_;
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc index f6bf1ed..bf16917 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_interactive_ui_test.cc
@@ -78,17 +78,12 @@ test_clock_.Advance(kShortDelay); } - void SetUp() override { - scoped_feature_list_.InitWithFeaturesAndParameters( - {{performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "true"}, {"time_before_discard", "1h"}}}}, - {}); - - InteractiveBrowserTest::SetUp(); - } - void SetUpOnMainThread() override { InteractiveBrowserTest::SetUpOnMainThread(); + performance_manager::user_tuning::UserPerformanceTuningManager:: + GetInstance() + ->SetHighEfficiencyModeEnabled(true); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(embedded_test_server()->Start()); } @@ -143,7 +138,6 @@ base::SimpleTestTickClock test_clock_; resource_coordinator::ScopedSetTickClockForTesting scoped_set_tick_clock_for_testing_; - base::test::ScopedFeatureList scoped_feature_list_; }; // Tests Discarding on pages with various types of content @@ -564,91 +558,3 @@ }, browser()))); } - -// Tests the functionality of the High Efficiency IPH -class HighEfficiencyInfoIPHInteractiveTest - : public HighEfficiencyInteractiveTest { - public: - HighEfficiencyInfoIPHInteractiveTest() = default; - ~HighEfficiencyInfoIPHInteractiveTest() override = default; - - void SetUp() override { - iph_features_.InitAndEnableFeaturesWithParameters( - {{feature_engagement::kIPHHighEfficiencyInfoModeFeature, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "true"}, {"time_before_discard", "1h"}}}}); - InteractiveBrowserTest::SetUp(); - } - - void SetUpOnMainThread() override { - HighEfficiencyInteractiveTest::SetUpOnMainThread(); - EXPECT_TRUE(user_education::test::WaitForFeatureEngagementReady( - GetFeaturePromoController())); - } - - BrowserFeaturePromoController* GetFeaturePromoController() { - auto* promo_controller = static_cast<BrowserFeaturePromoController*>( - browser()->window()->GetFeaturePromoController()); - return promo_controller; - } - - private: - feature_engagement::test::ScopedIphFeatureList iph_features_; -}; - -// High Efficiency info IPH should close after clicking the "Got It" -// default button -IN_PROC_BROWSER_TEST_F(HighEfficiencyInfoIPHInteractiveTest, - ClosesIPHOnButtonClick) { - RunTestSequence( - InstrumentTab(kFirstTabContents, 0), - NavigateWebContents(kFirstTabContents, GetURL("/title1.html")), - AddInstrumentedTab(kSecondTabContents, GURL(chrome::kChromeUINewTabURL)), - DiscardAndSelectTab(0, kFirstTabContents), - WaitForShow( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), - PressButton(user_education::HelpBubbleView::kDefaultButtonIdForTesting), - WaitForHide( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)); -} - -// High Efficiency info IPH should close and navigates to the Performance -// settings page in a new tab after clicking on the settings non-default button -IN_PROC_BROWSER_TEST_F(HighEfficiencyInfoIPHInteractiveTest, - NavigatesToSettingsPage) { - RunTestSequence( - InstrumentTab(kFirstTabContents, 0), - NavigateWebContents(kFirstTabContents, GetURL("/title1.html")), - AddInstrumentedTab(kSecondTabContents, GetURL("/title1.html")), - DiscardAndSelectTab(0, kFirstTabContents), - WaitForShow( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), - FlushEvents(), - // This needs to be done on a fresh message loop so that the IPH closes - PressButton( - user_education::HelpBubbleView::kFirstNonDefaultButtonIdForTesting), - WaitForHide( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), - Check(base::BindLambdaForTesting( - [=]() { return browser()->tab_strip_model()->GetTabCount() == 3; })), - InstrumentTab(kPerformanceSettingsTab), - WaitForWebContentsReady(kPerformanceSettingsTab, - GURL(chrome::kChromeUIPerformanceSettingsURL))); -} - -// High Efficiency IPH should close when navigating to another tab -IN_PROC_BROWSER_TEST_F(HighEfficiencyInfoIPHInteractiveTest, - ClosesIPHOnTabSwitch) { - RunTestSequence( - InstrumentTab(kFirstTabContents, 0), - NavigateWebContents(kFirstTabContents, GetURL("/title1.html")), - AddInstrumentedTab(kSecondTabContents, GURL(chrome::kChromeUINewTabURL)), - DiscardAndSelectTab(0, kFirstTabContents), - WaitForShow( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting), - FlushEvents(), - // This needs to be done on a fresh message loop so that the IPH closes - SelectTab(kTabStripElementId, 1), - WaitForHide( - user_education::HelpBubbleView::kHelpBubbleElementIdForTesting)); -}
diff --git a/chrome/browser/ui/views/performance_controls/high_efficiency_iph_browsertest.cc b/chrome/browser/ui/views/performance_controls/high_efficiency_iph_browsertest.cc index 06b9ceb..f33d5d0 100644 --- a/chrome/browser/ui/views/performance_controls/high_efficiency_iph_browsertest.cc +++ b/chrome/browser/ui/views/performance_controls/high_efficiency_iph_browsertest.cc
@@ -33,9 +33,7 @@ void SetUp() override { iph_features_.InitAndEnableFeaturesWithParameters( - {{feature_engagement::kIPHHighEfficiencyModeFeature, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "false"}}}}); + {{feature_engagement::kIPHHighEfficiencyModeFeature, {}}}); InProcessBrowserTest::SetUp(); } @@ -61,9 +59,7 @@ views::test::AnyWidgetTestPasskey{}, user_education::HelpBubbleView::kViewClassName); - int tab_count_threshold = - performance_manager::features::kHighEfficiencyModePromoTabCountThreshold - .Get(); + int tab_count_threshold = 10; // The threshold count is a constant. for (int i = 0; i < tab_count_threshold; i++) chrome::AddTabAt(browser(), GURL(), i, true);
diff --git a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc index ff0e8f2..4204cc35 100644 --- a/chrome/browser/ui/views/profiles/profile_management_step_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_management_step_controller.cc
@@ -151,11 +151,6 @@ ~FinishSamlSignInStepController() override { if (finish_flow_callback_.value()) { finish_flow_callback_->Reset(); - - // The profile setup did not continue. Schedule it for deletion. - g_browser_process->profile_manager() - ->GetDeleteProfileHelper() - .ScheduleEphemeralProfileForDeletion(profile_->GetPath()); } }
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc index 7e36d3c..715725b9 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider.cc
@@ -66,15 +66,6 @@ if (callback_) { if (IsInitialized()) { contents()->SetDelegate(nullptr); - - // Schedule the ephemeral profile for deletion if it wasn't deleted yet, - // since it's not needed any more. - if (!profile_path_.has_value() && - !IsProfileDirectoryMarkedForDeletion(profile_->GetPath())) { - g_browser_process->profile_manager() - ->GetDeleteProfileHelper() - .ScheduleEphemeralProfileForDeletion(profile_->GetPath()); - } } ProfileMetrics::LogProfileAddSignInFlowOutcome(
diff --git a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc index a1215acc..da6c4d8 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_dice_sign_in_provider_browsertest.cc
@@ -7,12 +7,17 @@ #include "base/functional/callback_helpers.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" +#include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/nuke_profile_directory_utils.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_attributes_entry.h" +#include "chrome/browser/profiles/profile_attributes_storage.h" +#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/signin/signin_features.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/views/profiles/profile_picker_web_contents_host.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/profile_deletion_observer.h" #include "components/signin/public/base/signin_metrics.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" @@ -79,6 +84,7 @@ IN_PROC_BROWSER_TEST_P(ProfilePickerDiceSignInProviderBrowserTest, SwitchToSignInThenExit) { + ProfileDeletionObserver observer; base::FilePath provider_profile_path; base::RunLoop switch_finished_loop; base::MockCallback<ProfilePickerDiceSignInProvider::SignedInCallback> @@ -115,8 +121,14 @@ switch_finished_loop.Run(); } - // On exit, the provider should schedule the profile it created for deletion. - EXPECT_TRUE(IsProfileDirectoryMarkedForDeletion(provider_profile_path)); + // On exit, the profile it created should be scheduled for deletion since it + // has no more keep alives. + observer.Wait(); + ProfileAttributesEntry* entry = + g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetProfileAttributesWithPath(provider_profile_path); + EXPECT_EQ(entry, nullptr); } IN_PROC_BROWSER_TEST_P(ProfilePickerDiceSignInProviderBrowserTest,
diff --git a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc index 4d92b119..1012c818 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_flow_controller.cc
@@ -143,11 +143,6 @@ ~ProfileCreationSignedInFlowController() override { // Record unfinished signed-in profile creation. if (!is_finishing_) { - // Schedule the profile for deletion, it's not needed any more. - g_browser_process->profile_manager() - ->GetDeleteProfileHelper() - .ScheduleEphemeralProfileForDeletion(profile()->GetPath()); - // TODO(crbug.com/1300109): Consider moving this recording into // ProfilePickerTurnSyncOnDelegate and unify this code with Cancel(). ProfileMetrics::LogProfileAddSignInFlowOutcome( @@ -177,11 +172,6 @@ return; is_finishing_ = true; - - // Schedule the profile for deletion, it's not needed any more. - g_browser_process->profile_manager() - ->GetDeleteProfileHelper() - .ScheduleEphemeralProfileForDeletion(profile()->GetPath()); } void FinishAndOpenBrowser(PostHostClearedCallback callback) override {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index c69ee4c3..4dde8e7 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -32,6 +32,7 @@ #include "chrome/browser/policy/cloud/user_policy_signin_service_factory.h" #include "chrome/browser/policy/profile_policy_connector.h" #include "chrome/browser/policy/profile_policy_connector_builder.h" +#include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h" #include "chrome/browser/profiles/nuke_profile_directory_utils.h" #include "chrome/browser/profiles/profile_attributes_entry.h" #include "chrome/browser/profiles/profile_attributes_storage.h" @@ -50,6 +51,7 @@ #include "chrome/browser/themes/theme_service.h" #include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/profile_ui_test_utils.h" #include "chrome/browser/ui/startup/first_run_service.h" @@ -754,9 +756,11 @@ GetSyncConfirmationURL(), "joe.consumer@gmail.com", "Joe"); // Close the flow with the [X] button. + ProfileDeletionObserver observer; base::FilePath canceled_path = profile_to_cancel->GetPath(); widget()->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked); WaitForPickerClosed(); + observer.Wait(); ProfileAttributesStorage& storage = g_browser_process->profile_manager()->GetProfileAttributesStorage(); @@ -802,8 +806,10 @@ base::FilePath profile_to_cancel_path = profile_to_cancel->GetPath(); // Close the flow with the [X] button. + ProfileDeletionObserver observer; widget()->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked); WaitForPickerClosed(); + observer.Wait(); // The profile entry is deleted. ProfileAttributesEntry* entry = @@ -837,7 +843,7 @@ } IN_PROC_BROWSER_TEST_F(ProfilePickerCreationFlowBrowserTest, - CancelWhileSigningInWithNoOtherWindow) { + PRE_CancelWhileSigningInWithNoOtherWindow) { ASSERT_EQ(1u, BrowserList::GetInstance()->size()); Profile* profile_to_cancel = StartDiceSignIn(); base::FilePath profile_to_cancel_path = profile_to_cancel->GetPath(); @@ -851,17 +857,30 @@ widget()->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked); WaitForPickerClosed(); - // The profile entry is deleted. + // The profile entry is not yet deleted when Chrome is shutting down, but it + // will be deleted at next startup since it is an ephemeral profile. ProfileAttributesEntry* entry = g_browser_process->profile_manager() ->GetProfileAttributesStorage() .GetProfileAttributesWithPath(profile_to_cancel_path); - EXPECT_EQ(entry, nullptr); + EXPECT_NE(entry, nullptr); + EXPECT_TRUE(entry->IsEphemeral()); + ASSERT_EQ(2u, g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetNumberOfProfiles()); // Still no browser window is open. EXPECT_EQ(0u, BrowserList::GetInstance()->size()); } +IN_PROC_BROWSER_TEST_F(ProfilePickerCreationFlowBrowserTest, + CancelWhileSigningInWithNoOtherWindow) { + // There is only one profile left. + ASSERT_EQ(1u, g_browser_process->profile_manager() + ->GetProfileAttributesStorage() + .GetNumberOfProfiles()); +} + // Tests dice-specific logic for keeping track of the new profile color. IN_PROC_BROWSER_TEST_F(ProfilePickerCreationFlowBrowserTest, CreateSignedInProfileDiceReenter) { @@ -1804,12 +1823,14 @@ EXPECT_EQ(ProfilePicker::GetSwitchProfilePath(), other_path); // Simulate clicking on the cancel button. + ProfileDeletionObserver observer; ProfilePickerHandler* handler = profile_picker_handler(); base::Value::List args; handler->HandleCancelProfileSwitch(args); // Check expectations when the profile creation flow is done. WaitForPickerClosed(); + observer.Wait(); // Only one browser should be displayed. EXPECT_EQ(BrowserList::GetInstance()->size(), 1u); @@ -2129,14 +2150,8 @@ EXPECT_FALSE(new_browser->signin_view_controller()->ShowsModalDialog()); } -// TODO(crbug.com/1367031): Test is flaky on Linux and macOS -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) -#define MAYBE_CancelLocalProfileCreation DISABLED_CancelLocalProfileCreation -#else -#define MAYBE_CancelLocalProfileCreation CancelLocalProfileCreation -#endif IN_PROC_BROWSER_TEST_F(ProfilePickerLocalProfileCreationDialogBrowserTest, - MAYBE_CancelLocalProfileCreation) { + CancelLocalProfileCreation) { ASSERT_EQ(1u, BrowserList::GetInstance()->size()); ASSERT_EQ(1u, g_browser_process->profile_manager() ->GetProfileAttributesStorage() @@ -2177,8 +2192,9 @@ // Simulate clicking the "Delete profile" button on the profile customization // dialog. + ProfileDeletionObserver observer; DeleteLocalProfile(dialog_web_contents); - ui_test_utils::WaitForBrowserToClose(new_browser); + observer.Wait(); ASSERT_EQ(1u, g_browser_process->profile_manager() ->GetProfileAttributesStorage()
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc index e37ec03..c7e5705b 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -9,6 +9,8 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_forward.h" +#include "base/metrics/user_metrics.h" +#include "base/strings/strcat.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/feature_engagement/tracker_factory.h" #include "chrome/browser/profiles/profile.h" @@ -345,6 +347,9 @@ prefs::kSidePanelCompanionEntryPinnedToToolbar); pref_service->SetBoolean(prefs::kSidePanelCompanionEntryPinnedToToolbar, !current_state); + base::RecordComputedAction(base::StrCat( + {"SidePanel.Companion.", !current_state ? "Pinned" : "Unpinned", + ".BySidePanelHeaderButton"})); } }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc index 58fce089..d70bd14 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.cc
@@ -8,6 +8,7 @@ #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/metrics/user_metrics.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -66,12 +67,14 @@ } } -void SidePanelToolbarContainer::PinnedSidePanelToolbarButton::Unpin( - int event_flags) { +void SidePanelToolbarContainer::PinnedSidePanelToolbarButton:: + UnpinForContextMenu(int event_flags) { PrefService* pref_service = browser_view_->GetProfile()->GetPrefs(); if (pref_service) { pref_service->SetBoolean(prefs::kSidePanelCompanionEntryPinnedToToolbar, false); + base::RecordAction(base::UserMetricsAction( + "SidePanel.Companion.Unpinned.ByPinnedButtonContextMenu")); } } @@ -81,7 +84,7 @@ dialog_model.AddMenuItem( ui::ImageModel(), l10n_util::GetStringUTF16(IDS_SIDE_PANEL_TOOLBAR_BUTTON_CXMENU_UNPIN), - base::BindRepeating(&PinnedSidePanelToolbarButton::Unpin, + base::BindRepeating(&PinnedSidePanelToolbarButton::UnpinForContextMenu, base::Unretained(this))); return std::make_unique<ui::DialogModelMenuModelAdapter>( dialog_model.Build()); @@ -214,10 +217,14 @@ pinned_entry_buttons_.erase(iter); } -bool SidePanelToolbarContainer::HasPinnedEntryButtonFor(SidePanelEntry::Id id) { - const auto iter = base::ranges::find( - pinned_entry_buttons_, id, [](auto* button) { return button->id(); }); - return iter != pinned_entry_buttons_.end(); +bool SidePanelToolbarContainer::IsPinned(SidePanelEntry::Id id) { + PrefService* pref_service = browser_view_->GetProfile()->GetPrefs(); + if (id == SidePanelEntry::Id::kSearchCompanion && pref_service) { + return HasPinnedEntryButtonFor(id) && + pref_service->GetBoolean( + prefs::kSidePanelCompanionEntryPinnedToToolbar); + } + return false; } void SidePanelToolbarContainer::UpdateSidePanelContainerButtonsState() { @@ -228,6 +235,12 @@ : IDS_TOOLTIP_SIDE_PANEL_SHOW)); } +bool SidePanelToolbarContainer::HasPinnedEntryButtonFor(SidePanelEntry::Id id) { + const auto iter = base::ranges::find( + pinned_entry_buttons_, id, [](auto* button) { return button->id(); }); + return iter != pinned_entry_buttons_.end(); +} + void SidePanelToolbarContainer::ReorderViews() { // The main button is always last. ReorderChildView(main_item(), children().size());
diff --git a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.h b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.h index bc906e8..d0817f47 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.h +++ b/chrome/browser/ui/views/side_panel/side_panel_toolbar_container.h
@@ -39,7 +39,11 @@ std::u16string name, const gfx::VectorIcon& icon); void RemovePinnedEntryButtonFor(SidePanelEntry::Id id); - bool HasPinnedEntryButtonFor(SidePanelEntry::Id id); + + // Returns true if a button exists and is pinned for the given Id. Note, this + // is not an idication of whether the button is currently visible to users, on + // small windows the button could be hidden though technically still "pinned". + bool IsPinned(SidePanelEntry::Id id); void UpdateSidePanelContainerButtonsState(); @@ -60,7 +64,7 @@ SidePanelEntry::Id id() { return id_; } void ButtonPressed(); - void Unpin(int event_flags); + void UnpinForContextMenu(int event_flags); private: std::unique_ptr<ui::MenuModel> CreateMenuModel(); @@ -69,6 +73,10 @@ SidePanelEntry::Id id_; }; + // Indicates whether the button exists, this does not necessarily mean it is + // pinned at this time. + bool HasPinnedEntryButtonFor(SidePanelEntry::Id id); + // Sorts child views to display them in the correct order (pinned buttons, // side panel button). void ReorderViews();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_util.cc b/chrome/browser/ui/views/side_panel/side_panel_util.cc index e284f92..667fed7 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_util.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_util.cc
@@ -41,7 +41,9 @@ std::string GetHistogramNameForId(SidePanelEntry::Id id) { static constexpr auto id_to_histogram_name_map = // Note: once provided the histogram name should not be changed since it - // is persisted to logs. + // is persisted to logs. When adding a new Id please add actions to + // tools/metrics/actions/actions.xml for "SidePanel.[new id name].Shown" + // since we cannot autogenerate this in actions.xml. base::MakeFixedFlatMap<SidePanelEntry::Id, const char*>( {{SidePanelEntry::Id::kReadingList, "ReadingList"}, {SidePanelEntry::Id::kBookmarks, "Bookmarks"}, @@ -55,7 +57,7 @@ {SidePanelEntry::Id::kAboutThisSite, "AboutThisSite"}, {SidePanelEntry::Id::kCustomizeChrome, "CustomizeChrome"}, {SidePanelEntry::Id::kWebView, "WebView"}, - {SidePanelEntry::Id::kSearchCompanion, "SearchCompanion"}, + {SidePanelEntry::Id::kSearchCompanion, "Companion"}, {SidePanelEntry::Id::kExtension, "Extension"}}); auto* i = id_to_histogram_name_map.find(id); DCHECK(i != id_to_histogram_name_map.cend());
diff --git a/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc index 3ebc630..5233bb0a 100644 --- a/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/app_menu_interactive_uitest.cc
@@ -32,8 +32,7 @@ set_open_about_blank_on_browser_launch(true); ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); feature_list_.InitAndEnableFeatures( - {performance_manager::features::kHighEfficiencyModeAvailable, - feature_engagement::kIPHPerformanceNewBadgeFeature}); + {feature_engagement::kIPHPerformanceNewBadgeFeature}); InteractiveBrowserTest::SetUp(); }
diff --git a/chrome/browser/ui/web_applications/web_app_launch_process.cc b/chrome/browser/ui/web_applications/web_app_launch_process.cc index 5ffa79b..4192697 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_process.cc +++ b/chrome/browser/ui/web_applications/web_app_launch_process.cc
@@ -10,9 +10,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/apps/app_service/app_launch_params.h" #include "chrome/browser/apps/app_service/launch_utils.h" -#include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_navigator_params.h" @@ -151,7 +149,6 @@ RecordLaunchMetrics(params_->app_id, params_->container, params_->launch_source, launch_url, web_contents); - MaybeShowProfileSwitchIPH(browser); return web_contents; } @@ -385,15 +382,4 @@ } } -void WebAppLaunchProcess::MaybeShowProfileSwitchIPH(Browser* browser) { -#if !BUILDFLAG(IS_CHROMEOS) - ProfileManager* profile_manager = g_browser_process->profile_manager(); - if (browser && browser->app_controller() && - browser->app_controller()->HasProfileMenuButton() && profile_manager && - profile_manager->GetNumberOfProfiles() > 1) { - browser->window()->MaybeShowProfileSwitchIPH(); - } -#endif -} - } // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_launch_process.h b/chrome/browser/ui/web_applications/web_app_launch_process.h index 4f3707b..cd4c9144 100644 --- a/chrome/browser/ui/web_applications/web_app_launch_process.h +++ b/chrome/browser/ui/web_applications/web_app_launch_process.h
@@ -78,8 +78,6 @@ content::WebContents* web_contents, bool started_new_navigation); - void MaybeShowProfileSwitchIPH(Browser* browser); - const raw_ref<Profile> profile_; const raw_ref<WebAppRegistrar> registrar_; const raw_ref<OsIntegrationManager> os_integration_manager_;
diff --git a/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.cc deleted file mode 100644 index dbafb27..0000000 --- a/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.cc +++ /dev/null
@@ -1,480 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" - -#include "ash/components/arc/arc_prefs.h" -#include "ash/components/arc/arc_util.h" -#include "ash/constants/ash_switches.h" -#include "base/command_line.h" -#include "base/hash/sha1.h" -#include "base/i18n/timezone.h" -#include "chrome/browser/ash/arc/arc_support_host.h" -#include "chrome/browser/ash/arc/arc_util.h" -#include "chrome/browser/ash/arc/optin/arc_optin_preference_handler.h" -#include "chrome/browser/ash/login/screens/arc_terms_of_service_screen.h" -#include "chrome/browser/ash/login/ui/login_display_host.h" -#include "chrome/browser/ash/login/wizard_controller.h" -#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" -#include "chrome/browser/ash/profiles/profile_helper.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/browser_process_platform_part.h" -#include "chrome/browser/consent_auditor/consent_auditor_factory.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/webui/ash/login/gaia_screen_handler.h" -#include "chrome/grit/generated_resources.h" -#include "chromeos/ash/components/network/network_handler.h" -#include "chromeos/ash/components/network/network_state.h" -#include "components/consent_auditor/consent_auditor.h" -#include "components/login/localized_values_builder.h" -#include "components/prefs/pref_service.h" -#include "components/session_manager/core/session_manager.h" -#include "components/session_manager/core/session_manager_observer.h" -#include "components/signin/public/base/consent_level.h" -#include "components/signin/public/identity_manager/identity_manager.h" -#include "components/user_manager/user_manager.h" -#include "content/public/browser/web_contents.h" -#include "content/public/browser/web_ui.h" -#include "ui/base/l10n/l10n_util.h" - -using ArcBackupAndRestoreConsent = - sync_pb::UserConsentTypes::ArcBackupAndRestoreConsent; -using ArcGoogleLocationServiceConsent = - sync_pb::UserConsentTypes::ArcGoogleLocationServiceConsent; -using ArcPlayTermsOfServiceConsent = - sync_pb::UserConsentTypes::ArcPlayTermsOfServiceConsent; - -using sync_pb::UserConsentTypes; - -namespace ash { - -ArcTermsOfServiceScreenHandler::ArcTermsOfServiceScreenHandler() - : BaseScreenHandler(kScreenId), - is_child_account_( - user_manager::UserManager::Get()->IsLoggedInAsChildUser()) {} - -ArcTermsOfServiceScreenHandler::~ArcTermsOfServiceScreenHandler() { - OobeUI* oobe_ui = GetOobeUI(); - if (oobe_ui) - oobe_ui->RemoveObserver(this); - if (network_time_zone_observing_) { - network_time_zone_observing_ = false; - system::TimezoneSettings::GetInstance()->RemoveObserver(this); - } - if (session_manager_observing_ && session_manager::SessionManager::Get()) { - session_manager_observing_ = false; - session_manager::SessionManager::Get()->RemoveObserver(this); - } - for (auto& observer : observer_list_) - observer.OnViewDestroyed(this); -} - -void ArcTermsOfServiceScreenHandler::RegisterMessages() { - BaseScreenHandler::RegisterMessages(); - - AddCallback("arcTermsOfServiceAccept", - &ArcTermsOfServiceScreenHandler::HandleAccept); -} - -void ArcTermsOfServiceScreenHandler::MaybeLoadPlayStoreToS(bool is_preload) { - if (is_preload) { - const NetworkState* default_network = - NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); - if (!default_network) - return; - - policy::BrowserPolicyConnectorAsh* policy_connector = - g_browser_process->platform_part()->browser_policy_connector_ash(); - bool is_managed = policy_connector->IsDeviceEnterpriseManaged(); - if (is_managed && !arc::IsArcTermsOfServiceOobeNegotiationNeeded()) - return; - } - - // If `loadPlayStoreToS` in the JS side was called before, ARC++ ToS will - // only load when the country code has been changed. - const std::string country_code = base::CountryCodeForCurrentTimezone(); - CallExternalAPI("loadPlayStoreToS", country_code); -} - -void ArcTermsOfServiceScreenHandler::OnCurrentScreenChanged( - OobeScreenId current_screen, - OobeScreenId new_screen) { - if (new_screen != GaiaView::kScreenId) - return; - - MaybeLoadPlayStoreToS(/*is_preload=*/true); - StartNetworkAndTimeZoneObserving(); - StartSessionManagerObserving(); -} - -void ArcTermsOfServiceScreenHandler::TimezoneChanged( - const icu::TimeZone& timezone) { - MaybeLoadPlayStoreToS(/*is_preload=*/true); -} - -void ArcTermsOfServiceScreenHandler::DefaultNetworkChanged( - const NetworkState* network) { - MaybeLoadPlayStoreToS(/*is_preload=*/true); -} - -void ArcTermsOfServiceScreenHandler::OnUserProfileLoaded( - const AccountId& account_id) { - MaybeLoadPlayStoreToS(/*is_preload=*/true); -} - -void ArcTermsOfServiceScreenHandler::DeclareLocalizedValues( - ::login::LocalizedValuesBuilder* builder) { - builder->Add("arcTermsOfServiceScreenHeading", IDS_ARC_OOBE_TERMS_HEADING); - builder->Add("arcTermsOfServiceScreenHeadingForChild", - IDS_ARC_OOBE_TERMS_HEADING_CHILD); - builder->Add("arcTermsOfServiceScreenDescription", - IDS_ARC_OOBE_TERMS_DESCRIPTION); - builder->Add("arcTermsOfServiceScreenDescriptionForChild", - IDS_ARC_OOBE_TERMS_DESCRIPTION_CHILD); - builder->Add("arcTermsOfServiceLoading", IDS_ARC_OOBE_TERMS_LOADING); - builder->Add("arcTermsOfServiceErrorTitle", - IDS_OOBE_GENERIC_FATAL_ERROR_TITLE); - builder->Add("arcTermsOfServiceErrorMessage", IDS_ARC_OOBE_TERMS_LOAD_ERROR); - builder->Add("arcTermsOfServiceRetryButton", IDS_ARC_OOBE_TERMS_BUTTON_RETRY); - builder->Add("arcTermsOfServiceAcceptButton", - IDS_ARC_OOBE_TERMS_BUTTON_ACCEPT); - builder->Add("arcTermsOfServiceAcceptAndContinueButton", - IDS_ARC_OOBE_TERMS_BUTTON_ACCEPT_AND_CONTINUE); - builder->Add("arcTermsOfServiceNextButton", - IDS_ARC_OPT_IN_DIALOG_BUTTON_NEXT); - builder->Add("arcPolicyLink", IDS_ARC_OPT_IN_PRIVACY_POLICY_LINK); - builder->Add("arcTextBackupRestore", is_child_account_ - ? IDS_ARC_OOBE_BACKUP_RESTORE_CHILD - : IDS_ARC_OOBE_BACKUP_RESTORE); - builder->Add("arcTextLocationService", - is_child_account_ ? IDS_ARC_OOBE_LOCATION_SETTING_CHILD - : IDS_ARC_OOBE_LOCATION_SETTING); - builder->Add("arcTextPaiService", IDS_ARC_OOBE_PAI); - builder->Add("arcTextGoogleServiceConfirmation", - IDS_ARC_OPT_IN_GOOGLE_SERVICE_CONFIRMATION); - builder->Add("arcTextReviewSettings", IDS_ARC_REVIEW_SETTINGS); - builder->Add("arcTextMetricsEnabled", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_ENABLED); - builder->Add("arcTextMetricsDisabled", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_DISABLED); - builder->Add("arcTextMetricsManagedEnabled", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_MANAGED_ENABLED); - builder->Add("arcTextMetricsManagedDisabled", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_MANAGED_DISABLED); - builder->Add("arcTextMetricsEnabledChild", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_ENABLED_CHILD); - builder->Add("arcTextMetricsDisabledChild", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_DISABLED_CHILD); - builder->Add("arcTextMetricsManagedEnabledChild", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_MANAGED_ENABLED_CHILD); - builder->Add("arcTextMetricsManagedDisabledChild", - IDS_ARC_OOBE_TERMS_DIALOG_METRICS_MANAGED_DISABLED_CHILD); - builder->Add("arcTextMetricsDemoApps", IDS_ARC_OOBE_TERMS_DIALOG_DEMO_APPS); - builder->Add("arcAcceptAndContinueGoogleServiceConfirmation", - IDS_ARC_OPT_IN_ACCEPT_AND_CONTINUE_GOOGLE_SERVICE_CONFIRMATION); - builder->Add("arcLearnMoreStatisticsTitle", - IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_TITLE); - builder->Add("arcLearnMoreStatisticsP1", - is_child_account_ ? IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_CHILD_P1 - : IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_P1); - builder->Add("arcLearnMoreStatisticsP2", - is_child_account_ ? IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_CHILD_P2 - : IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_P2); - builder->Add("arcLearnMoreStatisticsP3", - is_child_account_ ? IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_CHILD_P3 - : IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_P3); - builder->Add("arcLearnMoreStatisticsP4", - is_child_account_ ? IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_CHILD_P4 - : IDS_ARC_OPT_IN_LEARN_MORE_STATISTICS_P4); - builder->Add("arcLearnMoreLocationServiceTitle", - IDS_ARC_OPT_IN_LEARN_MORE_LOCATION_SERVICES_TITLE); - builder->Add("arcLearnMoreLocationServiceP1", - is_child_account_ - ? IDS_ARC_OPT_IN_LEARN_MORE_LOCATION_SERVICES_CHILD_P1 - : IDS_ARC_OPT_IN_LEARN_MORE_LOCATION_SERVICES_P1); - builder->Add("arcLearnMoreLocationServiceP2", - is_child_account_ - ? IDS_ARC_OPT_IN_LEARN_MORE_LOCATION_SERVICES_CHILD_P2 - : IDS_ARC_OPT_IN_LEARN_MORE_LOCATION_SERVICES_P2); - builder->Add("arcLearnMoreBackupAndRestoreTitle", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_TITLE); - builder->Add("arcLearnMoreBackupAndRestoreP1", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_P1); - builder->Add("arcLearnMoreBackupAndRestoreP2", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_P2); - builder->Add("arcLearnMoreBackupAndRestoreP3", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_P3); - builder->Add("arcLearnMoreBackupAndRestoreP4", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_P4); - builder->Add("arcLearnMoreBackupAndRestoreP5", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_P5); - builder->Add("arcLearnMoreBackupAndRestoreChildP1", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_CHILD_P1); - builder->Add("arcLearnMoreBackupAndRestoreChildP2", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_CHILD_P2); - builder->Add("arcLearnMoreBackupAndRestoreChildP3", - IDS_ARC_OPT_IN_LEARN_MORE_BACKUP_AND_RESTORE_CHILD_P3); - builder->Add("arcLearnMorePaiServiceTitle", - IDS_ARC_OPT_IN_LEARN_MORE_PAI_SERVICE_TITLE); - builder->Add("arcLearnMorePaiService", IDS_ARC_OOBE_LEARN_MORE_PAI_SERVICE); - builder->Add("arcOverlayClose", IDS_ARC_OOBE_TERMS_POPUP_HELP_CLOSE_BUTTON); - builder->Add("oobeModalDialogClose", IDS_CHROMEOS_OOBE_CLOSE_DIALOG); - builder->Add("arcOverlayLoading", IDS_ARC_POPUP_HELP_LOADING); - builder->Add("arcLearnMoreText", IDS_ARC_OPT_IN_DIALOG_LEARN_MORE_LINK_TEXT); - - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kArcTosHostForTests)) { - builder->Add("arcTosHostNameForTesting", - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kArcTosHostForTests)); - } -} - -void ArcTermsOfServiceScreenHandler::OnMetricsModeChanged(bool enabled, - bool managed) { - const Profile* const profile = ProfileManager::GetActiveUserProfile(); - CHECK(profile); - - const user_manager::User* user = - ProfileHelper::Get()->GetUserByProfile(profile); - CHECK(user); - - const AccountId owner = user_manager::UserManager::Get()->GetOwnerAccountId(); - - // Owner may not be set in case of initial account setup. Note, in case of - // enterprise enrolled devices owner is always empty and we need to account - // managed flag. - const bool owner_profile = !owner.is_valid() || user->GetAccountId() == owner; - - std::string message; - if (owner_profile && !managed) { - if (is_child_account_) { - message = enabled ? "arcTextMetricsEnabledChild" - : "arcTextMetricsDisabledChild"; - } else { - message = enabled ? "arcTextMetricsEnabled" : "arcTextMetricsDisabled"; - } - } else { - if (is_child_account_) { - message = enabled ? "arcTextMetricsManagedEnabledChild" - : "arcTextMetricsManagedDisabledChild"; - } else { - message = enabled ? "arcTextMetricsManagedEnabled" - : "arcTextMetricsManagedDisabled"; - } - } - CallExternalAPI("setMetricsMode", message, true); -} - -void ArcTermsOfServiceScreenHandler::OnBackupAndRestoreModeChanged( - bool enabled, - bool managed) { - backup_restore_managed_ = managed; - CallExternalAPI("setBackupAndRestoreMode", enabled, managed); -} - -void ArcTermsOfServiceScreenHandler::OnLocationServicesModeChanged( - bool enabled, - bool managed) { - location_services_managed_ = managed; - CallExternalAPI("setLocationServicesMode", enabled, managed); -} - -void ArcTermsOfServiceScreenHandler::AddObserver( - ArcTermsOfServiceScreenViewObserver* observer) { - observer_list_.AddObserver(observer); -} - -void ArcTermsOfServiceScreenHandler::RemoveObserver( - ArcTermsOfServiceScreenViewObserver* observer) { - observer_list_.RemoveObserver(observer); -} - -void ArcTermsOfServiceScreenHandler::Show() { - was_shown_ = true; - // Demo mode setup flow requires different variant of Play Store terms. It - // does not allow to skip, but instead has back button. Some options are not - // displayed, because they are not relevant for demo mode usage. - if (arc::IsArcDemoModeSetupFlow()) { - DoShowForDemoModeSetup(); - } else { - DoShow(); - } -} - -void ArcTermsOfServiceScreenHandler::Hide() { - if (network_time_zone_observing_) { - network_time_zone_observing_ = false; - network_state_handler_observer_.Reset(); - system::TimezoneSettings::GetInstance()->RemoveObserver(this); - } - if (session_manager_observing_ && session_manager::SessionManager::Get()) { - session_manager_observing_ = false; - session_manager::SessionManager::Get()->RemoveObserver(this); - } - pref_handler_.reset(); -} - -void ArcTermsOfServiceScreenHandler::StartNetworkAndTimeZoneObserving() { - if (network_time_zone_observing_) - return; - - network_state_handler_observer_.Observe( - NetworkHandler::Get()->network_state_handler()); - system::TimezoneSettings::GetInstance()->AddObserver(this); - network_time_zone_observing_ = true; -} - -void ArcTermsOfServiceScreenHandler::StartSessionManagerObserving() { - if (session_manager_observing_ || !session_manager::SessionManager::Get()) - return; - - session_manager::SessionManager::Get()->AddObserver(this); - session_manager_observing_ = true; -} - -void ArcTermsOfServiceScreenHandler::InitAfterJavascriptAllowed() { - if (!was_shown_) { - // Send time zone information as soon as possible to able to pre-load the - // Play Store ToS. - GetOobeUI()->AddObserver(this); - return; - } -} - -void ArcTermsOfServiceScreenHandler::DoShow() { - Profile* profile = ProfileManager::GetActiveUserProfile(); - CHECK(profile); - - CallExternalAPI("clearDemoMode"); - - // Enable ARC to match ArcSessionManager logic. ArcSessionManager expects that - // ARC is enabled (prefs::kArcEnabled = true) on showing Terms of Service. If - // user accepts ToS then prefs::kArcEnabled is left activated. If user skips - // ToS then prefs::kArcEnabled is automatically reset in ArcSessionManager. - arc::SetArcPlayStoreEnabledForProfile(profile, true); - - action_taken_ = false; - - ShowInWebUI(); - arc_managed_ = arc::IsArcPlayStoreEnabledPreferenceManagedForProfile(profile); - is_child_account_ = user_manager::UserManager::Get()->IsLoggedInAsChildUser(); - CallExternalAPI("setArcManaged", arc_managed_, is_child_account_); - - MaybeLoadPlayStoreToS(/*is_preload=*/false); - StartNetworkAndTimeZoneObserving(); - - pref_handler_ = std::make_unique<arc::ArcOptInPreferenceHandler>( - this, profile->GetPrefs()); - pref_handler_->Start(); -} - -void ArcTermsOfServiceScreenHandler::DoShowForDemoModeSetup() { - DCHECK(arc::IsArcDemoModeSetupFlow()); - - CallExternalAPI("setupForDemoMode"); - action_taken_ = false; - ShowInWebUI(); - MaybeLoadPlayStoreToS(/*is_preload=*/false); - StartNetworkAndTimeZoneObserving(); -} - -bool ArcTermsOfServiceScreenHandler::NeedDispatchEventOnAction() { - if (action_taken_) - return false; - action_taken_ = true; - return true; -} - -void ArcTermsOfServiceScreenHandler::RecordConsents( - const std::string& tos_content, - bool record_tos_consent, - bool tos_accepted, - bool record_backup_consent, - bool backup_accepted, - bool record_location_consent, - bool location_accepted) { - Profile* profile = ProfileManager::GetActiveUserProfile(); - consent_auditor::ConsentAuditor* consent_auditor = - ConsentAuditorFactory::GetForProfile(profile); - auto* identity_manager = IdentityManagerFactory::GetForProfile(profile); - // The account may or may not have consented to browser sync. - DCHECK(identity_manager->HasPrimaryAccount(signin::ConsentLevel::kSignin)); - const CoreAccountId account_id = - identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin); - - ArcPlayTermsOfServiceConsent play_consent; - play_consent.set_status(tos_accepted ? UserConsentTypes::GIVEN - : UserConsentTypes::NOT_GIVEN); - play_consent.set_confirmation_grd_id(IDS_ARC_OOBE_TERMS_BUTTON_ACCEPT); - play_consent.set_consent_flow(ArcPlayTermsOfServiceConsent::SETUP); - if (record_tos_consent) { - play_consent.set_play_terms_of_service_text_length(tos_content.length()); - play_consent.set_play_terms_of_service_hash( - base::SHA1HashString(tos_content)); - } - consent_auditor->RecordArcPlayConsent(account_id, play_consent); - - if (record_backup_consent) { - ArcBackupAndRestoreConsent backup_and_restore_consent; - backup_and_restore_consent.set_confirmation_grd_id( - IDS_ARC_OOBE_TERMS_BUTTON_ACCEPT); - backup_and_restore_consent.add_description_grd_ids( - is_child_account_ ? IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE_CHILD - : IDS_ARC_OPT_IN_DIALOG_BACKUP_RESTORE); - backup_and_restore_consent.set_status(backup_accepted - ? UserConsentTypes::GIVEN - : UserConsentTypes::NOT_GIVEN); - - consent_auditor->RecordArcBackupAndRestoreConsent( - account_id, backup_and_restore_consent); - } - - if (record_location_consent) { - ArcGoogleLocationServiceConsent location_service_consent; - location_service_consent.set_confirmation_grd_id( - IDS_ARC_OOBE_TERMS_BUTTON_ACCEPT); - location_service_consent.add_description_grd_ids( - is_child_account_ ? IDS_ARC_OPT_IN_LOCATION_SETTING - : IDS_ARC_OPT_IN_LOCATION_SETTING); - location_service_consent.set_status(location_accepted - ? UserConsentTypes::GIVEN - : UserConsentTypes::NOT_GIVEN); - - consent_auditor->RecordArcGoogleLocationServiceConsent( - account_id, location_service_consent); - } -} - -void ArcTermsOfServiceScreenHandler::HandleAccept( - bool enable_backup_restore, - bool enable_location_services, - bool review_arc_settings, - const std::string& tos_content) { - if (arc::IsArcDemoModeSetupFlow()) { - for (auto& observer : observer_list_) - observer.OnAccept(false); - // TODO(agawronska): Record consent. - return; - } - - if (!NeedDispatchEventOnAction()) - return; - - pref_handler_->EnableBackupRestore(enable_backup_restore); - pref_handler_->EnableLocationService(enable_location_services); - - // Record consents as accepted or not accepted as appropriate for consents - // that are under user control when the user completes ARC setup. - RecordConsents(tos_content, !arc_managed_, /*tos_accepted=*/true, - !backup_restore_managed_, enable_backup_restore, - !location_services_managed_, enable_location_services); - - for (auto& observer : observer_list_) - observer.OnAccept(review_arc_settings); -} - -} // namespace ash
diff --git a/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h b/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h deleted file mode 100644 index f3357176..0000000 --- a/chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h +++ /dev/null
@@ -1,202 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ARC_TERMS_OF_SERVICE_SCREEN_HANDLER_H_ -#define CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ARC_TERMS_OF_SERVICE_SCREEN_HANDLER_H_ - -#include <memory> -#include <string> - -#include "base/memory/weak_ptr.h" -#include "base/observer_list.h" -#include "base/scoped_observation.h" -#include "chrome/browser/ash/arc/optin/arc_optin_preference_handler_observer.h" -#include "chrome/browser/ui/webui/ash/login/base_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/oobe_ui.h" -#include "chromeos/ash/components/network/network_state_handler.h" -#include "chromeos/ash/components/network/network_state_handler_observer.h" -#include "chromeos/ash/components/settings/timezone_settings.h" -#include "components/session_manager/core/session_manager_observer.h" - -namespace arc { -class ArcOptInPreferenceHandler; -} - -namespace ash { - -class ArcTermsOfServiceScreen; -class ArcTermsOfServiceScreenView; - -class ArcTermsOfServiceScreenViewObserver { - public: - ArcTermsOfServiceScreenViewObserver( - const ArcTermsOfServiceScreenViewObserver&) = delete; - ArcTermsOfServiceScreenViewObserver& operator=( - const ArcTermsOfServiceScreenViewObserver&) = delete; - - virtual ~ArcTermsOfServiceScreenViewObserver() = default; - - // Called when the user accepts the PlayStore Terms of Service. - virtual void OnAccept(bool review_arc_settings) = 0; - - // Called when the view is destroyed so there is no dead reference to it. - virtual void OnViewDestroyed(ArcTermsOfServiceScreenView* view) = 0; - - protected: - ArcTermsOfServiceScreenViewObserver() = default; -}; - -class ArcTermsOfServiceScreenView - : public base::SupportsWeakPtr<ArcTermsOfServiceScreenView> { - public: - inline constexpr static StaticOobeScreenId kScreenId{ - "arc-tos", "ArcTermsOfServiceScreen"}; - - ArcTermsOfServiceScreenView(const ArcTermsOfServiceScreenView&) = delete; - ArcTermsOfServiceScreenView& operator=(const ArcTermsOfServiceScreenView&) = - delete; - - virtual ~ArcTermsOfServiceScreenView() = default; - - // Adds/Removes observer for view. - virtual void AddObserver(ArcTermsOfServiceScreenViewObserver* observer) = 0; - virtual void RemoveObserver( - ArcTermsOfServiceScreenViewObserver* observer) = 0; - - // Shows the contents of the screen. - virtual void Show() = 0; - - // Hides the contents of the screen. - virtual void Hide() = 0; - - protected: - ArcTermsOfServiceScreenView() = default; -}; - -// The sole implementation of the ArcTermsOfServiceScreenView, using WebUI. -class ArcTermsOfServiceScreenHandler - : public BaseScreenHandler, - public ArcTermsOfServiceScreenView, - public arc::ArcOptInPreferenceHandlerObserver, - public OobeUI::Observer, - public system::TimezoneSettings::Observer, - public NetworkStateHandlerObserver, - public session_manager::SessionManagerObserver { - public: - using TView = ArcTermsOfServiceScreenView; - - ArcTermsOfServiceScreenHandler(); - - ArcTermsOfServiceScreenHandler(const ArcTermsOfServiceScreenHandler&) = - delete; - ArcTermsOfServiceScreenHandler& operator=( - const ArcTermsOfServiceScreenHandler&) = delete; - - ~ArcTermsOfServiceScreenHandler() override; - - // content::WebUIMessageHandler: - void RegisterMessages() override; - - // BaseScreenHandler: - void DeclareLocalizedValues( - ::login::LocalizedValuesBuilder* builder) override; - - // ArcTermsOfServiceScreenView: - void AddObserver(ArcTermsOfServiceScreenViewObserver* observer) override; - void RemoveObserver(ArcTermsOfServiceScreenViewObserver* observer) override; - void Show() override; - void Hide() override; - - // OobeUI::Observer: - void OnCurrentScreenChanged(OobeScreenId current_screen, - OobeScreenId new_screen) override; - void OnDestroyingOobeUI() override {} - - // system::TimezoneSettings::Observer: - void TimezoneChanged(const icu::TimeZone& timezone) override; - - // NetworkStateHandlerObserver: - void DefaultNetworkChanged(const NetworkState* network) override; - - private: - // BaseScreenHandler: - void InitAfterJavascriptAllowed() override; - - // session_manager::SessionManagerObserver: - void OnUserProfileLoaded(const AccountId& account_id) override; - - // Shows default terms of service screen. - void DoShow(); - - // Shows screen variant for demo mode setup flow. The flow is part of OOBE and - // runs before any user is created or before device local account is - // configured for Public Session. - void DoShowForDemoModeSetup(); - - void HandleAccept(bool enable_backup_restore, - bool enable_location_services, - bool review_arc_settings, - const std::string& tos_content); - - // Loads Play Store ToS content. - // If `is_preload` is set, skip loading if one of the following conditions - // applies: - // * A default network does not exist. - // * The device is managed and ARC++ negotiation is not needed. - void MaybeLoadPlayStoreToS(bool is_preload); - - void StartNetworkAndTimeZoneObserving(); - - void StartSessionManagerObserving(); - - // Handles the recording of consent given or not given after the user chooses - // to skip or accept. - void RecordConsents(const std::string& tos_content, - bool record_tos_content, - bool tos_accepted, - bool record_backup_consent, - bool backup_accepted, - bool record_location_consent, - bool location_accepted); - - bool NeedDispatchEventOnAction(); - - // arc::ArcOptInPreferenceHandlerObserver: - void OnMetricsModeChanged(bool enabled, bool managed) override; - void OnBackupAndRestoreModeChanged(bool enabled, bool managed) override; - void OnLocationServicesModeChanged(bool enabled, bool managed) override; - - base::ObserverList<ArcTermsOfServiceScreenViewObserver, true>::Unchecked - observer_list_; - - bool was_shown_ = false; - - // Indicates that we already started network and time zone observing. - bool network_time_zone_observing_ = false; - - // Indicates that we already started observing the session manager. - bool session_manager_observing_ = false; - - // To filter out duplicate notifications from html. - bool action_taken_ = false; - - // To track if ARC preference is managed. - bool arc_managed_ = false; - - // To track if optional features are managed preferences. - bool backup_restore_managed_ = false; - bool location_services_managed_ = false; - - // To track if a child account is being set up. - bool is_child_account_; - - base::ScopedObservation<NetworkStateHandler, NetworkStateHandlerObserver> - network_state_handler_observer_{this}; - - std::unique_ptr<arc::ArcOptInPreferenceHandler> pref_handler_; -}; - -} // namespace ash - -#endif // CHROME_BROWSER_UI_WEBUI_ASH_LOGIN_ARC_TERMS_OF_SERVICE_SCREEN_HANDLER_H_
diff --git a/chrome/browser/ui/webui/ash/login/multidevice_setup_screen_handler.cc b/chrome/browser/ui/webui/ash/login/multidevice_setup_screen_handler.cc index f161963..c45d2020 100644 --- a/chrome/browser/ui/webui/ash/login/multidevice_setup_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/multidevice_setup_screen_handler.cc
@@ -21,6 +21,7 @@ void MultiDeviceSetupScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { multidevice_setup::AddLocalizedValuesToBuilder(builder); + builder->Add("arcOverlayClose", IDS_ARC_OOBE_TERMS_POPUP_HELP_CLOSE_BUTTON); } void MultiDeviceSetupScreenHandler::Show() {
diff --git a/chrome/browser/ui/webui/ash/login/oobe_ui.cc b/chrome/browser/ui/webui/ash/login/oobe_ui.cc index 0657787..e882c846 100644 --- a/chrome/browser/ui/webui/ash/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/ash/login/oobe_ui.cc
@@ -47,7 +47,6 @@ #include "chrome/browser/ui/webui/ash/login/active_directory_password_change_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_downloading_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/app_launch_splash_screen_handler.h" -#include "chrome/browser/ui/webui/ash/login/arc_terms_of_service_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/arc_vm_data_migration_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/assistant_optin_flow_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/auto_enrollment_check_screen_handler.h" @@ -408,8 +407,6 @@ AddScreenHandler(std::make_unique<SyncConsentScreenHandler>()); - AddScreenHandler(std::make_unique<ArcTermsOfServiceScreenHandler>()); - if (base::FeatureList::IsEnabled(arc::kEnableArcVmDataMigration)) { AddScreenHandler(std::make_unique<ArcVmDataMigrationScreenHandler>()); }
diff --git a/chrome/browser/ui/webui/browser_command/browser_command_handler.cc b/chrome/browser/ui/webui/browser_command/browser_command_handler.cc index aca617f..6df94fb 100644 --- a/chrome/browser/ui/webui/browser_command/browser_command_handler.cc +++ b/chrome/browser/ui/webui/browser_command/browser_command_handler.cc
@@ -99,11 +99,7 @@ can_execute = true; break; case Command::kOpenPerformanceSettings: - can_execute = - base::FeatureList::IsEnabled( - performance_manager::features::kBatterySaverModeAvailable) || - base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable); + can_execute = true; break; case Command::kOpenNTPAndStartCustomizeChromeTutorial: can_execute =
diff --git a/chrome/browser/ui/webui/browser_command/browser_command_handler_unittest.cc b/chrome/browser/ui/webui/browser_command/browser_command_handler_unittest.cc index 4acfc70..78bce1c 100644 --- a/chrome/browser/ui/webui/browser_command/browser_command_handler_unittest.cc +++ b/chrome/browser/ui/webui/browser_command/browser_command_handler_unittest.cc
@@ -521,45 +521,20 @@ TEST_F(BrowserCommandHandlerTest, OpenPerformanceSettings) { { - // Cannot open performance settings if the features enabling the page are - // not enabled. - base::test::ScopedFeatureList disabled; - disabled.InitWithFeaturesAndParameters( - /*enabled_features=*/{}, - /*disabled_features=*/{ - {performance_manager::features::kBatterySaverModeAvailable}, - {performance_manager::features::kHighEfficiencyModeAvailable}}); - EXPECT_FALSE(CanExecuteCommand(Command::kOpenPerformanceSettings)); - } - { - // Can open the performance settings if at least one feature is enabled. - base::test::ScopedFeatureList battery_saver; - battery_saver.InitWithFeaturesAndParameters( - /*enabled_features=*/{{performance_manager::features:: - kBatterySaverModeAvailable, - {}}}, - /*disabled_features=*/{ - {performance_manager::features::kHighEfficiencyModeAvailable}}); - EXPECT_TRUE(CanExecuteCommand(Command::kOpenPerformanceSettings)); - } - { - // Can open the performance settings if at least one feature is enabled. + // Can open the performance settings if battery saver is unavailable. base::test::ScopedFeatureList high_efficiency; high_efficiency.InitWithFeaturesAndParameters( - /*enabled_features=*/{{performance_manager::features:: - kHighEfficiencyModeAvailable, - {}}}, + /*enabled_features=*/{}, /*disabled_features=*/{ {performance_manager::features::kBatterySaverModeAvailable}}); EXPECT_TRUE(CanExecuteCommand(Command::kOpenPerformanceSettings)); } { - // Can open with both features enabled. + // Can open if battery saver is available. base::test::ScopedFeatureList enabled; enabled.InitWithFeaturesAndParameters( /*enabled_features=*/ - {{performance_manager::features::kBatterySaverModeAvailable, {}}, - {performance_manager::features::kHighEfficiencyModeAvailable, {}}}, + {{performance_manager::features::kBatterySaverModeAvailable, {}}}, /*disabled_features=*/{}); EXPECT_TRUE(CanExecuteCommand(Command::kOpenPerformanceSettings));
diff --git a/chrome/browser/ui/webui/password_manager/promo_card.cc b/chrome/browser/ui/webui/password_manager/promo_card.cc index a9750429..82df89a 100644 --- a/chrome/browser/ui/webui/password_manager/promo_card.cc +++ b/chrome/browser/ui/webui/password_manager/promo_card.cc
@@ -134,8 +134,7 @@ extensions::PasswordsPrivateDelegate* delegate) : PromoCardInterface(kCheckupPromoId, prefs) { CHECK(delegate); - delegate->GetSavedPasswordsList(base::BindOnce( - &PasswordCheckupPromo::OnPasswordsReceived, weak_factory_.GetWeakPtr())); + delegate_ = delegate; } PasswordCheckupPromo::~PasswordCheckupPromo() = default; @@ -145,7 +144,7 @@ } bool PasswordCheckupPromo::ShouldShowPromo() const { - if (!has_saved_passwords_) { + if (delegate_->GetCredentialGroups().empty()) { return false; } // If promo card was dismissed or shown already for kPromoDisplayLimit times, @@ -171,12 +170,6 @@ IDS_PASSWORD_MANAGER_UI_CHECKUP_PROMO_CARD_ACTION); } -void PasswordCheckupPromo::OnPasswordsReceived( - const std::vector<extensions::api::passwords_private::PasswordUiEntry>& - passwords) { - has_saved_passwords_ = !passwords.empty(); -} - WebPasswordManagerPromo::WebPasswordManagerPromo( PrefService* prefs, const syncer::SyncService* sync_service)
diff --git a/chrome/browser/ui/webui/password_manager/promo_card.h b/chrome/browser/ui/webui/password_manager/promo_card.h index 9d27b2c..75722ce1 100644 --- a/chrome/browser/ui/webui/password_manager/promo_card.h +++ b/chrome/browser/ui/webui/password_manager/promo_card.h
@@ -17,9 +17,6 @@ namespace extensions { class PasswordsPrivateDelegate; -namespace api::passwords_private { -struct PasswordUiEntry; -} // namespace api::passwords_private } // namespace extensions namespace syncer { @@ -91,14 +88,7 @@ std::u16string GetDescription() const override; std::u16string GetActionButtonText() const override; - void OnPasswordsReceived( - const std::vector<extensions::api::passwords_private::PasswordUiEntry>& - passwords); - - bool has_saved_passwords_ = false; - - // `weak_factory_` is used for all callback uses. - base::WeakPtrFactory<PasswordCheckupPromo> weak_factory_{this}; + raw_ptr<extensions::PasswordsPrivateDelegate> delegate_ = nullptr; }; // Promoting web version of Password Manager. Has a link to the website in the
diff --git a/chrome/browser/ui/webui/password_manager/promo_card_unittest.cc b/chrome/browser/ui/webui/password_manager/promo_card_unittest.cc index b38f3112..775db91 100644 --- a/chrome/browser/ui/webui/password_manager/promo_card_unittest.cc +++ b/chrome/browser/ui/webui/password_manager/promo_card_unittest.cc
@@ -7,10 +7,12 @@ #include <memory> #include "base/json/values_util.h" +#include "base/test/bind.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h" #include "chrome/browser/extensions/api/passwords_private/passwords_private_delegate_factory.h" +#include "chrome/browser/password_manager/affiliation_service_factory.h" #include "chrome/browser/password_manager/password_manager_test_util.h" #include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/web_applications/test/fake_web_app_provider.h" @@ -19,8 +21,10 @@ #include "chrome/browser/web_applications/web_app_registrar.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/password_manager/core/browser/affiliation/fake_affiliation_service.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/test_password_store.h" +#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_registry.h" #include "components/prefs/pref_registry_simple.h" @@ -104,6 +108,10 @@ void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); profile_store_ = CreateAndUseTestPasswordStore(profile()); + AffiliationServiceFactory::GetInstance()->SetTestingSubclassFactoryAndUse( + profile(), base::BindRepeating([](content::BrowserContext*) { + return std::make_unique<password_manager::FakeAffiliationService>(); + })); } PrefService* pref_service() { return profile()->GetPrefs(); } @@ -207,6 +215,7 @@ public: void SetUp() override { PromoCardBaseTest::SetUp(); + feature_list_.InitAndEnableFeature(features::kPasswordsGrouping); delegate_ = extensions::PasswordsPrivateDelegateFactory::GetForBrowserContext( profile(), true); @@ -229,6 +238,7 @@ } private: + base::test::ScopedFeatureList feature_list_; scoped_refptr<extensions::PasswordsPrivateDelegate> delegate_; };
diff --git a/chrome/browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc b/chrome/browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc index 25dc0833..f7caa81 100644 --- a/chrome/browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc +++ b/chrome/browser/ui/webui/settings/ash/os_settings_recovery_browsertest.cc
@@ -3,11 +3,22 @@ // found in the LICENSE file. #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ui/webui/settings/ash/os_settings_lock_screen_browser_test_base.h" #include "chrome/test/data/webui/settings/chromeos/test_api.test-mojom-test-utils.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_types.h" #include "content/public/test/browser_test.h" +namespace { + +const char kRecoveryFactorBehaviorPolicy[] = "RecoveryFactorBehavior"; + +} + namespace ash::settings { class OSSettingsRecoveryTest : public OSSettingsLockScreenBrowserTestBase {}; @@ -133,4 +144,81 @@ EXPECT_TRUE(cryptohome_.HasRecoveryFactor(GetAccountId())); } +struct CryptohomeRecoveryPolicySetting { + bool value; + bool is_recommendation; +}; + +class OSSettingsRecoveryTestWithPolicy + : public OSSettingsRecoveryTestWithFeature { + public: + void SetUpInProcessBrowserTestFixture() override { + OSSettingsRecoveryTestWithFeature::SetUpInProcessBrowserTestFixture(); + + // Override and policy provider for testing. The `ON_CALL` lines here are + // necessary because something inside the policy stack expects those return + // values. + ON_CALL(provider_, IsInitializationComplete(testing::_)) + .WillByDefault(testing::Return(true)); + ON_CALL(provider_, IsFirstPolicyLoadComplete(testing::_)) + .WillByDefault(testing::Return(true)); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); + } + + void SetCryptohomeRecoveryPolicy(policy::PolicyLevel level, bool value) { + policy::PolicyMap policies; + policies.Set(kRecoveryFactorBehaviorPolicy, level, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, + base::Value(value), + /*external_data_fetcher=*/nullptr); + provider_.UpdateChromePolicy(policies); + } + + private: + testing::NiceMock<policy::MockConfigurationPolicyProvider> provider_; +}; + +// Check that the recovery toggle cannot be flipped to "on" if a policy +// mandates that cryptohome recovery is disabled. +IN_PROC_BROWSER_TEST_F(OSSettingsRecoveryTestWithPolicy, DisabledMandatory) { + SetCryptohomeRecoveryPolicy(policy::POLICY_LEVEL_MANDATORY, false); + + mojom::LockScreenSettingsAsyncWaiter lock_screen_settings = + OpenLockScreenSettingsAndAuthenticate(); + lock_screen_settings.TryEnableRecoveryConfiguration(); + + // This will repeateadly check that the recovery toggle is set to "off" for + // some time, so we would catch if the toggle flips asynchronously after some + // time. + lock_screen_settings.AssertRecoveryConfigured(false); + EXPECT_FALSE(cryptohome_.HasRecoveryFactor(GetAccountId())); +} + +// Check that the recovery toggle can be flipped if a policy mandates that +// recovery is enabled but recovery is currently not enabled. +IN_PROC_BROWSER_TEST_F(OSSettingsRecoveryTestWithPolicy, + EnabledMandatoryButDisabled) { + SetCryptohomeRecoveryPolicy(policy::POLICY_LEVEL_MANDATORY, true); + EXPECT_FALSE(cryptohome_.HasRecoveryFactor(GetAccountId())); + + mojom::LockScreenSettingsAsyncWaiter lock_screen_settings = + OpenLockScreenSettingsAndAuthenticate(); + lock_screen_settings.AssertRecoveryConfigured(false); + + lock_screen_settings.EnableRecoveryConfiguration(); + + lock_screen_settings.AssertRecoveryConfigured(true); + EXPECT_TRUE(cryptohome_.HasRecoveryFactor(GetAccountId())); + + // Try to disable again -- this should have no effect, because the policy + // mandates that recovery must be configured. + lock_screen_settings.TryDisableRecoveryConfiguration(); + + // This will repeateadly check that the recovery toggle is set to "on" for + // some time, so we would catch if the toggle flips asynchronously after some + // time. + lock_screen_settings.AssertRecoveryConfigured(true); + EXPECT_TRUE(cryptohome_.HasRecoveryFactor(GetAccountId())); +} + } // namespace ash::settings
diff --git a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc index 25833a16..6799dd7 100644 --- a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc +++ b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
@@ -32,10 +32,7 @@ public: void SetUp() override { scoped_feature_list_.InitWithFeaturesAndParameters( - {{performance_manager::features::kHighEfficiencyModeAvailable, - {{"default_state", "true"}, {"time_before_discard", "30s"}}}, - {performance_manager::features::kBatterySaverModeAvailable, {}}}, - {}); + {{performance_manager::features::kBatterySaverModeAvailable, {}}}, {}); ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); SetUpFakeBatterySampler(); @@ -44,6 +41,9 @@ void SetUpOnMainThread() override { InteractiveBrowserTest::SetUpOnMainThread(); + performance_manager::user_tuning::UserPerformanceTuningManager:: + GetInstance() + ->SetHighEfficiencyModeEnabled(true); embedded_test_server()->StartAcceptingConnections(); }
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 22edf0f..c4de4ae 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -518,6 +518,7 @@ {"promptForDownload", IDS_SETTINGS_PROMPT_FOR_DOWNLOAD}, {"openFileTypesAutomatically", IDS_SETTINGS_OPEN_FILE_TYPES_AUTOMATICALLY}, + {"showDownloadsWhenFinished", IDS_SETTINGS_DOWNLOADS_SHOW_WHEN_FINISHED}, }; html_source->AddLocalizedStrings(kLocalizedStrings); }
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index d52bfc06..4f05153d 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -17,6 +17,7 @@ #include "build/build_config.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/commerce/shopping_service_factory.h" +#include "chrome/browser/download/bubble/download_bubble_prefs.h" #include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.h" @@ -370,6 +371,9 @@ "enableEsbCollapse", safe_browsing::kEsbIphBubbleAndCollapseSettingsEnableCollapse.Get()); + html_source->AddBoolean("downloadBubbleEnabled", + download::IsDownloadBubbleEnabled(profile)); + #if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) html_source->AddBoolean( "biometricAuthenticationForFilling", @@ -485,10 +489,8 @@ // Performance AddSettingsPageUIHandler(std::make_unique<PerformanceHandler>()); - html_source->AddBoolean( - "highEfficiencyModeAvailable", - base::FeatureList::IsEnabled( - performance_manager::features::kHighEfficiencyModeAvailable)); + // TODO(crbug.com/1430884): Remove this when the WebUI doesn't look for it. + html_source->AddBoolean("highEfficiencyModeAvailable", true); html_source->AddBoolean( "batterySaverModeAvailable", base::FeatureList::IsEnabled(
diff --git a/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/BrowserUiUtils.java b/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/BrowserUiUtils.java index bf6cedf6..3d351820 100644 --- a/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/BrowserUiUtils.java +++ b/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/BrowserUiUtils.java
@@ -20,7 +20,8 @@ @IntDef({ModuleTypeOnStartAndNTP.MOST_VISITED_TILES, ModuleTypeOnStartAndNTP.OMNIBOX, ModuleTypeOnStartAndNTP.SINGLE_TAB_CARD, ModuleTypeOnStartAndNTP.FEED, ModuleTypeOnStartAndNTP.TAB_SWITCHER_BUTTON, ModuleTypeOnStartAndNTP.HOME_BUTTON, - ModuleTypeOnStartAndNTP.PROFILE_BUTTON, ModuleTypeOnStartAndNTP.NUM_ENTRIES}) + ModuleTypeOnStartAndNTP.PROFILE_BUTTON, ModuleTypeOnStartAndNTP.DOODLE, + ModuleTypeOnStartAndNTP.NUM_ENTRIES}) public @interface ModuleTypeOnStartAndNTP { int MOST_VISITED_TILES = 0; int OMNIBOX = 1; @@ -29,9 +30,10 @@ int TAB_SWITCHER_BUTTON = 4; int HOME_BUTTON = 5; int PROFILE_BUTTON = 6; + int DOODLE = 7; // Be sure to also update enums.xml when updating these values. - int NUM_ENTRIES = 7; + int NUM_ENTRIES = 8; } /**
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc index d80bd12..1d403c3 100644 --- a/chrome/browser/web_applications/web_app.cc +++ b/chrome/browser/web_applications/web_app.cc
@@ -966,12 +966,8 @@ } json_decl.Set("feature", feature_name->second); base::Value::List allowlist_json; - // TODO(crbug.com/1418009): Consolidate code and filter opaque origins. - if (decl.self_if_matches) { - allowlist_json.Append(decl.self_if_matches->Serialize()); - } - for (const auto& origin_with_possible_wildcards : decl.allowed_origins) { - allowlist_json.Append(origin_with_possible_wildcards.Serialize()); + for (const auto& allowlist_item : GetSerializedAllowedOrigins(decl)) { + allowlist_json.Append(allowlist_item); } json_decl.Set("allowed_origins", std::move(allowlist_json)); json_decl.Set("matches_all_origins", decl.matches_all_origins); @@ -1128,4 +1124,20 @@ return !(management_config1 == management_config2); } +std::vector<std::string> GetSerializedAllowedOrigins( + const blink::ParsedPermissionsPolicyDeclaration + permissions_policy_declaration) { + std::vector<std::string> allowed_origins; + if (permissions_policy_declaration.self_if_matches) { + CHECK(!permissions_policy_declaration.self_if_matches->opaque()); + allowed_origins.push_back( + permissions_policy_declaration.self_if_matches->Serialize()); + } + for (const auto& origin_with_possible_wildcards : + permissions_policy_declaration.allowed_origins) { + allowed_origins.push_back(origin_with_possible_wildcards.Serialize()); + } + return allowed_origins; +} + } // namespace web_app
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h index e9c4c06c..1cc12ce 100644 --- a/chrome/browser/web_applications/web_app.h +++ b/chrome/browser/web_applications/web_app.h
@@ -595,6 +595,10 @@ bool operator!=(const WebApp::ExternalManagementConfig& management_config1, const WebApp::ExternalManagementConfig& management_config2); +std::vector<std::string> GetSerializedAllowedOrigins( + const blink::ParsedPermissionsPolicyDeclaration + permissions_policy_declaration); + } // namespace web_app #endif // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_H_
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc index 7468ce1..2e7f9e03 100644 --- a/chrome/browser/web_applications/web_app_database.cc +++ b/chrome/browser/web_applications/web_app_database.cc
@@ -719,13 +719,8 @@ continue; const std::string feature_string(feature_name->second); proto_policy.set_feature(feature_string); - // TODO(crbug.com/1418009): Consolidate code and filter opaque origins. - if (decl.self_if_matches) { - proto_policy.add_allowed_origins(decl.self_if_matches->Serialize()); - } - for (const auto& origin_with_possible_wildcards : decl.allowed_origins) { - proto_policy.add_allowed_origins( - origin_with_possible_wildcards.Serialize()); + for (const auto& allowed_origin : GetSerializedAllowedOrigins(decl)) { + proto_policy.add_allowed_origins(allowed_origin); } proto_policy.set_matches_all_origins(decl.matches_all_origins); proto_policy.set_matches_opaque_src(decl.matches_opaque_src);
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 9f12ca6e..26f887e2 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -395,11 +395,18 @@ } void AuthenticatorRequestDialogModel::StartPlatformAuthenticatorFlow() { + // Never try the platform authenticator if the request is known in advance to + // fail. Proceed to a special error screen instead. if (transport_availability_.request_type == device::FidoRequestType::kGetAssertion) { - DCHECK_EQ(transport_availability_.has_platform_authenticator_credential, - device::FidoRequestHandlerBase::RecognizedCredential:: - kHasRecognizedCredential); + DCHECK_NE(transport_availability_.has_platform_authenticator_credential, + device::FidoRequestHandlerBase::RecognizedCredential::kUnknown); + if (transport_availability_.has_platform_authenticator_credential == + device::FidoRequestHandlerBase::RecognizedCredential:: + kNoRecognizedCredential) { + SetCurrentStep(Step::kErrorInternalUnrecognized); + return; + } // If the platform authenticator reports known credentials, show them in the // UI.
diff --git a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java index 1a0c4571..5e729c1 100644 --- a/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java +++ b/chrome/browser/xsurface/android/java/src/org/chromium/chrome/browser/xsurface/SurfaceActionsHandler.java
@@ -41,6 +41,33 @@ } /** + * Options for entry points to the single web feed. + */ + @IntDef({OpenWebFeedEntryPoint.ATTRIBUTION, OpenWebFeedEntryPoint.RECOMMENDATION, + OpenWebFeedEntryPoint.GROUP_HEADER, OpenWebFeedEntryPoint.OTHER, + OpenWebFeedEntryPoint.MAX_VALUE}) + @Retention(RetentionPolicy.SOURCE) + public @interface OpenWebFeedEntryPoint { + /** + * Feed Atteribution + */ + int ATTRIBUTION = 0; + /** + * Feed Recomentation + */ + int RECOMMENDATION = 1; + /** + * Group Header Attribution + */ + int GROUP_HEADER = 2; + /** + * Other + */ + int OTHER = 3; + int MAX_VALUE = OTHER; + } + + /** * Options when opening URLs with openUrl(). */ interface OpenUrlOptions { @@ -156,7 +183,17 @@ * Opens a specific WebFeed by name. * @param webFeedName the relevant web feed name. */ - default void openWebFeed(String webFeedName) {} + @Deprecated + default void openWebFeed(String webFeedName) { + openWebFeed(webFeedName, OpenWebFeedEntryPoint.OTHER); + } + + /** + * Opens a specific WebFeed by name with a specific entrypoint. + * @param webFeedName the relevant web feed name. + * @param entryPoint the entry point used to launch the feed. + */ + default void openWebFeed(String webFeedName, @OpenWebFeedEntryPoint int entryPoint) {} /** Requests that a sync consent prompt be shown. */ default void showSyncConsentPrompt() {}
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index d788cd7..88f9a6c 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1681279009-93d4b72f8aef7ce41d34bf0afcbeb28267a0379a.profdata +chrome-linux-main-1681322360-fa14f3ca9370bbbcc5b536eb04e26cc723dbdc08.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index f15d4894..2245bba 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1681286262-bc8dc44203dfd02265f242ab998c41e40f1d3b45.profdata +chrome-mac-arm-main-1681329517-4ba99e4c3e347b573e9491ea16d30d2d166d1a89.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 4569862..d52d2c5 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1681279009-c37ed7656a101db6216bb3da8142a1d79c605179.profdata +chrome-mac-main-1681322360-12c9b62fcc5daad4f9b0b181ecbc98e56afad583.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 686a3bd..2024a64e 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1681268366-ce21c1e324dd13d93975766807314ec41f77279a.profdata +chrome-win32-main-1681311484-397fac25a38d4dc5ecb7da6d32b014e79d9a2ed0.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index a68b680..9443417 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1681279009-d5f5bba2a6a460c83e9b0faec75ee5989e67042b.profdata +chrome-win64-main-1681311484-9edf151da433b32ad878f18460ab562b19e699ac.profdata
diff --git a/chrome/common/extensions/api/devtools/panels.json b/chrome/common/extensions/api/devtools/panels.json index 5fb3ab0..a412a607 100644 --- a/chrome/common/extensions/api/devtools/panels.json +++ b/chrome/common/extensions/api/devtools/panels.json
@@ -376,6 +376,12 @@ "description": "Specifies the line number to scroll to when the resource is loaded." }, { + "name": "columnNumber", + "type": "integer", + "optional": true, + "description": "Specifies the column number to scroll to when the resource is loaded." + }, + { "name": "callback", "type": "function", "optional": true,
diff --git a/chrome/installer/mac/signing/README.md b/chrome/installer/mac/signing/README.md index c88845c..10b4dbc8 100644 --- a/chrome/installer/mac/signing/README.md +++ b/chrome/installer/mac/signing/README.md
@@ -101,7 +101,7 @@ Unfortunately there is not an authoritative list of service names for resetting, but the value `All` will remove all decisions. The decisions are recorded in a -SQLite database, which can be inspected using the command below. This requies +SQLite database, which can be inspected using the command below. This requires granting the **Full Disk Access** permission in System Settings to the Terminal or disabling System Integrity Protection.
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc index d04ab03..55ec1cbb 100644 --- a/chrome/installer/setup/install_worker.cc +++ b/chrome/installer/setup/install_worker.cc
@@ -16,6 +16,8 @@ #include <wrl/client.h> #include <memory> +#include <string> +#include <tuple> #include <vector> #include "base/command_line.h" @@ -576,15 +578,46 @@ if (!GoogleUpdateSettings::GetBrand(&brand)) return; - std::wstring new_brand = GetUpdatedBrandCode(brand); - if (new_brand.empty()) - return; - // Only update if this machine is a managed device, including domain join. if (!base::IsManagedDevice()) { return; } + std::wstring new_brand = GetUpdatedBrandCode(brand); + // Rewrite the old brand so that the next step can potentially apply both + // changes at once. + if (!new_brand.empty()) { + brand = new_brand; + } + + // Furthermore do the CBCM brand code conversion both ways. + base::win::RegKey key; + std::wstring value_name; + bool has_valid_dm_token = false; + std::tie(key, value_name) = InstallUtil::GetCloudManagementDmTokenLocation( + InstallUtil::ReadOnly(true), InstallUtil::BrowserLocation(false)); + if (key.Valid()) { + std::wstring dmtoken_value; + auto result = key.ReadValue(value_name.c_str(), &dmtoken_value); + if (result == ERROR_SUCCESS && !dmtoken_value.empty() && + dmtoken_value.compare(L"INVALID_DM_TOKEN")) { + has_valid_dm_token = true; + } + } + + bool is_cbcm_enrolled = + !InstallUtil::GetCloudManagementEnrollmentToken().empty() && + has_valid_dm_token; + std::wstring cbcm_brand = + TransformCloudManagementBrandCode(brand, /*to_cbcm=*/is_cbcm_enrolled); + if (!cbcm_brand.empty()) { + new_brand = cbcm_brand; + } + + if (new_brand.empty()) { + return; + } + install_list->AddSetRegValueWorkItem( installer_state.root_key(), install_static::GetClientStateKeyPath(), KEY_WOW64_32KEY, google_update::kRegRLZBrandField, new_brand, true); @@ -607,6 +640,40 @@ return std::wstring(); } +std::wstring TransformCloudManagementBrandCode(const std::wstring& brand_code, + bool to_cbcm) { + // Brand codes to be remapped on enterprise installs. + // We are extracting the 4th letter below so we should better have one. + if (brand_code.length() != 4 || brand_code == L"GCEL") { + return std::wstring(); + } + static constexpr struct CbcmBrandRemapping { + const wchar_t* cbe_brand; + const wchar_t* cbcm_brand; + } kCbcmBrandRemapping[] = { + {L"GCE", L"GCC"}, + {L"GCF", L"GCK"}, + {L"GCG", L"GCL"}, + {L"GCH", L"GCM"}, + }; + if (to_cbcm) { + for (auto mapping : kCbcmBrandRemapping) { + if (base::StartsWith(brand_code, mapping.cbe_brand, + base::CompareCase::SENSITIVE)) { + return std::wstring(mapping.cbcm_brand) + brand_code[3]; + } + } + } else { + for (auto mapping : kCbcmBrandRemapping) { + if (base::StartsWith(brand_code, mapping.cbcm_brand, + base::CompareCase::SENSITIVE)) { + return std::wstring(mapping.cbe_brand) + brand_code[3]; + } + } + } + return std::wstring(); +} + bool AppendPostInstallTasks(const InstallParams& install_params, WorkItemList* post_install_task_list) { DCHECK(post_install_task_list);
diff --git a/chrome/installer/setup/install_worker.h b/chrome/installer/setup/install_worker.h index 7162181..b3a5a9e 100644 --- a/chrome/installer/setup/install_worker.h +++ b/chrome/installer/setup/install_worker.h
@@ -46,6 +46,12 @@ // brand code is returned, otherwise an empty string is returned. std::wstring GetUpdatedBrandCode(const std::wstring& brand_code); +// Does forward and backword transformation of brand codes between the CBE w/o +// and CBE with CBCM codes. The `to_cbcm` parameter defines which direction is +// needed. +std::wstring TransformCloudManagementBrandCode(const std::wstring& brand_code, + bool to_cbcm); + // After a successful copying of all the files, this function is called to // do a few post install tasks: // - Handle the case of in-use-update by updating "opv" (old version) key or
diff --git a/chrome/installer/setup/install_worker_unittest.cc b/chrome/installer/setup/install_worker_unittest.cc index e33e315..a228e9a 100644 --- a/chrome/installer/setup/install_worker_unittest.cc +++ b/chrome/installer/setup/install_worker_unittest.cc
@@ -27,6 +27,7 @@ #include "chrome/installer/util/delete_tree_work_item.h" #include "chrome/installer/util/google_update_constants.h" #include "chrome/installer/util/helper.h" +#include "chrome/installer/util/install_util.h" #include "chrome/installer/util/installation_state.h" #include "chrome/installer/util/set_reg_value_work_item.h" #include "chrome/installer/util/util_constants.h" @@ -364,6 +365,7 @@ } void SetupExpectations(const std::wstring& brand, + bool is_cbcm_enrolled, StrictMock<MockWorkItemList>* work_item_list) { if (!brand.empty()) { base::win::RegKey key(installer_state_->root_key(), @@ -374,7 +376,30 @@ 0, key.WriteValue(google_update::kRegRLZBrandField, brand.c_str())); } - if (!installer::GetUpdatedBrandCode(brand).empty() && + if (is_cbcm_enrolled) { + std::wstring enrollment_token(L"ENROLLMENT_TOKEN"); + std::wstring dm_token(L"0123456789"); + for (const std::pair<std::wstring, std::wstring>& key_and_value : + InstallUtil::GetCloudManagementEnrollmentTokenRegistryPaths()) { + base::win::RegKey key(installer_state_->root_key(), + key_and_value.first.c_str(), KEY_WRITE); + ASSERT_TRUE(key.Valid()); + ASSERT_EQ(0, key.WriteValue(key_and_value.second.c_str(), + enrollment_token.c_str())); + } + base::win::RegKey key; + std::wstring value_name; + std::tie(key, value_name) = + InstallUtil::GetCloudManagementDmTokenLocation( + InstallUtil::ReadOnly(false), + InstallUtil::BrowserLocation(false)); + ASSERT_TRUE(key.Valid()); + ASSERT_EQ(0, key.WriteValue(value_name.c_str(), dm_token.c_str())); + } + + if ((!installer::GetUpdatedBrandCode(brand).empty() || + !installer::TransformCloudManagementBrandCode(brand, is_cbcm_enrolled) + .empty()) && (is_domain_joined_ || (is_registered_ && !is_home_edition_))) { EXPECT_CALL(*work_item_list, AddSetRegStringValueWorkItem(_, _, _, _, _, _)) @@ -403,25 +428,91 @@ TEST_P(AddUpdateBrandCodeWorkItemTest, NoBrand) { StrictMock<MockWorkItemList> work_item_list; - SetupExpectations(L"", &work_item_list); + SetupExpectations(L"", false, &work_item_list); installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); } TEST_P(AddUpdateBrandCodeWorkItemTest, GGRV) { StrictMock<MockWorkItemList> work_item_list; - SetupExpectations(L"GGRV", &work_item_list); + SetupExpectations(L"GGRV", false, &work_item_list); installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); } TEST_P(AddUpdateBrandCodeWorkItemTest, GGLS) { StrictMock<MockWorkItemList> work_item_list; - SetupExpectations(L"GGLS", &work_item_list); + SetupExpectations(L"GGLS", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GGRV_CBCM) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GGRV", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GGLS_CBCM) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GGLS", true, &work_item_list); installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); } TEST_P(AddUpdateBrandCodeWorkItemTest, TEST) { StrictMock<MockWorkItemList> work_item_list; - SetupExpectations(L"TEST", &work_item_list); + SetupExpectations(L"TEST", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCEA) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCEA", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCEL) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCEA", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCFB) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCFB", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCGC) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCGC", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCHD) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GChD", true, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCCJ) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCCJ", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCKK) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCKK", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCLL) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCLL", false, &work_item_list); + installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); +} + +TEST_P(AddUpdateBrandCodeWorkItemTest, GCMM) { + StrictMock<MockWorkItemList> work_item_list; + SetupExpectations(L"GCMM", false, &work_item_list); installer::AddUpdateBrandCodeWorkItem(*installer_state(), &work_item_list); }
diff --git a/chrome/services/sharing/nearby/platform/bluetooth_classic_medium.h b/chrome/services/sharing/nearby/platform/bluetooth_classic_medium.h index f7b6e2ee4..d783e9eb 100644 --- a/chrome/services/sharing/nearby/platform/bluetooth_classic_medium.h +++ b/chrome/services/sharing/nearby/platform/bluetooth_classic_medium.h
@@ -45,6 +45,12 @@ const std::string& service_name, const std::string& service_uuid) override; BluetoothDevice* GetRemoteDevice(const std::string& mac_address) override; + void AddObserver(Observer* observer) override { + // TODO(b/269521993): Implement. + } + void RemoveObserver(Observer* observer) override { + // TODO(b/269521993): Implement. + } private: // bluetooth::mojom::AdapterObserver:
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index dd3e719..b30f8ad 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -587,6 +587,7 @@ if (is_chromeos) { sources += [ + "../browser/app_mode/test/accelerator_helpers.cc", "../browser/certificate_provider/test_certificate_provider_extension.cc", "../browser/certificate_provider/test_certificate_provider_extension.h", "../browser/extensions/policy_test_utils.cc", @@ -604,6 +605,7 @@ if (is_chromeos_ash) { sources += [ + "../browser/ash/login/app_mode/test/ash_accelerator_helpers.cc", "../browser/apps/app_service/metrics/app_platform_metrics_service_test_base.cc", "../browser/apps/app_service/metrics/app_platform_metrics_service_test_base.h", "../browser/ash/login/lock/screen_locker_tester.cc", @@ -979,8 +981,6 @@ "../browser/browsing_data/chrome_browsing_data_lifetime_manager_browsertest.cc", "../browser/engagement/important_sites_util_browsertest.cc", "../browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc", - "../browser/fast_checkout/mock_fast_checkout_client.cc", - "../browser/fast_checkout/mock_fast_checkout_client.h", "../browser/metrics/metrics_log_browsertest.cc", "../browser/metrics/metrics_service_user_demographics_browsertest.cc", "../browser/metrics/sampled_out_client_id_saved_browsertest.cc", @@ -2824,6 +2824,7 @@ sources += [ "../browser/apps/app_service/metrics/website_metrics_browsertest.cc", "../browser/apps/app_service/webapk/webapk_utils_lacros_browsertest.cc", + "../browser/lacros/app_mode/kiosk_accelerator_browsertest.cc", "../browser/lacros/app_mode/kiosk_session_service_browsertest.cc", "../browser/lacros/lacros_extension_apps_controller_browsertest.cc", "../browser/lacros/lacros_extension_apps_publisher_browsertest.cc", @@ -3580,7 +3581,6 @@ "../browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc", "../browser/ui/views/payments/shipping_option_view_controller_browsertest.cc", "../browser/ui/views/performance_controls/battery_saver_button_browsertest.cc", - "../browser/ui/views/performance_controls/high_efficiency_chip_view_browsertest.cc", "../browser/ui/views/performance_controls/high_efficiency_exclusion_list_browsertest.cc", "../browser/ui/views/performance_controls/high_efficiency_iph_browsertest.cc", "../browser/ui/views/permissions/permission_prompt_bubble_view_browsertest.cc", @@ -3846,6 +3846,8 @@ "../browser/ash/login/accessibility_browsertest.cc", "../browser/ash/login/active_directory_login_browsertest.cc", "../browser/ash/login/app_mode/test/auto_launched_kiosk_browsertest.cc", + "../browser/ash/login/app_mode/test/kiosk_accelerator_browsertest.cc", + "../browser/ash/login/app_mode/test/kiosk_accelerator_lacros_browsertest.cc", "../browser/ash/login/app_mode/test/kiosk_apps_mixin.cc", "../browser/ash/login/app_mode/test/kiosk_apps_mixin.h", "../browser/ash/login/app_mode/test/kiosk_base_test.cc", @@ -6679,8 +6681,6 @@ "../browser/fast_checkout/fast_checkout_client_impl_unittest.cc", "../browser/fast_checkout/fast_checkout_personal_data_helper_impl_unittest.cc", "../browser/fast_checkout/fast_checkout_trigger_validator_impl_unittest.cc", - "../browser/fast_checkout/mock_fast_checkout_client.cc", - "../browser/fast_checkout/mock_fast_checkout_client.h", "../browser/feedback/android/family_info_feedback_source_unittest.cc", "../browser/long_screenshots/long_screenshots_tab_service_unittest.cc", "../browser/lookalikes/safety_tip_message_delegate_android_unittest.cc", @@ -6910,12 +6910,12 @@ "../browser/metrics/power/power_metrics_reporter_unittest.cc", "../browser/metrics/power/power_metrics_unittest.cc", "../browser/metrics/power/process_monitor_unittest.cc", - "../browser/metrics/power/usage_scenario_unittest.cc", "../browser/metrics/tab_stats/tab_stats_data_store_unittest.cc", "../browser/metrics/tab_stats/tab_stats_tracker_unittest.cc", "../browser/metrics/usage_scenario/system_event_provider_unittest.cc", "../browser/metrics/usage_scenario/tab_usage_scenario_tracker_unittest.cc", "../browser/metrics/usage_scenario/usage_scenario_data_store_unittest.cc", + "../browser/metrics/usage_scenario/usage_scenario_unittest.cc", "../browser/new_tab_page/one_google_bar/one_google_bar_loader_impl_unittest.cc", "../browser/new_tab_page/one_google_bar/one_google_bar_service_unittest.cc", "../browser/new_tab_page/promos/promo_service_unittest.cc",
diff --git a/chrome/test/data/scroll/scrollable_page_with_content.html b/chrome/test/data/scroll/scrollable_page_with_content.html index 7d783cd..77de388b 100644 --- a/chrome/test/data/scroll/scrollable_page_with_content.html +++ b/chrome/test/data/scroll/scrollable_page_with_content.html
@@ -10,6 +10,7 @@ </style> </head> <body> - <p>Some text</p> + <a id="link" href="#text">Go Down</a> + <p id="text">Some text</p> </body> </html>
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js b/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js index a403de0..d2d8802 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/apn_list_test.js
@@ -141,17 +141,44 @@ assertEquals( apnList.i18n('apnSettingsZeroStateDescription'), getZeroStateText().querySelector('div').innerText); + const getErrorMessage = () => + apnList.shadowRoot.querySelector('#errorMessage'); + assertFalse(!!getErrorMessage()); // Set as non-APN-related error. apnList.errorState = 'connect-failed'; await flushTasks(); assertTrue(!!getZeroStateText()); + assertFalse(!!getErrorMessage()); - // Set as APN-related error. TODO(b/162365553): Assert error UI when - // implemented. + // Set as APN-related error. apnList.errorState = 'invalid-apn'; await flushTasks(); assertFalse(!!getZeroStateText()); + assertTrue(!!getErrorMessage()); + const getErrorMessageText = () => + getErrorMessage().querySelector('localized-link').localizedString; + assertEquals('Can\'t connect to network.', getErrorMessageText()); + + // Add an enabled custom APN. + apnList.managedCellularProperties = { + customApnList: [customApnDefaultEnabled], + }; + await flushTasks(); + assertFalse(!!getZeroStateText()); + assertTrue(!!getErrorMessage()); + assertEquals( + apnList.i18n('apnSettingsCustomApnsErrorMessage'), + getErrorMessageText()); + + // Disable the custom APN. + apnList.managedCellularProperties = { + customApnList: [customApnDefaultDisabled], + }; + await flushTasks(); + assertFalse(!!getZeroStateText()); + assertTrue(!!getErrorMessage()); + assertEquals('Can\'t connect to network.', getErrorMessageText()); }); test('There is no Connected APN and no custom APNs', async function() {
diff --git a/chrome/test/data/webui/settings/BUILD.gn b/chrome/test/data/webui/settings/BUILD.gn index bc0a325..e29a69f 100644 --- a/chrome/test/data/webui/settings/BUILD.gn +++ b/chrome/test/data/webui/settings/BUILD.gn
@@ -201,6 +201,10 @@ files += [ "incompatible_applications_page_test.ts" ] } + if (is_chrome_branded) { + files += [ "get_most_chrome_page_test.ts" ] + } + ts_path_mappings = [ # Settings tests should only be importing from one of the URLs below, so # that tests work both in optimize_webui=true/false modes.
diff --git a/chrome/test/data/webui/settings/advanced_page_test.ts b/chrome/test/data/webui/settings/advanced_page_test.ts index 1ff212d..ae5b9e0 100644 --- a/chrome/test/data/webui/settings/advanced_page_test.ts +++ b/chrome/test/data/webui/settings/advanced_page_test.ts
@@ -82,6 +82,9 @@ test('advanced pages', function() { const sections = ['a11y', 'languages', 'downloads', 'reset']; + // <if expr="_google_chrome"> + sections.push('getMostChrome'); + // </if> for (let i = 0; i < sections.length; i++) { const section = getSection(basicPage, sections[i]!); assertTrue(!!section);
diff --git a/chrome/test/data/webui/settings/chromeos/test_api.test-mojom b/chrome/test/data/webui/settings/chromeos/test_api.test-mojom index 9008e0d..6bc91231 100644 --- a/chrome/test/data/webui/settings/chromeos/test_api.test-mojom +++ b/chrome/test/data/webui/settings/chromeos/test_api.test-mojom
@@ -39,10 +39,14 @@ // the recovery is still disabled. EnableRecoveryConfiguration() => (); - // Try to toggle whether recovery is configured or not. Does not assume that - // the action is successful. + // Try to enable data recovery. Data recovery must not be configured before + // calling this. Does not assume that the action is successful. TryEnableRecoveryConfiguration() => (); + // Try to enable data recovery. Data recovery must be configured before + // calling this. Does not assume that the action is successful. + TryDisableRecoveryConfiguration() => (); + // The following function expects the cryptohome recovery toggle is on. // Clicks on the recovery toggle, expecting the recovery dialog to show up. // if the param is CancelDialog:
diff --git a/chrome/test/data/webui/settings/chromeos/test_api.ts b/chrome/test/data/webui/settings/chromeos/test_api.ts index c7fcaaa..3e5e45a9 100644 --- a/chrome/test/data/webui/settings/chromeos/test_api.ts +++ b/chrome/test/data/webui/settings/chromeos/test_api.ts
@@ -363,6 +363,12 @@ toggle.click(); } + async tryDisableRecoveryConfiguration(): Promise<void> { + const toggle = await retryUntilSome(() => this.recoveryToggle()); + assertTrue(toggle.checked); + toggle.click(); + } + async disableRecoveryConfiguration(dialogAction: RecoveryDialogAction): Promise<void> { assertTrue(this.recoveryDisableDialog() === null);
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js index 72dbb25..ff8713f 100644 --- a/chrome/test/data/webui/settings/cr_settings_browsertest.js +++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -471,7 +471,6 @@ get featureListInternal() { return { enabled: [ - 'performance_manager::features::kHighEfficiencyModeAvailable', 'performance_manager::features::kBatterySaverModeAvailable', ], }; @@ -487,15 +486,6 @@ get browsePreload() { return 'chrome://settings/test_loader.html?module=settings/performance_page_test.js'; } - - /** @override */ - get featureListInternal() { - return { - enabled: [ - 'performance_manager::features::kHighEfficiencyModeAvailable', - ], - }; - } }; TEST_F('CrSettingsPerformancePageTest', 'All', function() { @@ -890,16 +880,6 @@ get browsePreload() { return 'chrome://settings/test_loader.html?module=settings/settings_menu_test.js'; } - - /** @override */ - get featureList() { - return { - disabled: [ - 'performance_manager::features::kHighEfficiencyModeAvailable', - 'performance_manager::features::kBatterySaverModeAvailable', - ], - }; - } }; TEST_F('CrSettingsMenuTest', 'All', function() { @@ -1025,6 +1005,10 @@ registerTest('MetricsReporting', 'metrics_reporting_tests.js'); GEN('#endif'); +GEN('#if BUILDFLAG(GOOGLE_CHROME_BRANDING)'); +registerTest('GetMostChromePage', 'get_most_chrome_page_test.js'); +GEN('#endif'); + function registerTest(testName, module, caseName) { const className = `CrSettings${testName}Test`; this[className] = class extends CrSettingsBrowserTest {
diff --git a/chrome/test/data/webui/settings/downloads_page_test.ts b/chrome/test/data/webui/settings/downloads_page_test.ts index 42465a6..4e8adfa 100644 --- a/chrome/test/data/webui/settings/downloads_page_test.ts +++ b/chrome/test/data/webui/settings/downloads_page_test.ts
@@ -5,11 +5,13 @@ // clang-format off import 'chrome://settings/settings.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {DownloadsBrowserProxy, DownloadsBrowserProxyImpl, SettingsDownloadsPageElement} from 'chrome://settings/lazy_load.js'; import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; - +import {CrSettingsPrefs, SettingsPrefsElement} from 'chrome://settings/settings.js'; // <if expr="chromeos_ash"> import {assertEquals} from 'chrome://webui-test/chai_assert.js'; // </if> @@ -56,24 +58,27 @@ suite('DownloadsHandler', function() { let downloadsBrowserProxy: TestDownloadsBrowserProxy; let downloadsPage: SettingsDownloadsPageElement; + let settingsPrefs: SettingsPrefsElement; + + suiteSetup(function() { + settingsPrefs = document.createElement('settings-prefs'); + return CrSettingsPrefs.initialized; + }); setup(function() { downloadsBrowserProxy = new TestDownloadsBrowserProxy(); DownloadsBrowserProxyImpl.setInstance(downloadsBrowserProxy); document.body.innerHTML = window.trustedTypes!.emptyHTML; - + document.body.appendChild(settingsPrefs); downloadsPage = document.createElement('settings-downloads-page'); + downloadsPage.prefs = settingsPrefs.prefs; document.body.appendChild(downloadsPage); // Page element must call 'initializeDownloads' upon attachment to the DOM. return downloadsBrowserProxy.whenCalled('initializeDownloads'); }); - teardown(function() { - downloadsPage.remove(); - }); - test('select downloads location', function() { const button = downloadsPage.shadowRoot!.querySelector<HTMLElement>( '#changeDownloadsPath'); @@ -107,15 +112,7 @@ // <if expr="chromeos_ash"> function setDefaultDownloadPathPref(downloadPath: string) { - downloadsPage.prefs = { - download: { - default_directory: { - key: 'download.default_directory', - type: chrome.settingsPrivate.PrefType.STRING, - value: downloadPath, - }, - }, - }; + downloadsPage.setPrefValue('download.default_directory', downloadPath); } function getDefaultDownloadPathString() { @@ -126,6 +123,7 @@ } test('rewrite default download paths', async function() { + downloadsBrowserProxy.resetResolver('getDownloadLocationText'); setDefaultDownloadPathPref('downloads-path'); const path = await downloadsBrowserProxy.whenCalled('getDownloadLocationText'); @@ -134,4 +132,60 @@ assertEquals('downloads-text', getDefaultDownloadPathString()); }); // </if> + + test('showDownloadsToggleHidden', function() { + const button = + downloadsPage.querySelector<HTMLElement>('#showDownloadsToggle'); + assertFalse(!!button); + }); +}); + +suite('DownloadsHandlerWithBubble', function() { + let downloadsBrowserProxy: TestDownloadsBrowserProxy; + let downloadsPage: SettingsDownloadsPageElement; + let settingsPrefs: SettingsPrefsElement; + + suiteSetup(function() { + loadTimeData.overrideValues({ + downloadBubbleEnabled: true, + }); + settingsPrefs = document.createElement('settings-prefs'); + return CrSettingsPrefs.initialized; + }); + + setup(function() { + downloadsBrowserProxy = new TestDownloadsBrowserProxy(); + DownloadsBrowserProxyImpl.setInstance(downloadsBrowserProxy); + + document.body.innerHTML = window.trustedTypes!.emptyHTML; + document.body.appendChild(settingsPrefs); + downloadsPage = document.createElement('settings-downloads-page'); + downloadsPage.prefs = settingsPrefs.prefs; + document.body.appendChild(downloadsPage); + + // Page element must call 'initializeDownloads' upon attachment to the DOM. + return downloadsBrowserProxy.whenCalled('initializeDownloads'); + }); + + test('showDownloadsToggleShown', function() { + const button = downloadsPage.shadowRoot!.querySelector<HTMLElement>( + '#showDownloadsToggle'); + assertTrue(!!button); + }); + + test('showDownloadsToggleChangesPref', async function() { + downloadsPage.setPrefValue('download_bubble.partial_view_enabled', false); + await flushTasks(); + assertFalse( + downloadsPage.getPref('download_bubble.partial_view_enabled').value); + + const button = downloadsPage.shadowRoot!.querySelector<HTMLElement>( + '#showDownloadsToggle'); + assertTrue(!!button); + + button.click(); + await flushTasks(); + assertTrue( + downloadsPage.getPref('download_bubble.partial_view_enabled').value); + }); });
diff --git a/chrome/test/data/webui/settings/get_most_chrome_page_test.ts b/chrome/test/data/webui/settings/get_most_chrome_page_test.ts new file mode 100644 index 0000000..68cafbb --- /dev/null +++ b/chrome/test/data/webui/settings/get_most_chrome_page_test.ts
@@ -0,0 +1,26 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://settings/lazy_load.js'; + +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {SettingsGetMostChromePageElement} from 'chrome://settings/lazy_load.js'; +import {assertTrue} from 'chrome://webui-test/chai_assert.js'; + +/** @fileoverview Suite of tests for get_most_chrome_page. */ +suite('GetMostChromePage', function() { + let testElement: SettingsGetMostChromePageElement; + + setup(function() { + document.body.innerHTML = window.trustedTypes!.emptyHTML; + testElement = document.createElement('settings-get-most-chrome-page'); + document.body.appendChild(testElement); + flush(); + }); + + test('Basic', function() { + assertTrue(!!testElement); + // TODO(crbug.com/143278): Expand this test as the element gets implemented. + }); +});
diff --git a/chrome/test/data/webui/settings/settings_menu_test.ts b/chrome/test/data/webui/settings/settings_menu_test.ts index 74131d3..03584a72 100644 --- a/chrome/test/data/webui/settings/settings_menu_test.ts +++ b/chrome/test/data/webui/settings/settings_menu_test.ts
@@ -42,12 +42,6 @@ settingsMenu.$.people.click(); assertEquals('', Router.getInstance().getQueryParameters().toString()); }); - - test('performanceFeatureNotAvailableTest', function() { - assertFalse( - !!settingsMenu.shadowRoot!.querySelector<HTMLElement>('#performance'), - 'performance menu item should not exist when features are unavailable'); - }); }); suite('SettingsMenuReset', function() {
diff --git a/chrome/test/interaction/README.md b/chrome/test/interaction/README.md index 81c44e9..9c3e779 100644 --- a/chrome/test/interaction/README.md +++ b/chrome/test/interaction/README.md
@@ -137,6 +137,9 @@ - ActivateSurface is not always reliable on Linux with the Wayland window manager; see [Handling Incompatibilities](#handling-incompatibilities) for how to correctly deal with this. + - `ScrollToVisible()` [Views, Browser] + - Recommended before doing anything that needs the screen coordinates of + a UI or DOM element that is in a scrollable container. - **Mouse** verbs simulate mouse input to the entire application, and are therefore only reliable in test fixtures that run as exclusive processes (e.g. interactive_browser_tests). Examples include:
diff --git a/chrome/test/interaction/interactive_browser_test.cc b/chrome/test/interaction/interactive_browser_test.cc index 700e6a22..7191e01b 100644 --- a/chrome/test/interaction/interactive_browser_test.cc +++ b/chrome/test/interaction/interactive_browser_test.cc
@@ -468,15 +468,38 @@ return DragMouseTo(web_contents, DeepQueryToRelativePosition(where), release); } +InteractiveBrowserTestApi::StepBuilder +InteractiveBrowserTestApi::ScrollIntoView(ui::ElementIdentifier web_contents, + const DeepQuery& where) { + return std::move( + ExecuteJsAt(web_contents, where, + "(el) => { el.scrollIntoView({ behavior: 'instant' }); }") + .SetDescription("ScrollIntoView()")); +} + // static InteractiveBrowserTestApi::RelativePositionCallback InteractiveBrowserTestApi::DeepQueryToRelativePosition(const DeepQuery& query) { return base::BindOnce( [](DeepQuery q, ui::TrackedElement* el) { - return el->AsA<TrackedElementWebContents>() - ->owner() - ->GetElementBoundsInScreen(q) - .CenterPoint(); + auto* const contents = el->AsA<TrackedElementWebContents>(); + const gfx::Rect container_bounds = contents->GetScreenBounds(); + const gfx::Rect element_bounds = + contents->owner()->GetElementBoundsInScreen(q); + CHECK(!element_bounds.IsEmpty()) + << "Cannot target DOM element at " << q << " in " + << el->identifier() << " because its screen bounds are emtpy."; + gfx::Rect intersect_bounds = element_bounds; + intersect_bounds.Intersect(container_bounds); + CHECK(!intersect_bounds.IsEmpty()) + << "Cannot target DOM element at " << q << " in " + << el->identifier() << " because its screen bounds " + << element_bounds.ToString() + << " are outside the screen bounds of the containing WebView, " + << container_bounds.ToString() + << ". Did you forget to scroll the element into view? See " + "ScrollToVisible()."; + return intersect_bounds.CenterPoint(); }, query); }
diff --git a/chrome/test/interaction/interactive_browser_test.h b/chrome/test/interaction/interactive_browser_test.h index 7550419..b53cbd2 100644 --- a/chrome/test/interaction/interactive_browser_test.h +++ b/chrome/test/interaction/interactive_browser_test.h
@@ -267,6 +267,9 @@ // Find the DOM element at the given path in the reference element, which // should be an instrumented WebContents; see Instrument*(). Move the mouse to // the element's center point in screen coordinates. + // + // If the DOM element may be scrolled outside of the current viewport, + // consider using ScrollIntoView(web_contents, where) before this verb. [[nodiscard]] StepBuilder MoveMouseTo(ElementSpecifier web_contents, const DeepQuery& where); @@ -274,10 +277,22 @@ // should be an instrumented WebContents; see Instrument*(). Perform a drag // from the mouse's current location to the element's center point in screen // coordinates, and then if `release` is true, releases the mouse button. + // + // If the DOM element may be scrolled outside of the current viewport, + // consider using ScrollIntoView(web_contents, where) before this verb. [[nodiscard]] StepBuilder DragMouseTo(ElementSpecifier web_contents, const DeepQuery& where, bool release = true); + using InteractiveViewsTestApi::ScrollIntoView; + + // Scrolls the DOM element at `where` in instrumented WebContents + // `web_contents` into view; see Instrument*(). The scrolling happens + // instantaneously, without animation, and should be available on the next + // render frame or call into the renderer. + [[nodiscard]] StepBuilder ScrollIntoView(ui::ElementIdentifier web_contents, + const DeepQuery& where); + protected: explicit InteractiveBrowserTestApi( std::unique_ptr<internal::InteractiveBrowserTestPrivate>
diff --git a/chrome/test/interaction/interactive_browser_test_browsertest.cc b/chrome/test/interaction/interactive_browser_test_browsertest.cc index 7703d49..ca521c64 100644 --- a/chrome/test/interaction/interactive_browser_test_browsertest.cc +++ b/chrome/test/interaction/interactive_browser_test_browsertest.cc
@@ -21,6 +21,8 @@ DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsId); constexpr char kDocumentWithNamedElement[] = "/select.html"; constexpr char kDocumentWithLinks[] = "/links.html"; +constexpr char kScrollableDocument[] = + "/scroll/scrollable_page_with_content.html"; } // namespace class InteractiveBrowserTestBrowsertest : public InteractiveBrowserTest { @@ -263,6 +265,28 @@ verify_is_at_tab_index(incognito_browser, kIncognito1Id, 2))); } +IN_PROC_BROWSER_TEST_F(InteractiveBrowserTestBrowsertest, ScrollIntoView) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kTabId); + const GURL url = embedded_test_server()->GetURL(kScrollableDocument); + const DeepQuery kLink{"#link"}; + const DeepQuery kText{"#text"}; + + constexpr char kElementIsInViewport[] = R"( + (el) => { + const bounds = el.getBoundingClientRect(); + return bounds.right >= 0 && bounds.bottom >= 0 && + bounds.x < window.innerWidth && bounds.y < window.innerHeight; + } + )"; + + RunTestSequence(InstrumentTab(kTabId), NavigateWebContents(kTabId, url), + CheckJsResultAt(kTabId, kLink, kElementIsInViewport, true), + CheckJsResultAt(kTabId, kText, kElementIsInViewport, false), + ScrollIntoView(kTabId, kText), + CheckJsResultAt(kTabId, kLink, kElementIsInViewport, false), + CheckJsResultAt(kTabId, kText, kElementIsInViewport, true)); +} + // Parameter for WebUI coverage tests. struct CoverageConfig { // Whether to set the --devtools-code-coverage flag. If it's not set, nothing
diff --git a/chrome/test/v8/wasm_trap_handler_browsertest.cc b/chrome/test/v8/wasm_trap_handler_browsertest.cc index 6a72d5b5..53635f21 100644 --- a/chrome/test/v8/wasm_trap_handler_browsertest.cc +++ b/chrome/test/v8/wasm_trap_handler_browsertest.cc
@@ -90,7 +90,8 @@ } }; -IN_PROC_BROWSER_TEST_F(WasmTrapHandlerBrowserTest, OutOfBounds) { +// TODO(crbug.com/1432526): Re-enable this test +IN_PROC_BROWSER_TEST_F(WasmTrapHandlerBrowserTest, DISABLED_OutOfBounds) { ASSERT_TRUE(embedded_test_server()->Start()); const auto& url = embedded_test_server()->GetURL("/wasm/out_of_bounds.html"); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 1bcb2da..62c4c47 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -15418.0.0 \ No newline at end of file +15419.0.0 \ No newline at end of file
diff --git a/chromeos/ash/components/cryptohome/BUILD.gn b/chromeos/ash/components/cryptohome/BUILD.gn index 19d4a4f..883a3e5 100644 --- a/chromeos/ash/components/cryptohome/BUILD.gn +++ b/chromeos/ash/components/cryptohome/BUILD.gn
@@ -56,6 +56,7 @@ "//testing/gtest:gtest", ] sources = [ + "auth_factor_conversions_unittest.cc", "cryptohome_util_unittest.cc", "system_salt_getter_unittest.cc", "userdataauth_util_unittest.cc",
diff --git a/chromeos/ash/components/cryptohome/auth_factor_conversions.cc b/chromeos/ash/components/cryptohome/auth_factor_conversions.cc index 1175f0fd..2f0ab0ce 100644 --- a/chromeos/ash/components/cryptohome/auth_factor_conversions.cc +++ b/chromeos/ash/components/cryptohome/auth_factor_conversions.cc
@@ -41,13 +41,41 @@ } } +absl::optional<AuthFactorType> SafeConvertFactorTypeFromProto( + user_data_auth::AuthFactorType type) { + switch (type) { + case user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED: + LOG(WARNING) << "Unknown factor type should be handled separately"; + return absl::nullopt; + case user_data_auth::AUTH_FACTOR_TYPE_LEGACY_FINGERPRINT: + LOG(WARNING) << "Fingerprint factor type should never be returned"; + return absl::nullopt; + case user_data_auth::AUTH_FACTOR_TYPE_PASSWORD: + return AuthFactorType::kPassword; + case user_data_auth::AUTH_FACTOR_TYPE_PIN: + return AuthFactorType::kPin; + case user_data_auth::AUTH_FACTOR_TYPE_CRYPTOHOME_RECOVERY: + return AuthFactorType::kRecovery; + case user_data_auth::AUTH_FACTOR_TYPE_KIOSK: + return AuthFactorType::kKiosk; + case user_data_auth::AUTH_FACTOR_TYPE_SMART_CARD: + return AuthFactorType::kSmartCard; + default: + LOG(WARNING) + << "Unknown auth factor type " << static_cast<int>(type) + << " Probably factor was added in cryptohome, but is not supported " + "in chrome yet."; + return absl::nullopt; + } +} + AuthFactorType ConvertFactorTypeFromProto(user_data_auth::AuthFactorType type) { switch (type) { case user_data_auth::AUTH_FACTOR_TYPE_UNSPECIFIED: - NOTREACHED() << "Unknown factor type should be handled separately"; + LOG(FATAL) << "Unknown factor type should be handled separately"; return AuthFactorType::kUnknownLegacy; case user_data_auth::AUTH_FACTOR_TYPE_LEGACY_FINGERPRINT: - NOTREACHED() << "Fingerprint factor type should never be returned"; + LOG(FATAL) << "Fingerprint factor type should never be returned"; return AuthFactorType::kUnknownLegacy; case user_data_auth::AUTH_FACTOR_TYPE_PASSWORD: return AuthFactorType::kPassword; @@ -60,7 +88,8 @@ case user_data_auth::AUTH_FACTOR_TYPE_SMART_CARD: return AuthFactorType::kSmartCard; default: - NOTREACHED() << "Unknown auth factor type " << static_cast<int>(type); + // Use `--ignore-unknown-auth-factors` to avoid this. + LOG(FATAL) << "Unknown auth factor type " << static_cast<int>(type); return AuthFactorType::kUnknownLegacy; } }
diff --git a/chromeos/ash/components/cryptohome/auth_factor_conversions.h b/chromeos/ash/components/cryptohome/auth_factor_conversions.h index cf50c63..0e0aceb 100644 --- a/chromeos/ash/components/cryptohome/auth_factor_conversions.h +++ b/chromeos/ash/components/cryptohome/auth_factor_conversions.h
@@ -9,11 +9,17 @@ #include "chromeos/ash/components/cryptohome/auth_factor.h" #include "chromeos/ash/components/cryptohome/auth_factor_input.h" #include "chromeos/ash/components/dbus/cryptohome/auth_factor.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace cryptohome { COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) user_data_auth::AuthFactorType ConvertFactorTypeToProto(AuthFactorType type); +// This version would ignore unknown factor types. +COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) +absl::optional<AuthFactorType> SafeConvertFactorTypeFromProto( + user_data_auth::AuthFactorType type); +// This version would crash if unknown factor type is specified. COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME) AuthFactorType ConvertFactorTypeFromProto(user_data_auth::AuthFactorType type); COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_CRYPTOHOME)
diff --git a/chromeos/ash/components/cryptohome/auth_factor_conversions_unittest.cc b/chromeos/ash/components/cryptohome/auth_factor_conversions_unittest.cc new file mode 100644 index 0000000..21661f5a --- /dev/null +++ b/chromeos/ash/components/cryptohome/auth_factor_conversions_unittest.cc
@@ -0,0 +1,48 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/ash/components/cryptohome/auth_factor_conversions.h" + +#include <memory> + +#include "base/strings/string_number_conversions.h" +#include "base/test/gtest_util.h" +#include "base/test/task_environment.h" +#include "chromeos/ash/components/cryptohome/auth_factor.h" +#include "chromeos/ash/components/dbus/cryptohome/auth_factor.pb.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +namespace cryptohome { +namespace { + +class AuthFactorConversionsTest : public testing::Test { + protected: + AuthFactorConversionsTest() + : task_environment_( + base::test::SingleThreadTaskEnvironment::MainThreadType::UI) {} + + base::test::SingleThreadTaskEnvironment task_environment_; +}; + +// Makes sure that `SafeConvertFactorTypeFromProto` and +// `ConvertFactorTypeFromProto` return corresponding values. +TEST_F(AuthFactorConversionsTest, FactorTypeProtoToChrome) { + for (user_data_auth::AuthFactorType type = user_data_auth::AuthFactorType_MIN; + type <= user_data_auth::AuthFactorType_MAX; + type = static_cast<user_data_auth::AuthFactorType>(type + 1)) { + absl::optional<AuthFactorType> result = + SafeConvertFactorTypeFromProto(type); + SCOPED_TRACE("For user_data_auth::AuthFactorType " + + base::NumberToString(type)); + if (result.has_value()) { + EXPECT_EQ(result.value(), ConvertFactorTypeFromProto(type)); + } else { + EXPECT_DEATH(ConvertFactorTypeFromProto(type), "FATAL"); + } + } +} + +} // namespace +} // namespace cryptohome
diff --git a/chromeos/ash/components/dbus/hermes/BUILD.gn b/chromeos/ash/components/dbus/hermes/BUILD.gn index 3d19da9..a034b29 100644 --- a/chromeos/ash/components/dbus/hermes/BUILD.gn +++ b/chromeos/ash/components/dbus/hermes/BUILD.gn
@@ -44,6 +44,7 @@ visibility = [ ":*" ] deps = [ ":hermes_clients", + "//ash/constants", "//base", "//chromeos/ash/components/dbus/shill", "//chromeos/dbus/constants",
diff --git a/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc b/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc index b476dbf3..a3f3ab421 100644 --- a/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc +++ b/chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.cc
@@ -4,6 +4,7 @@ #include "chromeos/ash/components/dbus/hermes/fake_hermes_euicc_client.h" +#include "ash/constants/ash_features.h" #include "base/command_line.h" #include "base/logging.h" #include "base/ranges/algorithm.h" @@ -18,6 +19,7 @@ #include "chromeos/ash/components/dbus/shill/shill_service_client.h" #include "chromeos/dbus/constants/dbus_switches.h" #include "dbus/object_path.h" +#include "third_party/cros_system_api/dbus/hermes/dbus-constants.h" #include "third_party/cros_system_api/dbus/shill/dbus-constants.h" namespace ash { @@ -33,33 +35,52 @@ const char* kFakeServiceProvider = "Fake Wireless"; const char* kFakeNetworkServicePathPrefix = "/service/cellular1"; +dbus::Property<std::vector<dbus::ObjectPath>>& GetPendingProfiles( + HermesEuiccClient::Properties* properties) { + return features::IsSmdsDbusMigrationEnabled() + ? properties->profiles() + : properties->pending_carrier_profiles(); +} + +dbus::Property<std::vector<dbus::ObjectPath>>& GetInstalledProfiles( + HermesEuiccClient::Properties* properties) { + return features::IsSmdsDbusMigrationEnabled() + ? properties->profiles() + : properties->installed_carrier_profiles(); +} + bool PopPendingProfile(HermesEuiccClient::Properties* properties, dbus::ObjectPath carrier_profile_path) { - std::vector<dbus::ObjectPath> pending_profiles = - properties->pending_carrier_profiles().value(); - auto it = base::ranges::find(pending_profiles, carrier_profile_path); - if (it == pending_profiles.end()) { + std::vector<dbus::ObjectPath> profiles = + GetPendingProfiles(properties).value(); + auto it = base::ranges::find(profiles, carrier_profile_path); + if (it == profiles.end()) { return false; } - pending_profiles.erase(it); - properties->pending_carrier_profiles().ReplaceValue(pending_profiles); + HermesProfileClient::Properties* profile_properties = + HermesProfileClient::Get()->GetProperties(*it); + if (profile_properties->state().value() != hermes::profile::State::kPending) { + return false; + } + + profiles.erase(it); + GetPendingProfiles(properties).ReplaceValue(profiles); return true; } dbus::ObjectPath PopPendingProfileWithActivationCode( HermesEuiccClient::Properties* euicc_properties, const std::string& activation_code) { - std::vector<dbus::ObjectPath> pending_profiles = - euicc_properties->pending_carrier_profiles().value(); - for (auto it = pending_profiles.begin(); it != pending_profiles.end(); it++) { + std::vector<dbus::ObjectPath> profiles = + GetPendingProfiles(euicc_properties).value(); + for (auto it = profiles.begin(); it != profiles.end(); it++) { dbus::ObjectPath carrier_profile_path = *it; HermesProfileClient::Properties* profile_properties = HermesProfileClient::Get()->GetProperties(carrier_profile_path); if (profile_properties->activation_code().value() == activation_code) { - pending_profiles.erase(it); - euicc_properties->pending_carrier_profiles().ReplaceValue( - pending_profiles); + profiles.erase(it); + GetPendingProfiles(euicc_properties).ReplaceValue(profiles); return carrier_profile_path; } } @@ -101,11 +122,17 @@ return; auto* profile_test = HermesProfileClient::Get()->GetTestInterface(); HermesEuiccClient::Properties* properties = it->second.get(); - for (const auto& path : properties->installed_carrier_profiles().value()) { - profile_test->ClearProfile(path); - } - for (const auto& path : properties->pending_carrier_profiles().value()) { - profile_test->ClearProfile(path); + if (features::IsSmdsDbusMigrationEnabled()) { + for (const auto& path : properties->profiles().value()) { + profile_test->ClearProfile(path); + } + } else { + for (const auto& path : properties->installed_carrier_profiles().value()) { + profile_test->ClearProfile(path); + } + for (const auto& path : properties->pending_carrier_profiles().value()) { + profile_test->ClearProfile(path); + } } properties_map_.erase(it); } @@ -166,10 +193,10 @@ Properties* euicc_properties = GetProperties(euicc_path); if (state == hermes::profile::State::kPending) { - std::vector<dbus::ObjectPath> pending_profiles = - euicc_properties->pending_carrier_profiles().value(); - pending_profiles.push_back(path); - euicc_properties->pending_carrier_profiles().ReplaceValue(pending_profiles); + std::vector<dbus::ObjectPath> profiles = + GetPendingProfiles(euicc_properties).value(); + profiles.push_back(path); + GetPendingProfiles(euicc_properties).ReplaceValue(profiles); return; } @@ -191,11 +218,10 @@ return; } - std::vector<dbus::ObjectPath> installed_profiles = - euicc_properties->installed_carrier_profiles().value(); - installed_profiles.push_back(path); - euicc_properties->installed_carrier_profiles().ReplaceValue( - installed_profiles); + std::vector<dbus::ObjectPath> profiles = + GetInstalledProfiles(euicc_properties).value(); + profiles.push_back(path); + GetInstalledProfiles(euicc_properties).ReplaceValue(profiles); } bool FakeHermesEuiccClient::RemoveCarrierProfile( @@ -211,17 +237,15 @@ // Remove profile from Euicc properties. Properties* euicc_properties = GetProperties(euicc_path); - std::vector<dbus::ObjectPath> installed_profiles = - euicc_properties->installed_carrier_profiles().value(); - auto installed_carrier_profiles_iter = - base::ranges::find(installed_profiles, carrier_profile_path); - if (installed_carrier_profiles_iter == installed_profiles.end()) { + std::vector<dbus::ObjectPath> profiles = + GetInstalledProfiles(euicc_properties).value(); + auto profiles_iter = base::ranges::find(profiles, carrier_profile_path); + if (profiles_iter == profiles.end()) { return false; } - installed_profiles.erase(installed_carrier_profiles_iter); - euicc_properties->installed_carrier_profiles().ReplaceValue( - installed_profiles); + profiles.erase(profiles_iter); + GetInstalledProfiles(euicc_properties).ReplaceValue(profiles); // Remove profile dbus object. HermesProfileClient::Get()->GetTestInterface()->ClearProfile( @@ -385,11 +409,10 @@ HermesProfileClient::Get()->GetProperties(profile_path); profile_properties->state().ReplaceValue(hermes::profile::State::kInactive); - std::vector<dbus::ObjectPath> installed_profiles = - euicc_properties->installed_carrier_profiles().value(); - installed_profiles.push_back(profile_path); - euicc_properties->installed_carrier_profiles().ReplaceValue( - installed_profiles); + std::vector<dbus::ObjectPath> profiles = + GetInstalledProfiles(euicc_properties).value(); + profiles.push_back(profile_path); + GetInstalledProfiles(euicc_properties).ReplaceValue(profiles); } else { // Create a new installed profile with given activation code. profile_path = AddFakeCarrierProfile( @@ -425,11 +448,11 @@ HermesProfileClient::Get()->GetProperties(carrier_profile_path); profile_properties->state().ReplaceValue(hermes::profile::State::kInactive); - std::vector<dbus::ObjectPath> installed_profiles = - euicc_properties->installed_carrier_profiles().value(); - installed_profiles.push_back(carrier_profile_path); - euicc_properties->installed_carrier_profiles().ReplaceValue( - installed_profiles); + std::vector<dbus::ObjectPath> profiles = + GetInstalledProfiles(euicc_properties).value(); + profiles.push_back(carrier_profile_path); + GetInstalledProfiles(euicc_properties).ReplaceValue(profiles); + CreateCellularService(euicc_path, carrier_profile_path); std::move(callback).Run(HermesResponseStatus::kSuccess); @@ -449,14 +472,13 @@ if (iter != installed_profile_queue_map_.end() && !iter->second->empty()) { InstalledProfileQueue* installed_profile_queue = iter->second.get(); Properties* euicc_properties = GetProperties(euicc_path); - std::vector<dbus::ObjectPath> installed_profiles = - euicc_properties->installed_carrier_profiles().value(); + std::vector<dbus::ObjectPath> profiles = + GetInstalledProfiles(euicc_properties).value(); while (!installed_profile_queue->empty()) { - installed_profiles.push_back(installed_profile_queue->front()); + profiles.push_back(installed_profile_queue->front()); installed_profile_queue->pop(); } - euicc_properties->installed_carrier_profiles().ReplaceValue( - installed_profiles); + GetInstalledProfiles(euicc_properties).ReplaceValue(profiles); } std::move(callback).Run(HermesResponseStatus::kSuccess); } @@ -501,13 +523,18 @@ hermes::euicc::ResetOptions reset_option, HermesResponseCallback callback) { HermesEuiccClient::Properties* properties = GetProperties(euicc_path); - while (properties->installed_carrier_profiles().value().size()) { + while (true) { + const dbus::Property<std::vector<dbus::ObjectPath>>& profiles = + GetInstalledProfiles(properties); + if (profiles.value().empty()) { + break; + } + // Use a copy of profile_path since it will be deallocated along with the // profile. - const dbus::ObjectPath profile_path = - properties->installed_carrier_profiles().value().front(); + const dbus::ObjectPath profile_path = profiles.value().front(); bool remove_success = RemoveCarrierProfile(euicc_path, profile_path); - DCHECK(remove_success); + CHECK(remove_success); } std::move(callback).Run(HermesResponseStatus::kSuccess); }
diff --git a/chromeos/ash/components/dbus/hermes/hermes_euicc_client.cc b/chromeos/ash/components/dbus/hermes/hermes_euicc_client.cc index 59ebb9a..955e209 100644 --- a/chromeos/ash/components/dbus/hermes/hermes_euicc_client.cc +++ b/chromeos/ash/components/dbus/hermes/hermes_euicc_client.cc
@@ -4,8 +4,6 @@ #include "chromeos/ash/components/dbus/hermes/hermes_euicc_client.h" -#include "ash/constants/ash_features.h" -#include "base/check.h" #include "base/functional/bind.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h" @@ -43,13 +41,6 @@ HermesEuiccClient::Properties::~Properties() = default; -// TODO(b/271854446): Inline this accessor once the feature is launched. -dbus::Property<std::vector<dbus::ObjectPath>>& -HermesEuiccClient::Properties::profiles() { - DCHECK(features::IsSmdsDbusMigrationEnabled()); - return profiles_; -} - class HermesEuiccClientImpl : public HermesEuiccClient { public: explicit HermesEuiccClientImpl(dbus::Bus* bus) : bus_(bus) {}
diff --git a/chromeos/ash/components/dbus/hermes/hermes_euicc_client.h b/chromeos/ash/components/dbus/hermes/hermes_euicc_client.h index e1c0ffa..70bd800 100644 --- a/chromeos/ash/components/dbus/hermes/hermes_euicc_client.h +++ b/chromeos/ash/components/dbus/hermes/hermes_euicc_client.h
@@ -8,6 +8,8 @@ #include <string> #include <vector> +#include "ash/constants/ash_features.h" +#include "base/check.h" #include "base/functional/callback_forward.h" #include "base/observer_list.h" #include "chromeos/ash/components/dbus/hermes/hermes_response_status.h" @@ -128,10 +130,15 @@ dbus::Property<bool>& is_active() { return is_active_; } dbus::Property<std::vector<dbus::ObjectPath>>& installed_carrier_profiles() { + DCHECK(!features::IsSmdsDbusMigrationEnabled()); return installed_carrier_profiles_; } - dbus::Property<std::vector<dbus::ObjectPath>>& profiles(); + dbus::Property<std::vector<dbus::ObjectPath>>& profiles() { + DCHECK(features::IsSmdsDbusMigrationEnabled()); + return profiles_; + } dbus::Property<std::vector<dbus::ObjectPath>>& pending_carrier_profiles() { + DCHECK(!features::IsSmdsDbusMigrationEnabled()); return pending_carrier_profiles_; } dbus::Property<int32_t>& physical_slot() { return physical_slot_; }
diff --git a/chromeos/ash/components/login/auth/auth_factor_editor.cc b/chromeos/ash/components/login/auth/auth_factor_editor.cc index 38b7d6d..c0964e6 100644 --- a/chromeos/ash/components/login/auth/auth_factor_editor.cc +++ b/chromeos/ash/components/login/auth/auth_factor_editor.cc
@@ -5,6 +5,9 @@ #include "chromeos/ash/components/login/auth/auth_factor_editor.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" +#include "base/command_line.h" +#include "base/debug/dump_without_crashing.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "chromeos/ash/components/cryptohome/auth_factor.h" @@ -403,8 +406,19 @@ cryptohome::AuthFactorType::kPassword; if (user_manager::User::TypeIsKiosk(context->GetUserType())) fallback_type = cryptohome::AuthFactorType::kKiosk; + + // Ignore unknown factors that are in development. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + bool ignore_unknown_factors = + command_line->HasSwitch(ash::switches::kIgnoreUnknownAuthFactors); + for (const auto& factor_with_status_proto : reply->configured_auth_factors_with_status()) { + if (ignore_unknown_factors && + !cryptohome::SafeConvertFactorTypeFromProto( + factor_with_status_proto.auth_factor().type())) { + continue; + } auto factor = cryptohome::DeserializeAuthFactor( factor_with_status_proto.auth_factor(), fallback_type); // Dirty hack below, as cryptohome does not send correct value as a part of @@ -431,13 +445,15 @@ if (proto_type == user_data_auth::AUTH_FACTOR_TYPE_FINGERPRINT) { continue; } - cryptohome::AuthFactorType type = cryptohome::ConvertFactorTypeFromProto( - static_cast<user_data_auth::AuthFactorType>(proto_type)); - if (type == cryptohome::AuthFactorType::kUnknownLegacy) { - NOTREACHED(); + absl::optional<cryptohome::AuthFactorType> type = + cryptohome::SafeConvertFactorTypeFromProto( + static_cast<user_data_auth::AuthFactorType>(proto_type)); + if (!type.has_value()) { + LOG(ERROR) << " Unknown supported factor type, ignoring"; + base::debug::DumpWithoutCrashing(FROM_HERE); continue; } - supported_factors.Put(type); + supported_factors.Put(type.value()); } AuthFactorsConfiguration configured_factors(std::move(factor_list),
diff --git a/chromeos/ash/components/login/auth/auth_performer.cc b/chromeos/ash/components/login/auth/auth_performer.cc index 49ff1cd..9bbd1f0 100644 --- a/chromeos/ash/components/login/auth/auth_performer.cc +++ b/chromeos/ash/components/login/auth/auth_performer.cc
@@ -5,7 +5,9 @@ #include "chromeos/ash/components/login/auth/auth_performer.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" #include "base/check.h" +#include "base/command_line.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/notreached.h" @@ -403,7 +405,17 @@ if (IsKioskUserType(context->GetUserType())) { fallback_type = cryptohome::AuthFactorType::kKiosk; } + + // Ignore unknown factors that are in development. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + bool ignore_unknown_factors = + command_line->HasSwitch(ash::switches::kIgnoreUnknownAuthFactors); + for (const auto& factor_proto : reply->auth_factors()) { + if (ignore_unknown_factors && + !cryptohome::SafeConvertFactorTypeFromProto(factor_proto.type())) { + continue; + } next_factors.emplace_back( cryptohome::DeserializeAuthFactor(factor_proto, fallback_type)); }
diff --git a/chromeos/ash/components/network/cellular_connection_handler.cc b/chromeos/ash/components/network/cellular_connection_handler.cc index cddcc69..3290033 100644 --- a/chromeos/ash/components/network/cellular_connection_handler.cc +++ b/chromeos/ash/components/network/cellular_connection_handler.cc
@@ -4,6 +4,7 @@ #include "chromeos/ash/components/network/cellular_connection_handler.h" +#include "ash/constants/ash_features.h" #include "base/check.h" #include "base/functional/bind.h" #include "base/metrics/histogram_functions.h" @@ -18,6 +19,7 @@ #include "chromeos/ash/components/network/network_event_log.h" #include "chromeos/ash/components/network/network_state.h" #include "chromeos/ash/components/network/network_type_pattern.h" +#include "third_party/cros_system_api/dbus/hermes/dbus-constants.h" namespace ash { namespace { @@ -61,12 +63,19 @@ return absl::nullopt; const std::vector<dbus::ObjectPath>& profile_paths = - euicc_properties->installed_carrier_profiles().value(); + ash::features::IsSmdsDbusMigrationEnabled() + ? euicc_properties->profiles().value() + : euicc_properties->installed_carrier_profiles().value(); for (const auto& profile_path : profile_paths) { HermesProfileClient::Properties* profile_properties = HermesProfileClient::Get()->GetProperties(profile_path); - if (profile_properties && profile_properties->iccid().value() == iccid) + if (profile_properties && profile_properties->iccid().value() == iccid) { + const hermes::profile::State state = profile_properties->state().value(); + DCHECK(state == hermes::profile::State::kInactive || + state == hermes::profile::State::kActive || + ash::features::IsSmdsDbusMigrationEnabled()); return profile_path; + } } return absl::nullopt;
diff --git a/chromeos/ash/components/network/cellular_connection_handler.h b/chromeos/ash/components/network/cellular_connection_handler.h index 733afb1..c01a3a3 100644 --- a/chromeos/ash/components/network/cellular_connection_handler.h +++ b/chromeos/ash/components/network/cellular_connection_handler.h
@@ -57,6 +57,21 @@ class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularConnectionHandler : public NetworkStateHandlerObserver { public: + // TODO(b/271854446): Make these private once the migration has landed. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + enum class PrepareCellularConnectionResult { + kSuccess = 0, + kCouldNotFindNetworkWithIccid = 1, + kInhibitFailed = 2, + kCouldNotFindRelevantEuicc = 3, + kRefreshProfilesFailed = 4, + kCouldNotFindRelevantESimProfile = 5, + kEnableProfileFailed = 6, + kTimeoutWaitingForConnectable = 7, + kMaxValue = kTimeoutWaitingForConnectable + }; + CellularConnectionHandler(); CellularConnectionHandler(const CellularConnectionHandler&) = delete; CellularConnectionHandler& operator=(const CellularConnectionHandler&) = @@ -99,33 +114,11 @@ ErrorCallback error_callback); private: - friend class CellularConnectionHandlerTest; friend class CellularESimInstallerTest; friend class CellularPolicyHandlerTest; friend class ManagedNetworkConfigurationHandlerTest; friend class cellular_setup::ESimTestBase; - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, NoService); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - ServiceAlreadyConnectable); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, FailsInhibiting); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, NoRelevantEuicc); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - FailsRequestingInstalledProfiles); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - TimeoutWaitingForConnectable_ESim); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - TimeoutWaitingForConnectable_PSim); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - Success_AutoConnected); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - Success_TimeoutAutoConnected); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, - Success_AlreadyEnabled); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, ConnectToStub); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, MultipleRequests); - FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, NewProfile); - struct ConnectionRequestMetadata { ConnectionRequestMetadata(const std::string& iccid, SuccessCallback success_callback, @@ -161,20 +154,6 @@ friend std::ostream& operator<<(std::ostream& stream, const ConnectionState& step); - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class PrepareCellularConnectionResult { - kSuccess = 0, - kCouldNotFindNetworkWithIccid = 1, - kInhibitFailed = 2, - kCouldNotFindRelevantEuicc = 3, - kRefreshProfilesFailed = 4, - kCouldNotFindRelevantESimProfile = 5, - kEnableProfileFailed = 6, - kTimeoutWaitingForConnectable = 7, - kMaxValue = kTimeoutWaitingForConnectable - }; - // Timeout waiting for a cellular network to auto connect after switch // profile. static const base::TimeDelta kWaitingForAutoConnectTimeout;
diff --git a/chromeos/ash/components/network/cellular_connection_handler_unittest.cc b/chromeos/ash/components/network/cellular_connection_handler_unittest.cc index 6be51b5..fb9469d4 100644 --- a/chromeos/ash/components/network/cellular_connection_handler_unittest.cc +++ b/chromeos/ash/components/network/cellular_connection_handler_unittest.cc
@@ -6,12 +6,14 @@ #include <memory> +#include "ash/constants/ash_features.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "chromeos/ash/components/network/cellular_inhibitor.h" @@ -70,9 +72,20 @@ } // namespace class CellularConnectionHandlerTest : public testing::Test { + public: + CellularConnectionHandlerTest(const CellularConnectionHandlerTest&) = delete; + CellularConnectionHandlerTest& operator=( + const CellularConnectionHandlerTest&) = delete; + protected: - CellularConnectionHandlerTest() - : helper_(/*use_default_devices_and_services=*/false) {} + explicit CellularConnectionHandlerTest(bool enable_dbus_migration) + : helper_(/*use_default_devices_and_services=*/false) { + if (enable_dbus_migration) { + feature_list_.InitAndEnableFeature(ash::features::kSmdsDbusMigration); + } else { + feature_list_.InitAndDisableFeature(ash::features::kSmdsDbusMigration); + } + } ~CellularConnectionHandlerTest() override = default; // testing::Test: @@ -258,6 +271,7 @@ std::move(on_failure_callback_).Run(); } + base::test::ScopedFeatureList feature_list_; base::test::SingleThreadTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::HistogramTester histogram_tester_; @@ -274,7 +288,37 @@ std::string expected_error_name_; }; -TEST_F(CellularConnectionHandlerTest, NoService) { +class CellularConnectionHandlerTest_DBusMigrationDisabled + : public CellularConnectionHandlerTest { + public: + CellularConnectionHandlerTest_DBusMigrationDisabled( + const CellularConnectionHandlerTest_DBusMigrationDisabled&) = delete; + CellularConnectionHandlerTest_DBusMigrationDisabled& operator=( + const CellularConnectionHandlerTest_DBusMigrationDisabled&) = delete; + + protected: + CellularConnectionHandlerTest_DBusMigrationDisabled() + : CellularConnectionHandlerTest( + /*enable_dbus_migration=*/false) {} + ~CellularConnectionHandlerTest_DBusMigrationDisabled() override = default; +}; + +class CellularConnectionHandlerTest_DBusMigrationEnabled + : public CellularConnectionHandlerTest { + public: + CellularConnectionHandlerTest_DBusMigrationEnabled( + const CellularConnectionHandlerTest_DBusMigrationEnabled&) = delete; + CellularConnectionHandlerTest_DBusMigrationEnabled& operator=( + const CellularConnectionHandlerTest_DBusMigrationEnabled&) = delete; + + protected: + CellularConnectionHandlerTest_DBusMigrationEnabled() + : CellularConnectionHandlerTest( + /*enable_dbus_migration=*/true) {} + ~CellularConnectionHandlerTest_DBusMigrationEnabled() override = default; +}; + +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, NoService) { // Note: No cellular service added. base::RunLoop run_loop; @@ -287,7 +331,8 @@ kCouldNotFindNetworkWithIccid); } -TEST_F(CellularConnectionHandlerTest, ServiceAlreadyConnectable) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + ServiceAlreadyConnectable) { AddCellularDevice(); AddCellularService(/*profile_num=*/1); SetServiceIccid(/*profile_num=*/1); @@ -303,7 +348,7 @@ CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); } -TEST_F(CellularConnectionHandlerTest, FailsInhibiting) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, FailsInhibiting) { // Note: No cellular device added. This causes the inhibit operation to fail. AddCellularService(/*profile_num=*/1); @@ -321,7 +366,7 @@ kInhibitFailed); } -TEST_F(CellularConnectionHandlerTest, NoRelevantEuicc) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, NoRelevantEuicc) { AddCellularDevice(); AddCellularService(/*profile_num=*/1); SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); @@ -337,7 +382,8 @@ kCouldNotFindRelevantEuicc); } -TEST_F(CellularConnectionHandlerTest, FailsRequestingInstalledProfiles) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + FailsRequestingInstalledProfiles) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, /*euicc_num=*/1); @@ -355,7 +401,8 @@ kRefreshProfilesFailed); } -TEST_F(CellularConnectionHandlerTest, TimeoutWaitingForConnectable_ESim) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + TimeoutWaitingForConnectable_ESim) { const base::TimeDelta kWaitingForConnectableTimeout = base::Seconds(30); SetEnableProfileBehavior(HermesProfileClient::TestInterface:: @@ -383,7 +430,8 @@ kTimeoutWaitingForConnectable); } -TEST_F(CellularConnectionHandlerTest, TimeoutWaitingForConnectable_PSim) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + TimeoutWaitingForConnectable_PSim) { const base::TimeDelta kWaitingForConnectableTimeout = base::Seconds(30); SetEnableProfileBehavior(HermesProfileClient::TestInterface:: @@ -409,7 +457,8 @@ kTimeoutWaitingForConnectable); } -TEST_F(CellularConnectionHandlerTest, Success_AutoConnected) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + Success_AutoConnected) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, /*euicc_num=*/1); @@ -430,7 +479,8 @@ CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); } -TEST_F(CellularConnectionHandlerTest, Success_TimeoutAutoConnected) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + Success_TimeoutAutoConnected) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, /*euicc_num=*/1); @@ -448,7 +498,8 @@ CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); } -TEST_F(CellularConnectionHandlerTest, Success_AlreadyEnabled) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, + Success_AlreadyEnabled) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, @@ -470,7 +521,7 @@ CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); } -TEST_F(CellularConnectionHandlerTest, ConnectToStub) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, ConnectToStub) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); // Do not add a service; instead, this will cause a fake stub network to be @@ -498,7 +549,7 @@ CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); } -TEST_F(CellularConnectionHandlerTest, MultipleRequests) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, MultipleRequests) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, /*euicc_num=*/1); @@ -533,7 +584,292 @@ /*expected_count=*/2); } -TEST_F(CellularConnectionHandlerTest, NewProfile) { +TEST_F(CellularConnectionHandlerTest_DBusMigrationDisabled, NewProfile) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + + base::RunLoop run_loop; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/false); + CallPrepareNewlyInstalledCellularNetworkForConnection(/*profile_num=*/1, + /*euicc_num=*/1); + + // Verify that service corresponding to new profile becomes + // connectable. + run_loop.Run(); + ExpectServiceConnectable(/*profile_num=*/1); + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, NoService) { + // Note: No cellular service added. + + base::RunLoop run_loop; + ExpectFailure(/*service_path=*/std::string(), + NetworkConnectionHandler::kErrorNotFound, &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kCouldNotFindNetworkWithIccid); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + ServiceAlreadyConnectable) { + AddCellularDevice(); + AddCellularService(/*profile_num=*/1); + SetServiceIccid(/*profile_num=*/1); + SetServiceConnectable(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/false); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, FailsInhibiting) { + // Note: No cellular device added. This causes the inhibit operation to fail. + + AddCellularService(/*profile_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectFailure(CreateTestServicePath(/*profile_num=*/1), + NetworkConnectionHandler::kErrorCellularInhibitFailure, + &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kInhibitFailed); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, NoRelevantEuicc) { + AddCellularDevice(); + AddCellularService(/*profile_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectFailure(CreateTestServicePath(/*profile_num=*/1), + NetworkConnectionHandler::kErrorESimProfileIssue, &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kCouldNotFindRelevantEuicc); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + FailsRequestingInstalledProfiles) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + + QueueEuiccErrorStatus(); + + base::RunLoop run_loop; + ExpectFailure(CreateTestServicePath(/*profile_num=*/1), + NetworkConnectionHandler::kErrorESimProfileIssue, &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kRefreshProfilesFailed); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + TimeoutWaitingForConnectable_ESim) { + const base::TimeDelta kWaitingForConnectableTimeout = base::Seconds(30); + + SetEnableProfileBehavior(HermesProfileClient::TestInterface:: + EnableProfileBehavior::kNotConnectable); + + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectFailure(CreateTestServicePath(/*profile_num=*/1), + NetworkConnectionHandler::kConnectableCellularTimeout, + &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + + // Let all operations run, then wait for the timeout to occur. + base::RunLoop().RunUntilIdle(); + AdvanceClock(kWaitingForConnectableTimeout); + + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kTimeoutWaitingForConnectable); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + TimeoutWaitingForConnectable_PSim) { + const base::TimeDelta kWaitingForConnectableTimeout = base::Seconds(30); + + SetEnableProfileBehavior(HermesProfileClient::TestInterface:: + EnableProfileBehavior::kNotConnectable); + + AddCellularDevice(); + AddCellularService(/*profile_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectFailure(CreateTestServicePath(/*profile_num=*/1), + NetworkConnectionHandler::kConnectableCellularTimeout, + &run_loop); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + + // Let all operations run, then wait for the timeout to occur. + base::RunLoop().RunUntilIdle(); + AdvanceClock(kWaitingForConnectableTimeout); + + run_loop.Run(); + + ExpectResult(CellularConnectionHandler::PrepareCellularConnectionResult:: + kTimeoutWaitingForConnectable); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + Success_AutoConnected) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/true); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + // Simulate the cellular network get connected after 10 seconds. + AdvanceClock(base::Seconds(10)); + SetCellularServiceConnected(/*profile_num=*/1); + run_loop.Run(); + + ExpectServiceConnectable(/*profile_num=*/1); + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + Success_TimeoutAutoConnected) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/false); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + run_loop.Run(); + + ExpectServiceConnectable(/*profile_num=*/1); + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, + Success_AlreadyEnabled) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, + /*euicc_num=*/1, + /*add_service=*/true, + /*already_enabled=*/true); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + + base::RunLoop run_loop; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/false); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + SetServiceConnectable(/*profile_num=*/1); + run_loop.Run(); + + ExpectServiceConnectable(/*profile_num=*/1); + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, ConnectToStub) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + // Do not add a service; instead, this will cause a fake stub network to be + // created. + AddProfile(/*profile_num=*/1, /*euicc_num=*/1, /*add_service=*/false); + + base::RunLoop run_loop; + // Expect that by the end, we will connect to a "real" (i.e., non-stub) + // service path. + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop, + /*auto_connected=*/false); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + base::RunLoop().RunUntilIdle(); + + // A connection has started to a stub. Because the profile gets enabled, + // Shill exposes a service and makes it connectable. + AddCellularService(/*profile_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + SetServiceConnectable(/*profile_num=*/1); + + run_loop.Run(); + ExpectServiceConnectable(/*profile_num=*/1); + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, MultipleRequests) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + AddProfile(/*profile_num=*/1, /*euicc_num=*/1); + AddProfile(/*profile_num=*/2, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1); + SetServiceEid(/*profile_num=*/2, /*euicc_num=*/1); + SetServiceIccid(/*profile_num=*/1); + SetServiceIccid(/*profile_num=*/2); + + base::RunLoop run_loop1; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop1, + /*auto_connected=*/false); + + // Start both operations. + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1); + CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/2); + + // Verify that the first service becomes connectable. + run_loop1.Run(); + ExpectServiceConnectable(/*profile_num=*/1); + + base::RunLoop run_loop2; + ExpectSuccess(CreateTestServicePath(/*profile_num=*/2), &run_loop2, + /*auto_connected=*/false); + + // Verify that the second service becomes connectable. + run_loop2.Run(); + ExpectServiceConnectable(/*profile_num=*/2); + + ExpectResult( + CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess, + /*expected_count=*/2); +} + +TEST_F(CellularConnectionHandlerTest_DBusMigrationEnabled, NewProfile) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); AddProfile(/*profile_num=*/1, /*euicc_num=*/1);
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc index 5ca118c8..61d4bc6e 100644 --- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc +++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc
@@ -6,11 +6,13 @@ #include <memory> +#include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/values.h" #include "chromeos/ash/components/dbus/hermes/hermes_euicc_client.h" @@ -59,10 +61,21 @@ } // namespace class CellularESimProfileHandlerImplTest : public testing::Test { - protected: - CellularESimProfileHandlerImplTest() - : helper_(/*use_default_devices_and_services=*/false) {} + public: + CellularESimProfileHandlerImplTest( + const CellularESimProfileHandlerImplTest&) = delete; + CellularESimProfileHandlerImplTest& operator=( + const CellularESimProfileHandlerImplTest&) = delete; + protected: + explicit CellularESimProfileHandlerImplTest(bool enable_dbus_migration) + : helper_(/*use_default_devices_and_services=*/false) { + if (enable_dbus_migration) { + feature_list_.InitAndEnableFeature(ash::features::kSmdsDbusMigration); + } else { + feature_list_.InitAndDisableFeature(ash::features::kSmdsDbusMigration); + } + } ~CellularESimProfileHandlerImplTest() override = default; // testing::Test: @@ -224,6 +237,7 @@ } private: + base::test::ScopedFeatureList feature_list_; base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; NetworkStateTestHelper helper_; @@ -236,7 +250,38 @@ std::unique_ptr<CellularESimProfileHandlerImpl> handler_; }; -TEST_F(CellularESimProfileHandlerImplTest, NoEuicc) { +class CellularESimProfileHandlerImplTest_DBusMigrationDisabled + : public CellularESimProfileHandlerImplTest { + public: + CellularESimProfileHandlerImplTest_DBusMigrationDisabled( + const CellularESimProfileHandlerImplTest_DBusMigrationDisabled&) = delete; + CellularESimProfileHandlerImplTest_DBusMigrationDisabled& operator=( + const CellularESimProfileHandlerImplTest_DBusMigrationDisabled&) = delete; + + protected: + CellularESimProfileHandlerImplTest_DBusMigrationDisabled() + : CellularESimProfileHandlerImplTest( + /*enable_dbus_migration=*/false) {} + ~CellularESimProfileHandlerImplTest_DBusMigrationDisabled() override = + default; +}; + +class CellularESimProfileHandlerImplTest_DBusMigrationEnabled + : public CellularESimProfileHandlerImplTest { + public: + CellularESimProfileHandlerImplTest_DBusMigrationEnabled( + const CellularESimProfileHandlerImplTest_DBusMigrationEnabled&) = delete; + CellularESimProfileHandlerImplTest_DBusMigrationEnabled& operator=( + const CellularESimProfileHandlerImplTest_DBusMigrationEnabled&) = delete; + + protected: + CellularESimProfileHandlerImplTest_DBusMigrationEnabled() + : CellularESimProfileHandlerImplTest( + /*enable_dbus_migration=*/true) {} + ~CellularESimProfileHandlerImplTest_DBusMigrationEnabled() override = default; +}; + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, NoEuicc) { AddCellularDevice(); // No EUICCs exist, so no profiles should exist. Init(); @@ -253,7 +298,8 @@ EXPECT_EQ(0u, NumObserverEvents()); } -TEST_F(CellularESimProfileHandlerImplTest, EuiccWithNoProfiles) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, + EuiccWithNoProfiles) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -272,7 +318,8 @@ EXPECT_EQ(0u, NumObserverEvents()); } -TEST_F(CellularESimProfileHandlerImplTest, EuiccWithProfiles) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, + EuiccWithProfiles) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -335,7 +382,7 @@ EXPECT_TRUE(GetESimProfiles().empty()); } -TEST_F(CellularESimProfileHandlerImplTest, Persistent) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, Persistent) { AddCellularDevice(); Init(); SetDevicePrefs(); @@ -379,7 +426,7 @@ EXPECT_TRUE(GetESimProfiles().empty()); } -TEST_F(CellularESimProfileHandlerImplTest, +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, RefreshProfileList_AcquireLockInterally) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -399,7 +446,7 @@ EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); } -TEST_F(CellularESimProfileHandlerImplTest, +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, RefreshProfileList_ProvideAlreadyAcquiredLock) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -423,7 +470,8 @@ EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); } -TEST_F(CellularESimProfileHandlerImplTest, RefreshProfileList_Failure) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, + RefreshProfileList_Failure) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -445,7 +493,7 @@ EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); } -TEST_F(CellularESimProfileHandlerImplTest, +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, RefreshProfileList_MultipleSimultaneousRequests) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); @@ -477,7 +525,7 @@ EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); } -TEST_F(CellularESimProfileHandlerImplTest, +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, RefreshesAutomaticallyWhenNotSeenBefore) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); @@ -503,7 +551,8 @@ EXPECT_TRUE(GetLastRefreshProfilesRestoreSlotArg()); } -TEST_F(CellularESimProfileHandlerImplTest, IgnoresESimProfilesWithNoIccid) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, + IgnoresESimProfilesWithNoIccid) { const char kTestIccid[] = "1245671234567"; AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); Init(); @@ -534,7 +583,7 @@ EXPECT_EQ(kTestIccid, esim_profiles[0].iccid()); } -TEST_F(CellularESimProfileHandlerImplTest, +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, SkipsAutomaticRefreshIfNoCellularDevice) { Init(); AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); @@ -553,7 +602,8 @@ euicc_paths_from_prefs[0].GetString()); } -TEST_F(CellularESimProfileHandlerImplTest, DisableActiveESimProfile) { +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationDisabled, + DisableActiveESimProfile) { AddCellularDevice(); AddEuicc(/*euicc_num=*/1); Init(); @@ -593,4 +643,365 @@ /*expected_count=*/1); } +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, NoEuicc) { + AddCellularDevice(); + // No EUICCs exist, so no profiles should exist. + Init(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Set prefs; no profiles should exist. + SetDevicePrefs(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Unset prefs; no profiles should exist. + SetDevicePrefs(/*set_to_null=*/true); + EXPECT_TRUE(GetESimProfiles().empty()); + + EXPECT_EQ(0u, NumObserverEvents()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + EuiccWithNoProfiles) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + // No profiles were added to the EUICC. + Init(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Set prefs; no profiles should exist. + SetDevicePrefs(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Unset prefs; no profiles should exist. + SetDevicePrefs(/*set_to_null=*/true); + EXPECT_TRUE(GetESimProfiles().empty()); + + EXPECT_EQ(0u, NumObserverEvents()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + EuiccWithProfiles) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + // Add two normal (i.e., kOperational) profiles. + dbus::ObjectPath path1 = AddProfile( + /*euicc_num=*/1, hermes::profile::State::kPending, + /*activation_code=*/"code1"); + dbus::ObjectPath path2 = AddProfile( + /*euicc_num=*/1, hermes::profile::State::kActive, + /*activation_code=*/"code2"); + + // Add one kTesting and one kProvisioning profile. These profiles should not + // be ignored if they are returned from Hermes. + AddProfile( + /*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/"code3", hermes::profile::ProfileClass::kTesting); + AddProfile( + /*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/"code4", + hermes::profile::ProfileClass::kProvisioning); + + // Prefs not yet set. + Init(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Set prefs; the profiles added should be available. + SetDevicePrefs(); + EXPECT_EQ(1u, NumObserverEvents()); + + std::vector<CellularESimProfile> profiles = GetESimProfiles(); + EXPECT_EQ(4u, profiles.size()); + EXPECT_EQ(CellularESimProfile::State::kPending, profiles[0].state()); + EXPECT_EQ("code1", profiles[0].activation_code()); + EXPECT_EQ(CellularESimProfile::State::kActive, profiles[1].state()); + EXPECT_EQ("code2", profiles[1].activation_code()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[2].state()); + EXPECT_EQ("code3", profiles[2].activation_code()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[3].state()); + EXPECT_EQ("code4", profiles[3].activation_code()); + + // Update profile properties; GetESimProfiles() should return the new values. + HermesProfileClient::Properties* profile_properties1 = + HermesProfileClient::Get()->GetProperties(dbus::ObjectPath(path1)); + profile_properties1->state().ReplaceValue(hermes::profile::kInactive); + HermesProfileClient::Properties* profile_properties2 = + HermesProfileClient::Get()->GetProperties(dbus::ObjectPath(path2)); + profile_properties2->state().ReplaceValue(hermes::profile::kPending); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(2u, NumObserverEvents()); + + profiles = GetESimProfiles(); + EXPECT_EQ(4u, profiles.size()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[0].state()); + EXPECT_EQ(CellularESimProfile::State::kPending, profiles[1].state()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[2].state()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[3].state()); + + // Unset prefs; no profiles should exist. + SetDevicePrefs(/*set_to_null=*/true); + EXPECT_TRUE(GetESimProfiles().empty()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, Persistent) { + AddCellularDevice(); + Init(); + SetDevicePrefs(); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Add a EUICC and profile; should be available. + AddEuicc(/*euicc_num=*/1); + AddProfile(/*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/"code1"); + EXPECT_EQ(1u, GetESimProfiles().size()); + EXPECT_EQ(1u, NumObserverEvents()); + + // Delete the old handler and create a new one; the new one will end up using + // the same PrefService as the old one. + Init(); + + // Remove EUICC; this simulates a temporary state at startup when Hermes would + // not yet have provided EUICC information. + HermesEuiccClient::Get()->GetTestInterface()->ClearEuicc( + dbus::ObjectPath(CreateTestEuiccPath(/*euicc_num=*/1))); + + // Set prefs; the handler should read from the old prefs and should still have + // a profile available. + SetDevicePrefs(); + EXPECT_EQ(1u, GetESimProfiles().size()); + + // Now, refresh the list. + base::RunLoop run_loop; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); + + // Because the list was refreshed, we now expect GetESimProfiles() to return + // an empty list. + EXPECT_TRUE(GetESimProfiles().empty()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + RefreshProfileList_AcquireLockInterally) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + Init(); + SetDevicePrefs(); + + base::RunLoop run_loop; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + RefreshProfileList_ProvideAlreadyAcquiredLock) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + Init(); + SetDevicePrefs(); + + std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock = + InhibitCellularScanning(); + + base::RunLoop run_loop; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop.Quit(); + }), + std::move(inhibit_lock)); + run_loop.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + RefreshProfileList_Failure) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + Init(); + SetDevicePrefs(); + + QueueEuiccErrorStatus(); + + base::RunLoop run_loop; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + // Failures are indicated via a null return value. + EXPECT_FALSE(inhibit_lock); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + RefreshProfileList_MultipleSimultaneousRequests) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + + Init(); + SetDevicePrefs(); + + base::RunLoop run_loop1; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop1.Quit(); + })); + + base::RunLoop run_loop2; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop2.Quit(); + })); + + run_loop1.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); + run_loop2.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + RefreshesAutomaticallyWhenNotSeenBefore) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); + + Init(); + base::Value::List euicc_paths_from_prefs = GetEuiccListFromPrefs(); + EXPECT_TRUE(euicc_paths_from_prefs.empty()); + + // Set device prefs; a new auto-refresh should have started but not yet + // completed. + SetDevicePrefs(); + euicc_paths_from_prefs = GetEuiccListFromPrefs(); + EXPECT_TRUE(euicc_paths_from_prefs.empty()); + EXPECT_FALSE(HasAutoRefreshedEuicc(/*euicc_num=*/1)); + + FastForwardProfileRefreshDelay(); + base::RunLoop().RunUntilIdle(); + euicc_paths_from_prefs = GetEuiccListFromPrefs(); + EXPECT_EQ(1u, euicc_paths_from_prefs.size()); + EXPECT_EQ(CreateTestEuiccPath(/*euicc_num=*/1), + euicc_paths_from_prefs[0].GetString()); + EXPECT_TRUE(HasAutoRefreshedEuicc(/*euicc_num=*/1)); + EXPECT_TRUE(GetLastRefreshProfilesRestoreSlotArg()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + IgnoresESimProfilesWithNoIccid) { + const char kTestIccid[] = "1245671234567"; + AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); + Init(); + SetDevicePrefs(); + + // Verify that no profiles are added if there are some profiles that have + // not received iccid updates yet. + dbus::ObjectPath profile_path1 = AddProfile( + /*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/std::string(), + hermes::profile::ProfileClass::kOperational, + /*blank_iccid=*/true); + dbus::ObjectPath profile_path2 = AddProfile( + /*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/std::string(), + hermes::profile::ProfileClass::kOperational, + /*blank_iccid=*/false); + EXPECT_TRUE(GetESimProfiles().empty()); + + // Verify that profile object is created after iccid property is set. + HermesProfileClient::Properties* properties1 = + HermesProfileClient::Get()->GetProperties(profile_path1); + properties1->iccid().ReplaceValue(kTestIccid); + base::RunLoop().RunUntilIdle(); + + std::vector<CellularESimProfile> esim_profiles = GetESimProfiles(); + EXPECT_EQ(2u, esim_profiles.size()); + EXPECT_EQ(kTestIccid, esim_profiles[0].iccid()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + SkipsAutomaticRefreshIfNoCellularDevice) { + Init(); + AddEuicc(/*euicc_num=*/1, /*also_add_to_prefs=*/false); + SetDevicePrefs(); + + // Verify that no EUICCs exist in pref. + base::Value::List euicc_paths_from_prefs = GetEuiccListFromPrefs(); + EXPECT_TRUE(euicc_paths_from_prefs.empty()); + + // Verify that EUICCs are refreshed after the cellular device is added. + AddCellularDevice(); + FastForwardProfileRefreshDelay(); + euicc_paths_from_prefs = GetEuiccListFromPrefs(); + EXPECT_EQ(1u, euicc_paths_from_prefs.size()); + EXPECT_EQ(CreateTestEuiccPath(/*euicc_num=*/1), + euicc_paths_from_prefs[0].GetString()); +} + +TEST_F(CellularESimProfileHandlerImplTest_DBusMigrationEnabled, + DisableActiveESimProfile) { + AddCellularDevice(); + AddEuicc(/*euicc_num=*/1); + Init(); + SetDevicePrefs(); + base::HistogramTester histogram_tester; + // Add one active profile and another inactive profiles. + AddProfile( + /*euicc_num=*/1, hermes::profile::State::kActive, + /*activation_code=*/std::string()); + AddProfile( + /*euicc_num=*/1, hermes::profile::State::kInactive, + /*activation_code=*/std::string()); + std::vector<CellularESimProfile> profiles = GetESimProfiles(); + EXPECT_EQ(2u, profiles.size()); + EXPECT_EQ(CellularESimProfile::State::kActive, profiles[0].state()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[1].state()); + DisableActiveESimProfile(); + + // Now, refresh the list. + base::RunLoop run_loop; + RefreshProfileList( + /*euicc_num=*/1, + base::BindLambdaForTesting( + [&](std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock) { + EXPECT_TRUE(inhibit_lock); + run_loop.Quit(); + })); + run_loop.Run(); + EXPECT_FALSE(GetLastRefreshProfilesRestoreSlotArg()); + + profiles = GetESimProfiles(); + EXPECT_EQ(2u, profiles.size()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[0].state()); + EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[1].state()); + histogram_tester.ExpectBucketCount(kDisableProfileResultHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/1); +} } // namespace ash
diff --git a/chromeos/ash/components/network/cellular_esim_uninstall_handler.h b/chromeos/ash/components/network/cellular_esim_uninstall_handler.h index ad9fc26..4271b8d 100644 --- a/chromeos/ash/components/network/cellular_esim_uninstall_handler.h +++ b/chromeos/ash/components/network/cellular_esim_uninstall_handler.h
@@ -52,6 +52,25 @@ class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularESimUninstallHandler : public NetworkStateHandlerObserver { public: + // TODO(b/271854446): Make these private once the migration has landed. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + enum class UninstallESimResult { + kSuccess = 0, + kNetworkNotFound = 1, + kDisconnectFailed = 2, + kInhibitFailed = 3, + kRefreshProfilesFailed = 4, + kDisableProfileFailed = 5, + kUninstallProfileFailed = 6, + kRemoveServiceFailed = 7, + kMaxValue = kRemoveServiceFailed + }; + + // Timeout when waiting for network list change after removing network + // service. Service removal continues with next service. + static const base::TimeDelta kNetworkListWaitTimeout; + CellularESimUninstallHandler(); CellularESimUninstallHandler(const CellularESimUninstallHandler&) = delete; CellularESimUninstallHandler& operator=(const CellularESimUninstallHandler&) = @@ -88,19 +107,6 @@ void OnShuttingDown() override; friend class CellularESimUninstallHandlerTest; - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, Success); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, - Success_AlreadyDisabled); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, DisconnectFailure); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, HermesFailure); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, MultipleRequests); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, - StubCellularNetwork); - FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, ResetEuiccMemory); - - // Timeout when waiting for network list change after removing network - // service. Service removal continues with next service. - static const base::TimeDelta kNetworkListWaitTimeout; enum class UninstallState { kIdle, @@ -116,20 +122,6 @@ friend std::ostream& operator<<(std::ostream& stream, const UninstallState& step); - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class UninstallESimResult { - kSuccess = 0, - kNetworkNotFound = 1, - kDisconnectFailed = 2, - kInhibitFailed = 3, - kRefreshProfilesFailed = 4, - kDisableProfileFailed = 5, - kUninstallProfileFailed = 6, - kRemoveServiceFailed = 7, - kMaxValue = kRemoveServiceFailed - }; - // Represents ESim uninstallation request parameters. Requests are queued and // processed one at a time. |esim_profile_path| and |euicc_path| are nullopt // for stale eSIM service removal requests. These requests skip directly to
diff --git a/chromeos/ash/components/network/cellular_esim_uninstall_handler_unittest.cc b/chromeos/ash/components/network/cellular_esim_uninstall_handler_unittest.cc index 76327e15..ba24855 100644 --- a/chromeos/ash/components/network/cellular_esim_uninstall_handler_unittest.cc +++ b/chromeos/ash/components/network/cellular_esim_uninstall_handler_unittest.cc
@@ -6,9 +6,11 @@ #include <memory> +#include "ash/constants/ash_features.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "chromeos/ash/components/dbus/hermes/hermes_clients.h" #include "chromeos/ash/components/dbus/hermes/hermes_euicc_client.h" @@ -54,8 +56,20 @@ } // namespace class CellularESimUninstallHandlerTest : public testing::Test { + public: + CellularESimUninstallHandlerTest(const CellularESimUninstallHandlerTest&) = + delete; + CellularESimUninstallHandlerTest& operator=( + const CellularESimUninstallHandlerTest&) = delete; + protected: - CellularESimUninstallHandlerTest() = default; + explicit CellularESimUninstallHandlerTest(bool enable_dbus_migration) { + if (enable_dbus_migration) { + feature_list_.InitAndEnableFeature(ash::features::kSmdsDbusMigration); + } else { + feature_list_.InitAndDisableFeature(ash::features::kSmdsDbusMigration); + } + } ~CellularESimUninstallHandlerTest() override = default; // testing::Test @@ -228,11 +242,11 @@ ->last_service_count_removal_for_testing_; } - private: base::test::SingleThreadTaskEnvironment task_environment_{ base::test::SingleThreadTaskEnvironment::MainThreadType::UI, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + base::test::ScopedFeatureList feature_list_; base::HistogramTester histogram_tester_; std::unique_ptr<NetworkStateHandler> network_state_handler_; std::unique_ptr<NetworkDeviceHandler> network_device_handler_; @@ -249,7 +263,35 @@ TestingPrefServiceSimple device_prefs_; }; -TEST_F(CellularESimUninstallHandlerTest, Success) { +class CellularESimUninstallHandlerTest_DBusMigrationDisabled + : public CellularESimUninstallHandlerTest { + public: + CellularESimUninstallHandlerTest_DBusMigrationDisabled( + const CellularESimUninstallHandlerTest_DBusMigrationDisabled&) = delete; + CellularESimUninstallHandlerTest_DBusMigrationDisabled& operator=( + const CellularESimUninstallHandlerTest_DBusMigrationDisabled&) = delete; + + protected: + CellularESimUninstallHandlerTest_DBusMigrationDisabled() + : CellularESimUninstallHandlerTest(/*enable_dbus_migration=*/false) {} + ~CellularESimUninstallHandlerTest_DBusMigrationDisabled() override = default; +}; + +class CellularESimUninstallHandlerTest_DBusMigrationEnabled + : public CellularESimUninstallHandlerTest { + public: + CellularESimUninstallHandlerTest_DBusMigrationEnabled( + const CellularESimUninstallHandlerTest_DBusMigrationEnabled&) = delete; + CellularESimUninstallHandlerTest_DBusMigrationEnabled& operator=( + const CellularESimUninstallHandlerTest_DBusMigrationEnabled&) = delete; + + protected: + CellularESimUninstallHandlerTest_DBusMigrationEnabled() + : CellularESimUninstallHandlerTest(/*enable_dbus_migration=*/true) {} + ~CellularESimUninstallHandlerTest_DBusMigrationEnabled() override = default; +}; + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, Success) { Init(); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); @@ -273,7 +315,8 @@ ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess); } -TEST_F(CellularESimUninstallHandlerTest, Success_AlreadyDisabled) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, + Success_AlreadyDisabled) { Init(/*is_first_profile_active=*/false); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); @@ -297,7 +340,8 @@ ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess); } -TEST_F(CellularESimUninstallHandlerTest, DisconnectFailure) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, + DisconnectFailure) { Init(); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); @@ -314,7 +358,7 @@ CellularESimUninstallHandler::UninstallESimResult::kDisconnectFailed); } -TEST_F(CellularESimUninstallHandlerTest, HermesFailure) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, HermesFailure) { Init(); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); @@ -333,7 +377,8 @@ kRefreshProfilesFailed); } -TEST_F(CellularESimUninstallHandlerTest, MultipleRequests) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, + MultipleRequests) { Init(); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath2)); @@ -374,7 +419,8 @@ /*expected_count=*/2); } -TEST_F(CellularESimUninstallHandlerTest, ResetEuiccMemory) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, + ResetEuiccMemory) { Init(); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath2)); @@ -405,7 +451,188 @@ /*expected_count=*/1); } -TEST_F(CellularESimUninstallHandlerTest, StubCellularNetwork) { +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationDisabled, + StubCellularNetwork) { + Init(); + + // Remove shill eSIM service and add a corresponding stub service. + ShillServiceClient::Get()->GetTestInterface()->RemoveService( + kTestNetworkServicePath); + base::RunLoop().RunUntilIdle(); + AddStub(kTestCellularIccid, kDefaultEid); + + // Verify that removing the eSIM profile succeeds. + base::RunLoop run_loop; + bool success; + UninstallESim(run_loop, kTestCellularIccid, kTestCarrierProfilePath, success); + run_loop.Run(); + EXPECT_TRUE(success); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, Success) { + Init(); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + + base::RunLoop run_loop; + bool status; + UninstallESim(run_loop, kTestCellularIccid, kTestCarrierProfilePath, status); + HandleNetworkDisconnect(/*should_fail=*/false); + run_loop.Run(); + + // Verify that the esim profile and shill service configuration are removed + // properly. + HermesEuiccClient::Properties* euicc_properties = + HermesEuiccClient::Get()->GetProperties( + dbus::ObjectPath(kDefaultEuiccPath)); + ASSERT_TRUE(euicc_properties); + EXPECT_EQ(1u, euicc_properties->profiles().value().size()); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(status); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid)); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, + Success_AlreadyDisabled) { + Init(/*is_first_profile_active=*/false); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + + base::RunLoop run_loop; + bool status; + UninstallESim(run_loop, kTestCellularIccid, kTestCarrierProfilePath, status); + HandleNetworkDisconnect(/*should_fail=*/false); + run_loop.Run(); + + // Verify that the esim profile and shill service configuration are removed + // properly. + HermesEuiccClient::Properties* euicc_properties = + HermesEuiccClient::Get()->GetProperties( + dbus::ObjectPath(kDefaultEuiccPath)); + ASSERT_TRUE(euicc_properties); + EXPECT_EQ(1u, euicc_properties->profiles().value().size()); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(status); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid)); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, + DisconnectFailure) { + Init(); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + + bool status; + base::RunLoop run_loop; + UninstallESim(run_loop, kTestCellularIccid, kTestCarrierProfilePath, status); + HandleNetworkDisconnect(/*should_fail=*/true); + run_loop.Run(); + EXPECT_FALSE(status); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(GetSmdpAddressFromPref(kTestCellularIccid)); + + ExpectResult( + CellularESimUninstallHandler::UninstallESimResult::kDisconnectFailed); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, HermesFailure) { + Init(); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + + HermesEuiccClient::Get()->GetTestInterface()->QueueHermesErrorStatus( + HermesResponseStatus::kErrorUnknown); + bool status; + base::RunLoop run_loop; + UninstallESim(run_loop, kTestCellularIccid, kTestCarrierProfilePath, status); + HandleNetworkDisconnect(/*should_fail=*/false); + run_loop.Run(); + EXPECT_FALSE(status); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(GetSmdpAddressFromPref(kTestCellularIccid)); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult:: + kRefreshProfilesFailed); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, + MultipleRequests) { + Init(); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath2)); + + // Make two uninstall requests back to back. + bool status1, status2; + base::RunLoop run_loop1, run_loop2; + + UninstallESim(run_loop1, kTestCellularIccid, kTestCarrierProfilePath, + status1); + UninstallESim(run_loop2, kTestCellularIccid2, kTestCarrierProfilePath2, + status2); + + // Only the first profile is connected, so only one disconnect handler is + // needed. + HandleNetworkDisconnect(/*should_fail=*/false); + + run_loop1.Run(); + EXPECT_EQ(GetLastServiceCountRemovalForTesting(), 1); + + run_loop2.Run(); + EXPECT_EQ(GetLastServiceCountRemovalForTesting(), 1); + + // Verify that both requests succeeded. + EXPECT_TRUE(status1); + EXPECT_TRUE(status2); + HermesEuiccClient::Properties* euicc_properties = + HermesEuiccClient::Get()->GetProperties( + dbus::ObjectPath(kDefaultEuiccPath)); + ASSERT_TRUE(euicc_properties); + EXPECT_TRUE(euicc_properties->profiles().value().empty()); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath2)); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid)); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid2)); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess, + /*expected_count=*/2); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, + ResetEuiccMemory) { + Init(); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath2)); + + bool status; + base::RunLoop run_loop; + ResetEuiccMemory(run_loop, status); + + HandleNetworkDisconnect(/*should_fail=*/false); + FastForward(CellularESimUninstallHandler::kNetworkListWaitTimeout); + + run_loop.Run(); + + // Verify that both profiles were removed successfully. + EXPECT_TRUE(status); + HermesEuiccClient::Properties* euicc_properties = + HermesEuiccClient::Get()->GetProperties( + dbus::ObjectPath(kDefaultEuiccPath)); + ASSERT_TRUE(euicc_properties); + EXPECT_TRUE(euicc_properties->profiles().value().empty()); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath)); + EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath2)); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid)); + EXPECT_FALSE(GetSmdpAddressFromPref(kTestCellularIccid2)); + EXPECT_EQ(GetLastServiceCountRemovalForTesting(), 2); + + ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess, + /*expected_count=*/1); +} + +TEST_F(CellularESimUninstallHandlerTest_DBusMigrationEnabled, + StubCellularNetwork) { Init(); // Remove shill eSIM service and add a corresponding stub service.
diff --git a/chromeos/ash/components/network/cellular_utils.cc b/chromeos/ash/components/network/cellular_utils.cc index 664a4227e..5a76b47 100644 --- a/chromeos/ash/components/network/cellular_utils.cc +++ b/chromeos/ash/components/network/cellular_utils.cc
@@ -27,13 +27,19 @@ HermesEuiccClient::Properties* euicc_properties) { base::flat_set<dbus::ObjectPath> profile_paths; - for (const dbus::ObjectPath& path : - euicc_properties->installed_carrier_profiles().value()) { - profile_paths.insert(path); - } - for (const dbus::ObjectPath& path : - euicc_properties->pending_carrier_profiles().value()) { - profile_paths.insert(path); + if (features::IsSmdsDbusMigrationEnabled()) { + for (const dbus::ObjectPath& path : euicc_properties->profiles().value()) { + profile_paths.insert(path); + } + } else { + for (const dbus::ObjectPath& path : + euicc_properties->installed_carrier_profiles().value()) { + profile_paths.insert(path); + } + for (const dbus::ObjectPath& path : + euicc_properties->pending_carrier_profiles().value()) { + profile_paths.insert(path); + } } return profile_paths;
diff --git a/chromeos/ash/components/osauth/public/BUILD.gn b/chromeos/ash/components/osauth/public/BUILD.gn index 2d71bc5..b4b2411d 100644 --- a/chromeos/ash/components/osauth/public/BUILD.gn +++ b/chromeos/ash/components/osauth/public/BUILD.gn
@@ -14,8 +14,10 @@ "//components/account_id", ] sources = [ + "auth_attempt_consumer.h", "auth_factor_engine.h", "auth_factor_engine_factory.h", + "auth_factor_status_consumer.h", "auth_parts.h", "auth_session_storage.h", "common_types.h",
diff --git a/chromeos/ash/components/osauth/public/auth_attempt_consumer.h b/chromeos/ash/components/osauth/public/auth_attempt_consumer.h new file mode 100644 index 0000000..a96e0c2 --- /dev/null +++ b/chromeos/ash/components/osauth/public/auth_attempt_consumer.h
@@ -0,0 +1,83 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_ATTEMPT_CONSUMER_H_ +#define CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_ATTEMPT_CONSUMER_H_ + +#include "base/component_export.h" +#include "base/functional/callback.h" +#include "chromeos/ash/components/osauth/public/common_types.h" + +namespace ash { + +class AuthFactorStatusConsumer; + +// Opaque class that represents state of current user authentication attempt, +// used to interact with particular AuthFactors via API. +class AuthHubConnector; + +// Interface between AuthHub and a UI surface that requests authentication from +// AuthHub. It is used by AuthHub to notify surface about result of the +// authentication attempt. +class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthAttemptConsumer { + public: + virtual ~AuthAttemptConsumer() = default; + + // Called by AuthHub when `RequestAuthentication` can not be performed + // in current state. + // One example would be when when there is another user authentication + // attempt happening with "higher" or equal priority: + // When session is locked, attempt to enter settings (e.g. triggered + // by some script) would be automatically rejected. + // + // Implementing surface might retry an attempt, but should apply + // reasonable back-off logic. + virtual void OnUserAuthAttemptRejected() = 0; + + // AuthHub would call this method to confirm start of user auth flow, + // and obtain a reference to `AuthFactorStatusConsumer` that would + // receive individual factor updates. + // AuthHub would immediately call `InitializeUi` on the `out_consumer` + // after this call. + // AuthHub expects `out_consumer` to be valid, and guarantees that + // reference to `connector` would be valid until either method is called + // to indicating end of authentication flow: + // * `OnUserAuthAttemptCancelled` + // * `OnAccountNotFound` + // * `OnUserAuthSuccess` + virtual void OnUserAuthAttemptConfirmed( + AuthHubConnector* connector, + base::raw_ptr<AuthFactorStatusConsumer>& out_consumer) = 0; + + // AuthHub would call this method in edge-case scenario when authentication + // was requested for account that is not present on the device. + virtual void OnAccountNotFound() = 0; + + // AuthHub would this method if user auth flow is cancelled for some + // reason. + // For example, user verification for WebAuthN would be cancelled if + // session gets locked (another `RequestAuthentication` with `kScreenUnlock` + // purpose is called). + // + // This notification is similar to `OnUserAuthAttemptRejected`, but + // is called if `OnUserAuthAttemptConfirmed` was called before. + // Similar to `OnUserAuthAttemptRejected` surface might retry an attempt, + // but should apply reasonable back-off logic. + virtual void OnUserAuthAttemptCancelled() = 0; + + // This method is called by AuthHub upon each failed attempt. + // UI surface might handle it in a special way (e.g. suggest the recovery). + virtual void OnFactorAttemptFailed(AshAuthFactor factor) = 0; + + // AuthHub would call this method upon successful user authentication. + // `factor` indicates a factor that was used to successfully authenticate + // the user. + // `token` is a reference to resulting UserContext in `AuthSessionStorage`. + virtual void OnUserAuthSuccess(AshAuthFactor factor, + const AuthProofToken& token) = 0; +}; + +} // namespace ash + +#endif // CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_ATTEMPT_CONSUMER_H_
diff --git a/chromeos/ash/components/osauth/public/auth_factor_status_consumer.h b/chromeos/ash/components/osauth/public/auth_factor_status_consumer.h new file mode 100644 index 0000000..2744f39 --- /dev/null +++ b/chromeos/ash/components/osauth/public/auth_factor_status_consumer.h
@@ -0,0 +1,97 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_FACTOR_STATUS_CONSUMER_H_ +#define CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_FACTOR_STATUS_CONSUMER_H_ + +#include "base/component_export.h" +#include "base/containers/enum_set.h" +#include "base/containers/flat_map.h" +#include "chromeos/ash/components/osauth/public/common_types.h" + +namespace ash { + +// Opaque class that represents state of current user authentication attempt, +// used to interact with particular AuthFactors via API. +class AuthHubConnector; + +// Authentication factor state. This is a superset of states for all factors, +// so some states might not be applicable for individual factors. +enum class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) AuthFactorState { + kCheckingForPresence, + kEngineError, + kFactorReady, + kDisabledByPolicy, + kDisabledStrongFactorRequired, + kLockedOutIndefinite, + kLockedOutTemporary, + kDisabledParallelAttempt, + kDisabledFactorSpecific, + kOngoingAttempt, + kMaxValue = kOngoingAttempt, +}; + +using AuthFactorStateSet = base::EnumSet<AuthFactorState, + AuthFactorState::kCheckingForPresence, + AuthFactorState::kMaxValue>; + +using FactorsStatusMap = base::flat_map<AshAuthFactor, AuthFactorState>; + +// Interface between AuthHub and a UI panel that is embedded into authentication +// surface and displays available factors and their statuses. +class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_OSAUTH) + AuthFactorStatusConsumer { + public: + virtual ~AuthFactorStatusConsumer() = default; + + // `AuthHub` calls this method, immediately after it gets a reference to + // consumer from `AuthAttemptConsumer::OnUserAuthAttemptConfirmed` call. + // It is expected that all factors are in `kCheckingForPresence` state + // initially, and subsequent `OnFactorStatusesChanged` would provide an + // update. The `connector` provides a way to interact with individual + // factors. + virtual void InitializeUi(AuthFactorsSet factors, + AuthHubConnector* connector) = 0; + + // This should be a very rare event, happening only when AuthHub's + // cached data on available factors is stale, and querying AuthEngines + // results in a different set of factors. Map includes all present factors + // and their statuses. + // It is expected that UI might be fully rebuilt in this case. + virtual void OnFactorListChanged(FactorsStatusMap factors_with_status) = 0; + + // This method would be called by AuthHub when some factor's state changes. + // `incremental_update` contains data only for updated factor statuses. + // + // While usually there would be single element in the map, there are few + // cases when update would affect multiple factors: + // * First update after `InitializeUi`, which would provide initial state; + // * Authentication attempt with particular factor would change state of + // that factor to `kOngoingAttempt` and all other factors to + // `kDisabledParallelAttempt`; + // * Policy change might affect multiple factors. + virtual void OnFactorStatusesChanged(FactorsStatusMap incremental_update) = 0; + + // This method would be called by AuthHub upon attempt failure. + // UI can provide additional visual feedback in this case. + // The order of notifications is the following: + // 1) `OnFactorStatusesChanged` + // 2) `OnAuthenticationFailure` + virtual void OnFactorAuthFailure(AshAuthFactor factor) = 0; + + // This method would be called by AuthHub upon auth success. + // There will be no prior `OnFactorStatusesChanged` call, factor would + // still be in `kOngoingAttempt` state, to prevent additional attempts. + virtual void OnFactorAuthSuccess(AshAuthFactor factor) = 0; + + // This method would be called by AuthHub to indicate end of interaction + // between AuthHub and UI panel. After this call AuthHub drops a reference + // to this object and `connector` object from `InitializeUi` call should also + // be considered invalid. + virtual void OnEndAuthentication() = 0; +}; + +} // namespace ash + +#endif // CHROMEOS_ASH_COMPONENTS_OSAUTH_PUBLIC_AUTH_FACTOR_STATUS_CONSUMER_H_
diff --git a/chromeos/ash/components/osauth/public/common_types.h b/chromeos/ash/components/osauth/public/common_types.h index b9281d61..80ad118 100644 --- a/chromeos/ash/components/osauth/public/common_types.h +++ b/chromeos/ash/components/osauth/public/common_types.h
@@ -7,6 +7,7 @@ #include <string> +#include "base/containers/enum_set.h" #include "base/unguessable_token.h" namespace ash { @@ -50,6 +51,10 @@ kLegacyFingerprint, }; +using AuthFactorsSet = base::EnumSet<AshAuthFactor, + AshAuthFactor::kGaiaPassword, + AshAuthFactor::kLegacyFingerprint>; + enum AuthHubMode { kNone, // State before initialization kLoginScreen, // Login screen, no profile data available.
diff --git a/chromeos/ash/components/phonehub/BUILD.gn b/chromeos/ash/components/phonehub/BUILD.gn index 1663294..111345fd 100644 --- a/chromeos/ash/components/phonehub/BUILD.gn +++ b/chromeos/ash/components/phonehub/BUILD.gn
@@ -139,6 +139,7 @@ "//ash/resources/vector_icons", "//ash/webui/eche_app_ui:eche_app_ui_pref", "//ash/webui/eche_app_ui:eche_connection_status", + "//ash/webui/eche_app_ui:system_info_provider", "//ash/webui/eche_app_ui/mojom:mojom", "//base", "//chromeos/ash/components/multidevice", @@ -208,6 +209,7 @@ deps = [ "//ash/constants", "//ash/webui/eche_app_ui:eche_connection_status", + "//ash/webui/eche_app_ui:system_info_provider", "//base", "//chromeos/ash/components/multidevice/logging", "//chromeos/ash/components/phonehub/proto", @@ -292,6 +294,7 @@ "//ash/constants", "//ash/webui/eche_app_ui:eche_app_ui_pref", "//ash/webui/eche_app_ui:eche_connection_status", + "//ash/webui/eche_app_ui:system_info_provider", "//base", "//base/test:test_support", "//chromeos/ash/components/multidevice",
diff --git a/chromeos/ash/components/phonehub/fake_phone_hub_manager.cc b/chromeos/ash/components/phonehub/fake_phone_hub_manager.cc index 2348770..b86c421 100644 --- a/chromeos/ash/components/phonehub/fake_phone_hub_manager.cc +++ b/chromeos/ash/components/phonehub/fake_phone_hub_manager.cc
@@ -113,5 +113,14 @@ eche_connection_status_handler_ = eche_connection_status_handler; } +void FakePhoneHubManager::SetSystemInfoProvider( + eche_app::SystemInfoProvider* system_info_provider) { + system_info_provider_ = system_info_provider; +} + +eche_app::SystemInfoProvider* FakePhoneHubManager::GetSystemInfoProvider() { + return system_info_provider_; +} + } // namespace phonehub } // namespace ash
diff --git a/chromeos/ash/components/phonehub/fake_phone_hub_manager.h b/chromeos/ash/components/phonehub/fake_phone_hub_manager.h index 82e2c82..1757e6e 100644 --- a/chromeos/ash/components/phonehub/fake_phone_hub_manager.h +++ b/chromeos/ash/components/phonehub/fake_phone_hub_manager.h
@@ -139,6 +139,9 @@ void SetEcheConnectionStatusHandler( eche_app::EcheConnectionStatusHandler* eche_connection_status_handler) override; + void SetSystemInfoProvider( + eche_app::SystemInfoProvider* system_info_provider) override; + eche_app::SystemInfoProvider* GetSystemInfoProvider() override; FakeDoNotDisturbController fake_do_not_disturb_controller_; FakeFeatureStatusProvider fake_feature_status_provider_; @@ -161,6 +164,7 @@ AppStreamManager app_stream_manager_; eche_app::EcheConnectionStatusHandler* eche_connection_status_handler_ = nullptr; + eche_app::SystemInfoProvider* system_info_provider_ = nullptr; absl::optional<base::Time> host_last_seen_timestamp_ = absl::nullopt; };
diff --git a/chromeos/ash/components/phonehub/phone_hub_manager.h b/chromeos/ash/components/phonehub/phone_hub_manager.h index a12487c..e63393c 100644 --- a/chromeos/ash/components/phonehub/phone_hub_manager.h +++ b/chromeos/ash/components/phonehub/phone_hub_manager.h
@@ -15,6 +15,7 @@ namespace eche_app { class EcheConnectionStatusHandler; +class SystemInfoProvider; } namespace phonehub { @@ -74,6 +75,9 @@ virtual void SetEcheConnectionStatusHandler( eche_app::EcheConnectionStatusHandler* eche_connection_status_handler) = 0; + virtual void SetSystemInfoProvider( + eche_app::SystemInfoProvider* system_info_provider) = 0; + virtual eche_app::SystemInfoProvider* GetSystemInfoProvider() = 0; // Retrieves the timestamp of the last successful discovery for active host, // or nullopt if it hasn't been seen in the current Chrome session.
diff --git a/chromeos/ash/components/phonehub/phone_hub_manager_impl.cc b/chromeos/ash/components/phonehub/phone_hub_manager_impl.cc index 1b70898..85e909f 100644 --- a/chromeos/ash/components/phonehub/phone_hub_manager_impl.cc +++ b/chromeos/ash/components/phonehub/phone_hub_manager_impl.cc
@@ -7,6 +7,7 @@ #include <memory> #include "ash/constants/ash_features.h" +#include "ash/webui/eche_app_ui/system_info_provider.h" #include "chromeos/ash/components/phonehub/app_stream_launcher_data_model.h" #include "chromeos/ash/components/phonehub/app_stream_manager.h" #include "chromeos/ash/components/phonehub/browser_tabs_metadata_fetcher.h" @@ -292,6 +293,15 @@ eche_connection_status_handler_); } +void PhoneHubManagerImpl::SetSystemInfoProvider( + eche_app::SystemInfoProvider* system_info_provider) { + system_info_provider_ = system_info_provider; +} + +eche_app::SystemInfoProvider* PhoneHubManagerImpl::GetSystemInfoProvider() { + return system_info_provider_; +} + // NOTE: These should be destroyed in the opposite order of how these objects // are initialized in the constructor. void PhoneHubManagerImpl::Shutdown() {
diff --git a/chromeos/ash/components/phonehub/phone_hub_manager_impl.h b/chromeos/ash/components/phonehub/phone_hub_manager_impl.h index 01dbdac..109f760a 100644 --- a/chromeos/ash/components/phonehub/phone_hub_manager_impl.h +++ b/chromeos/ash/components/phonehub/phone_hub_manager_impl.h
@@ -96,6 +96,9 @@ void SetEcheConnectionStatusHandler( eche_app::EcheConnectionStatusHandler* eche_connection_status_handler) override; + void SetSystemInfoProvider( + eche_app::SystemInfoProvider* system_info_provider) override; + eche_app::SystemInfoProvider* GetSystemInfoProvider() override; private: // KeyedService: @@ -138,6 +141,7 @@ std::unique_ptr<PingManager> ping_manager_; eche_app::EcheConnectionStatusHandler* eche_connection_status_handler_ = nullptr; + eche_app::SystemInfoProvider* system_info_provider_ = nullptr; }; } // namespace phonehub
diff --git a/chromeos/ash/components/proximity_auth/proximity_auth_pref_manager.h b/chromeos/ash/components/proximity_auth/proximity_auth_pref_manager.h index d050a991..93eec20fd 100644 --- a/chromeos/ash/components/proximity_auth/proximity_auth_pref_manager.h +++ b/chromeos/ash/components/proximity_auth/proximity_auth_pref_manager.h
@@ -52,17 +52,6 @@ virtual void SetPromotionShownCount(int count) = 0; virtual int GetPromotionShownCount() const = 0; - // Getter for whether EasyUnlock is allowed for ChromeOS login (in addition to - // screen lock). - // TODO(b/227674947): Delete now that Sign in with Smart Lock is deprecated. - virtual bool IsChromeOSLoginAllowed() const = 0; - - // Setter and getter for whether EasyUnlock is enabled for ChromeOS login (in - // addition to screen lock). - // TODO(b/227674947): Delete now that Sign in with Smart Lock is deprecated. - virtual void SetIsChromeOSLoginEnabled(bool is_enabled) = 0; - virtual bool IsChromeOSLoginEnabled() const = 0; - // Setter and getter for whether the "Signin with Smart Lock is disabled" // message on the login screen has been shown. // TODO(b/227674947): Delete now that Sign in with Smart Lock is deprecated.
diff --git a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc index 9eda991c..7d1dc869 100644 --- a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc +++ b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc
@@ -94,21 +94,6 @@ return pref_service_->GetInteger(prefs::kProximityAuthPromotionShownCount); } -bool ProximityAuthProfilePrefManager::IsChromeOSLoginAllowed() const { - return pref_service_->GetBoolean( - ash::multidevice_setup::kSmartLockSigninAllowedPrefName); -} - -void ProximityAuthProfilePrefManager::SetIsChromeOSLoginEnabled( - bool is_enabled) { - return pref_service_->SetBoolean(prefs::kProximityAuthIsChromeOSLoginEnabled, - is_enabled); -} - -bool ProximityAuthProfilePrefManager::IsChromeOSLoginEnabled() const { - return pref_service_->GetBoolean(prefs::kProximityAuthIsChromeOSLoginEnabled); -} - void ProximityAuthProfilePrefManager::SetHasShownLoginDisabledMessage( bool has_shown) { // This is persisted within SyncPrefsToLocalState() instead, since the local
diff --git a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.h b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.h index 28d3e36..0ac2603 100644 --- a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.h +++ b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager.h
@@ -52,9 +52,6 @@ int64_t GetLastPromotionCheckTimestampMs() const override; void SetPromotionShownCount(int count) override; int GetPromotionShownCount() const override; - bool IsChromeOSLoginAllowed() const override; - void SetIsChromeOSLoginEnabled(bool is_enabled) override; - bool IsChromeOSLoginEnabled() const override; void SetHasShownLoginDisabledMessage(bool has_shown) override; bool HasShownLoginDisabledMessage() const override;
diff --git a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager_unittest.cc b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager_unittest.cc index 25634ba..81c6e2af 100644 --- a/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager_unittest.cc +++ b/chromeos/ash/components/proximity_auth/proximity_auth_profile_pref_manager_unittest.cc
@@ -79,14 +79,4 @@ EXPECT_EQ(2, pref_manager_->GetPromotionShownCount()); } -TEST_F(ProximityAuthProfilePrefManagerTest, IsChromeOSLoginEnabled) { - EXPECT_FALSE(pref_manager_->IsChromeOSLoginEnabled()); - - pref_manager_->SetIsChromeOSLoginEnabled(true); - EXPECT_TRUE(pref_manager_->IsChromeOSLoginEnabled()); - - pref_manager_->SetIsChromeOSLoginEnabled(false); - EXPECT_FALSE(pref_manager_->IsChromeOSLoginEnabled()); -} - } // namespace proximity_auth
diff --git a/chromeos/ash/services/auth_factor_config/auth_factor_config.cc b/chromeos/ash/services/auth_factor_config/auth_factor_config.cc index 42d085f2..8488f96 100644 --- a/chromeos/ash/services/auth_factor_config/auth_factor_config.cc +++ b/chromeos/ash/services/auth_factor_config/auth_factor_config.cc
@@ -152,14 +152,48 @@ DCHECK(features::IsCryptohomeRecoveryEnabled()); const auto* user = ::user_manager::UserManager::Get()->GetPrimaryUser(); CHECK(user); + + // TODO(272474463): remove the child user check. + if (user->IsChild()) { + std::move(callback).Run(false); + return; + } + const PrefService* prefs = quick_unlock_storage_->GetPrefService(*user); CHECK(prefs); - // TODO(272474463): remove the child user check. - bool editable = - prefs->IsUserModifiablePreference(prefs::kRecoveryFactorBehavior) && - !user->IsChild(); - std::move(callback).Run(editable); + if (prefs->IsUserModifiablePreference(prefs::kRecoveryFactorBehavior)) { + std::move(callback).Run(true); + return; + } + + // TODO(b:270693613): At this point, we know that the user should not be + // able to modify recovery authentication. However, we allow turning + // recovery on/off in case the currently configured value does not agree + // with the mandated value, e.g. due to a policy change after enrollment. + // For example, users should be able to turn on recovery if it is + // enforced to be enabled by a policy but is not actually configured for + // some reason. + // Once the feature in the linked bug is implemented (automatically + // enabling/disabling recovery based on policy values), we might consider + // removing this check. + auto* user_context = + quick_unlock_storage_->GetUserContext(user, auth_token); + if (!user_context) { + LOG(ERROR) << "Invalid auth token"; + std::move(callback).Run(false); + return; + } + const auto& config = user_context->GetAuthFactorsConfiguration(); + const bool is_configured = + config.HasConfiguredFactor(cryptohome::AuthFactorType::kRecovery); + + if (is_configured != prefs->GetBoolean(prefs::kRecoveryFactorBehavior)) { + std::move(callback).Run(true); + return; + } + + std::move(callback).Run(false); return; } case mojom::AuthFactor::kPin: {
diff --git a/chromeos/ash/services/cellular_setup/esim_profile.cc b/chromeos/ash/services/cellular_setup/esim_profile.cc index af0b11a..30f3a47 100644 --- a/chromeos/ash/services/cellular_setup/esim_profile.cc +++ b/chromeos/ash/services/cellular_setup/esim_profile.cc
@@ -445,6 +445,11 @@ bool ESimProfile::ProfileExistsOnEuicc() { HermesEuiccClient::Properties* euicc_properties = HermesEuiccClient::Get()->GetProperties(euicc_->path()); + + if (features::IsSmdsDbusMigrationEnabled()) { + return base::Contains(euicc_properties->profiles().value(), path_); + } + const std::vector<dbus::ObjectPath>& profile_paths = IsProfileInstalled() ? euicc_properties->installed_carrier_profiles().value()
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index e29f4c2..64d646f 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -4052,6 +4052,9 @@ <message name="IDS_SETTINGS_APN_ZERO_STATE_DESCRIPTION" desc="Text explaining there is no APN information to show because the network has not been attempted to be connected with, and that the user might need to add a custom APN."> You are not connected yet. If your mobile carrier recommends a custom APN, enter the APN information by selecting "+ New APN" </message> + <message name="IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE" desc="Error message displayed when a cellular network fails to connect due to APN-related reasons, informing the user that none of the enabled custom APNs were successful in being used to connect."> + Can't connect to any enabled custom APNs. Contact your mobile carrier for more information. + </message> <message name="IDS_SETTINGS_APN_MENU_DETAILS" desc="Details button in three dotted menu for APNs"> Details </message>
diff --git a/chromeos/chromeos_strings_grd/IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE.png.sha1 new file mode 100644 index 0000000..22a0b704 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE.png.sha1
@@ -0,0 +1 @@ +581f228f9f5ef6fe35b13cccb7ba080bd0a14fc2 \ No newline at end of file
diff --git a/chromeos/components/quick_answers/BUILD.gn b/chromeos/components/quick_answers/BUILD.gn index 5a53a8be..fcae7b1c 100644 --- a/chromeos/components/quick_answers/BUILD.gn +++ b/chromeos/components/quick_answers/BUILD.gn
@@ -42,6 +42,8 @@ "utils/spell_check_language.h", "utils/spell_checker.cc", "utils/spell_checker.h", + "utils/translation_v2_utils.cc", + "utils/translation_v2_utils.h", "utils/unit_conversion_constants.cc", "utils/unit_conversion_constants.h", "utils/unit_converter.cc", @@ -105,12 +107,14 @@ ":quick_answers", "//base", "//base/test:test_support", + "//chrome/common:constants", "//chromeos/components/quick_answers/public/cpp:cpp", "//chromeos/components/quick_answers/public/cpp:prefs", "//chromeos/constants:constants", "//chromeos/services/assistant/public/shared", "//chromeos/services/machine_learning/public/cpp:stub", "//chromeos/services/machine_learning/public/mojom", + "//content/test:test_support", "//google_apis", "//services/data_decoder/public/cpp:test_support", "//services/network:test_support",
diff --git a/chromeos/components/quick_answers/DEPS b/chromeos/components/quick_answers/DEPS index 78c3990..384524a 100644 --- a/chromeos/components/quick_answers/DEPS +++ b/chromeos/components/quick_answers/DEPS
@@ -5,6 +5,7 @@ "+components/spellcheck/common", "+components/translate/core/browser", "+content/public/browser", + "+content/public/test", "+google_apis", "+services/data_decoder/public", "+third_party/hunspell",
diff --git a/chromeos/components/quick_answers/understanding/intent_generator.cc b/chromeos/components/quick_answers/understanding/intent_generator.cc index b9a6be4..85d7072 100644 --- a/chromeos/components/quick_answers/understanding/intent_generator.cc +++ b/chromeos/components/quick_answers/understanding/intent_generator.cc
@@ -17,6 +17,7 @@ #include "chromeos/components/quick_answers/utils/quick_answers_metrics.h" #include "chromeos/components/quick_answers/utils/quick_answers_utils.h" #include "chromeos/components/quick_answers/utils/spell_checker.h" +#include "chromeos/components/quick_answers/utils/translation_v2_utils.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/services/machine_learning/public/cpp/service_connection.h" #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h" @@ -140,13 +141,11 @@ } // Check that both the source and target languages are supported by the -// translation API. +// translation v2 API. bool AreTranslationLanguagesSupported(const std::string& source_language, const std::string& target_language) { - return translate::TranslateDownloadManager::IsSupportedLanguage( - source_language) && - translate::TranslateDownloadManager::IsSupportedLanguage( - target_language); + return TranslationV2Utils::IsSupported(source_language) && + TranslationV2Utils::IsSupported(target_language); } bool HasDigits(const std::string& word) {
diff --git a/chromeos/components/quick_answers/utils/spell_check_language.cc b/chromeos/components/quick_answers/utils/spell_check_language.cc index 532df621..1586825 100644 --- a/chromeos/components/quick_answers/utils/spell_check_language.cc +++ b/chromeos/components/quick_answers/utils/spell_check_language.cc
@@ -25,17 +25,30 @@ constexpr char kDownloadServerUrl[] = "https://redirector.gvt1.com/edgedl/chrome/dict/"; +constexpr char kQuickAnswersDictionarySubDirName[] = "quick_answers"; + constexpr net::NetworkTrafficAnnotationTag kNetworkTrafficAnnotationTag = net::DefineNetworkTrafficAnnotation("quick_answers_spellchecker", R"( semantics { - sender: "Quick answers Spellchecker" + sender: "Quick Answers Spellchecker" description: - "Download dictionary for Quick answers feature if necessary." - trigger: "Quick answers feature enabled." + "Download spell checker dictionary for Quick Answers feature. " + "The downloaded dictionaries are used to generate intents for " + "selected text." + trigger: "Quick Answers feature enabled." data: "The spell checking language identifier. No user identifier is " - "sent." + "sent other than user locales." destination: GOOGLE_OWNED_SERVICE + internal { + contacts { + email: "assistive-eng@google.com" + } + } + user_data { + type: OTHER + } + last_reviewed: "2023-04-11" } policy { cookies_allowed: NO @@ -49,14 +62,30 @@ } })"); -constexpr int kMaxRetries = 3; +constexpr int kMaxRetries = 1; -base::FilePath GetDictionaryFilePath(const std::string& language) { +base::FilePath GetDictionaryDirectoryPath() { base::FilePath dict_dir; - base::PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir); - base::FilePath dict_path = - spellcheck::GetVersionedFileName(language, dict_dir); - return dict_path; + if (!base::PathService::Get(chrome::DIR_APP_DICTIONARIES, &dict_dir)) { + return base::FilePath(); + } + return dict_dir.AppendASCII(kQuickAnswersDictionarySubDirName); +} + +bool EnsureDictionaryDirectoryExists() { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + + base::FilePath dict_dir = GetDictionaryDirectoryPath(); + + if (dict_dir.empty()) { + LOG(ERROR) << "Failed to resolve the dictionary directory path."; + return false; + } + + // `base::CreateDirectory` returns true if it successfully creates + // the directory or if the directory already exists. + return base::CreateDirectory(dict_dir); } GURL GetDictionaryURL(const std::string& file_name) { @@ -77,11 +106,11 @@ file.Close(); } -void RemoveDictionaryFile(const base::FilePath& file_path) { +bool RemoveDictionaryFile(const base::FilePath& file_path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); - base::DeleteFile(file_path); + return base::DeleteFile(file_path); } } // namespace @@ -96,11 +125,10 @@ void SpellCheckLanguage::Initialize(const std::string& language) { language_ = language; - dictionary_file_path_ = GetDictionaryFilePath(language); task_runner_->PostTaskAndReplyWithResult( - FROM_HERE, base::BindOnce(&base::PathExists, dictionary_file_path_), - base::BindOnce(&SpellCheckLanguage::OnPathExistsComplete, + FROM_HERE, base::BindOnce(&EnsureDictionaryDirectoryExists), + base::BindOnce(&SpellCheckLanguage::OnDictionaryDirectoryExistsComplete, weak_factory_.GetWeakPtr())); } @@ -145,6 +173,28 @@ weak_factory_.GetWeakPtr())); } +void SpellCheckLanguage::OnDictionaryDirectoryExistsComplete( + bool directory_exists) { + if (!directory_exists) { + LOG(ERROR) << "Failed to find or create the dictionary directory."; + MaybeRetryInitialize(); + return; + } + + base::FilePath dict_dir = GetDictionaryDirectoryPath(); + if (dict_dir.empty()) { + LOG(ERROR) << "Failed to resolve the dictionary directory path."; + MaybeRetryInitialize(); + return; + } + dictionary_file_path_ = spellcheck::GetVersionedFileName(language_, dict_dir); + + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&base::PathExists, dictionary_file_path_), + base::BindOnce(&SpellCheckLanguage::OnPathExistsComplete, + weak_factory_.GetWeakPtr())); +} + void SpellCheckLanguage::OnDictionaryCreated( mojo::PendingRemote<mojom::SpellCheckDictionary> dictionary) { dictionary_.reset(); @@ -159,11 +209,21 @@ } void SpellCheckLanguage::MaybeRetryInitialize() { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&RemoveDictionaryFile, dictionary_file_path_)); + task_runner_->PostTaskAndReplyWithResult( + FROM_HERE, base::BindOnce(&RemoveDictionaryFile, dictionary_file_path_), + base::BindOnce(&SpellCheckLanguage::OnFileRemovedForRetry, + weak_factory_.GetWeakPtr())); +} +void SpellCheckLanguage::OnFileRemovedForRetry(bool file_removed) { if (num_retries_ >= kMaxRetries) { - LOG(ERROR) << "Service initialize failed after max retries"; + LOG(ERROR) << "Service initialize failed after max retries."; + service_.reset(); + return; + } + + if (!file_removed) { + LOG(ERROR) << "Will not retry - could not remove the dictionary file."; service_.reset(); return; } @@ -183,8 +243,9 @@ resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; loader_ = network::SimpleURLLoader::Create(std::move(resource_request), kNetworkTrafficAnnotationTag); + loader_->SetRetryOptions( - /*max_retries=*/5, + /*max_retries=*/3, network::SimpleURLLoader::RetryMode::RETRY_ON_5XX | network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE);
diff --git a/chromeos/components/quick_answers/utils/spell_check_language.h b/chromeos/components/quick_answers/utils/spell_check_language.h index c3fbebf..5ed8c27b 100644 --- a/chromeos/components/quick_answers/utils/spell_check_language.h +++ b/chromeos/components/quick_answers/utils/spell_check_language.h
@@ -54,11 +54,15 @@ void OnSimpleURLLoaderComplete(base::FilePath response_path); + void OnDictionaryDirectoryExistsComplete(bool directory_exists); + void OnDictionaryCreated( mojo::PendingRemote<mojom::SpellCheckDictionary> dictionary); void MaybeRetryInitialize(); + void OnFileRemovedForRetry(bool file_removed); + // The reply points for PostTaskAndReplyWithResult. void OnPathExistsComplete(bool path_exists); void OnSaveDictionaryDataComplete(bool dictionary_saved);
diff --git a/chromeos/components/quick_answers/utils/spell_checker.cc b/chromeos/components/quick_answers/utils/spell_checker.cc index 1088e7ba..5d601d26 100644 --- a/chromeos/components/quick_answers/utils/spell_checker.cc +++ b/chromeos/components/quick_answers/utils/spell_checker.cc
@@ -11,9 +11,6 @@ #include "ui/base/l10n/l10n_util.h" namespace quick_answers { -namespace { - -} // namespace SpellChecker::SpellChecker( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
diff --git a/chromeos/components/quick_answers/utils/spell_checker_unittest.cc b/chromeos/components/quick_answers/utils/spell_checker_unittest.cc index 6db0a437..212a3fe 100644 --- a/chromeos/components/quick_answers/utils/spell_checker_unittest.cc +++ b/chromeos/components/quick_answers/utils/spell_checker_unittest.cc
@@ -7,11 +7,17 @@ #include <memory> #include <string> +#include "base/files/file_path.h" +#include "base/files/file_util.h" #include "base/functional/bind.h" +#include "base/path_service.h" #include "base/test/scoped_feature_list.h" +#include "base/test/scoped_path_override.h" #include "base/test/task_environment.h" +#include "chrome/common/chrome_paths.h" #include "chromeos/components/quick_answers/test/quick_answers_test_base.h" #include "chromeos/constants/chromeos_features.h" +#include "content/public/test/test_utils.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" @@ -34,6 +40,12 @@ &test_url_loader_factory_); spell_checker_ = std::make_unique<SpellChecker>(test_shared_loader_factory_); + + // Set up a temporary directory which will be used as the fake dictionary + // dir. + ASSERT_TRUE(fake_dict_dir_.CreateUniqueTempDir()); + path_override_ = std::make_unique<base::ScopedPathOverride>( + chrome::DIR_APP_DICTIONARIES, fake_dict_dir_.GetPath()); } void TearDown() override { @@ -49,6 +61,9 @@ network::TestURLLoaderFactory test_url_loader_factory_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; std::unique_ptr<SpellChecker> spell_checker_; + + base::ScopedTempDir fake_dict_dir_; + std::unique_ptr<base::ScopedPathOverride> path_override_; }; TEST_F(SpellCheckerTest, ShouldNotSetupBeforePrefsInitialized) { @@ -209,4 +224,27 @@ "es"); } +TEST_F(SpellCheckerTest, ShouldUseQuickAnswersDictionaryDirectory) { + EXPECT_FALSE(fake_quick_answers_state()->prefs_initialized()); + EXPECT_FALSE(spell_checker()->GetSpellcheckLanguagesForTesting().size()); + + base::FilePath quick_answers_dict_dir; + ASSERT_TRUE(base::PathService::Get(chrome::DIR_APP_DICTIONARIES, + &quick_answers_dict_dir)); + quick_answers_dict_dir = quick_answers_dict_dir.AppendASCII("quick_answers"); + + EXPECT_FALSE(base::PathExists(quick_answers_dict_dir)); + + fake_quick_answers_state()->OnPrefsInitialized(); + fake_quick_answers_state()->SetSettingsEnabled(true); + fake_quick_answers_state()->SetConsentStatus(prefs::ConsentStatus::kAccepted); + fake_quick_answers_state()->SetApplicationLocale("en"); + fake_quick_answers_state()->SetPreferredLanguages("en,es,it"); + + // Wait for the dictionary directory to be created. + content::RunAllTasksUntilIdle(); + + EXPECT_TRUE(base::PathExists(quick_answers_dict_dir)); +} + } // namespace quick_answers
diff --git a/chromeos/components/quick_answers/utils/translation_v2_utils.cc b/chromeos/components/quick_answers/utils/translation_v2_utils.cc new file mode 100644 index 0000000..806519c --- /dev/null +++ b/chromeos/components/quick_answers/utils/translation_v2_utils.cc
@@ -0,0 +1,58 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chromeos/components/quick_answers/utils/translation_v2_utils.h" + +#include <set> + +#include "ui/base/l10n/l10n_util.h" + +namespace quick_answers { + +namespace { + +// Supported locales list of Translate v2 API. +// +// This list is manually pulled and crafted from +// https://cloud.google.com/translate/docs/languages. +// +// We use this hard-coded list for checking supported locales of Translate v2 +// API. This list should be periodically updated if the list of the API changes. +// +// `TranslationV2Utils::IsSupported` only cares lang part of a locale. But this +// locale list can contain non-lang part as well. Our code process this list to +// do a check with lang parts. +// +// TODO(b/277757989): Add an optional automated test for translation v2 language +// list +const char* const kSupportedLocales[] = { + "af", "ak", "am", "ar", "as", "ay", "az", "be", "bg", "bho", + "bm", "bn", "bs", "ca", "ceb", "ckb", "co", "cs", "cy", "da", + "de", "doi", "dv", "ee", "el", "en", "eo", "es", "et", "eu", + "fa", "fi", "fil", "fr", "fy", "ga", "gd", "gl", "gn", "gom", + "gu", "ha", "haw", "he", "hi", "hmn", "hr", "ht", "hu", "hy", + "id", "ig", "ilo", "is", "it", "iw", "ja", "jv", "jw", "ka", + "kk", "km", "kn", "ko", "kri", "ku", "ky", "la", "lb", "lg", + "ln", "lo", "lt", "lus", "lv", "mai", "mg", "mi", "mk", "ml", + "mn", "mni-Mtei", "mr", "ms", "mt", "my", "ne", "nl", "no", "nso", + "ny", "om", "or", "pa", "pl", "ps", "pt", "qu", "ro", "ru", + "rw", "sa", "sd", "si", "sk", "sl", "sm", "sn", "so", "sq", + "sr", "st", "su", "sv", "sw", "ta", "te", "tg", "th", "ti", + "tk", "tl", "tr", "ts", "tt", "ug", "uk", "ur", "uz", "vi", + "xh", "yi", "yo", "zh-CN", "zh-TW", "zh", "zu", +}; + +} // namespace + +// static +bool TranslationV2Utils::IsSupported(const std::string& language) { + std::set<std::string> languages; + for (const std::string& locale : kSupportedLocales) { + languages.insert(l10n_util::GetLanguage(locale)); + } + + return languages.count(language) != 0; +} + +} // namespace quick_answers
diff --git a/chromeos/components/quick_answers/utils/translation_v2_utils.h b/chromeos/components/quick_answers/utils/translation_v2_utils.h new file mode 100644 index 0000000..2a1b6b8 --- /dev/null +++ b/chromeos/components/quick_answers/utils/translation_v2_utils.h
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_TRANSLATION_V2_UTILS_H_ +#define CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_TRANSLATION_V2_UTILS_H_ + +#include <string> + +namespace quick_answers { + +class TranslationV2Utils { + public: + static bool IsSupported(const std::string& language); +}; + +} // namespace quick_answers + +#endif // CHROMEOS_COMPONENTS_QUICK_ANSWERS_UTILS_TRANSLATION_V2_UTILS_H_
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb index e10662b..2bfe328 100644 --- a/chromeos/strings/chromeos_strings_bg.xtb +++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">Ето някои други полезни ресурси:</translation> <translation id="1905710495812624430">Максималният брой опити е надвишен.</translation> <translation id="1908234395526491708">Неуспешни заявки през UDP</translation> +<translation id="1923388006036088459">Цветове на акцентирането</translation> <translation id="1947737735496445907">Отпечатано</translation> <translation id="1951012854035635156">Асистент</translation> <translation id="1962550982027027473">Изисква се стандартно име на точката за достъп (APN)</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">Изтеглянето завърши</translation> <translation id="3969602104473960991">Паролата за Chrome OS е актуализирана</translation> <translation id="397105322502079400">Изчислява се...</translation> +<translation id="3974175076798940554">Вече са налице специални активи за Chromebook Plus</translation> <translation id="39823212440917567">Заданията за отпечатване, по-стари от <ph name="NUMBER_OF_DAYS" /> дни, ще бъдат премахнати</translation> <translation id="3993704782688964914">Устройството ви <ph name="DEVICE_NAME" /> вече е актуално</translation> <translation id="4003384961948020559">Неуспешно – изходният контейнер е пълен</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">Добавете профил към функцията за централизиран вход. Всички профили, в които влезете чрез нея, ще бъдат достъпни без парола, така че трябва да използвате тази функция само с надеждни профили.</translation> <translation id="8364946094152050673">Не са посочени сървъри за имена</translation> <translation id="8372477600026034341">Допълнителни хостове</translation> +<translation id="8373046809163484087">Използване на цветови набори, съответстващи на тапета ви</translation> <translation id="8380114448424469341">Прикрепване на прозореца в <ph name="DIRECTION" /> половина на екрана</translation> <translation id="8395584934117017006">Това устройство <ph name="DEVICE_TYPE" /> се управлява корпоративно</translation> <translation id="8398927464629426868">Скоростта, с която устройството се зарежда или разрежда в момента</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">Потребителско име</translation> <translation id="8503836310948963452">Само още няколко минути…</translation> <translation id="8508640263392900755">Подробности за името на точката за достъп (APN)</translation> +<translation id="8522687886059337719">Вече имате достъп до нови <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />тапети<ph name="END_LINK_WALLPAPER_SUBPAGE" /> и <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />скрийнсейвър<ph name="END_LINK_SCREENSAVER_SUBPAGE" /></translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">Тази опция може да е необходима за свързване с мрежата на оператора ви. За подробности се обърнете към него.</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index fc49a3f..3338847 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">Evo još nekih korisnih izvora:</translation> <translation id="1905710495812624430">Prekoračen je maksimalan broj dozvoljenih pokušaja.</translation> <translation id="1908234395526491708">Greške UDP zahtjeva</translation> +<translation id="1923388006036088459">Boje isticanja</translation> <translation id="1947737735496445907">Odštampano</translation> <translation id="1951012854035635156">Asistent</translation> <translation id="1962550982027027473">Potreban je zadani APN</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">Preuzimanje je završeno</translation> <translation id="3969602104473960991">Lozinka za ChromeOS je ažurirana</translation> <translation id="397105322502079400">Računanje…</translation> +<translation id="3974175076798940554">Sada su dostupni ekskluzivni elementi za Chromebook Plus</translation> <translation id="39823212440917567">Zadaci za štampanje stariji od <ph name="NUMBER_OF_DAYS" /> dana će se ukloniti</translation> <translation id="3993704782688964914">Vaš uređaj <ph name="DEVICE_NAME" /> je sada ažuriran</translation> <translation id="4003384961948020559">Nije uspjelo – izlaz je pun</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">Dodajte račun za višestruku prijavu. Svim računima na kojima je izvršena prijava je moguće pristupiti bez lozinke. Ovu funkciju treba koristiti isključivo s pouzdanim računima.</translation> <translation id="8364946094152050673">Prazni serveri naziva</translation> <translation id="8372477600026034341">Dodatni host računari</translation> +<translation id="8373046809163484087">Upotreba skupova boja koji odgovaraju pozadini</translation> <translation id="8380114448424469341">Priključivanje prozora na <ph name="DIRECTION" /> polovini ekrana</translation> <translation id="8395584934117017006">Ovim uređajem <ph name="DEVICE_TYPE" /> upravlja preduzeće</translation> <translation id="8398927464629426868">Brzina kojom se uređaj trenutno puni ili prazni</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">Korisničko ime</translation> <translation id="8503836310948963452">Još samo nekoliko minuta...</translation> <translation id="8508640263392900755">Detalji APN-a</translation> +<translation id="8522687886059337719">Sada imate pristup novim <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />pozadinama<ph name="END_LINK_WALLPAPER_SUBPAGE" /> i <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />čuvaru zaslona<ph name="END_LINK_SCREENSAVER_SUBPAGE" /></translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">Mobilni operater može zahtijevati ovu opciju radi povezivanja s njegovom mrežom. Za detalje se obratite mobilnom operateru.</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index cb47472..ac53bf6 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">Evo još nekih korisnih resursa:</translation> <translation id="1905710495812624430">Premašen je maksimalan dopušteni broj pokušaja.</translation> <translation id="1908234395526491708">Neuspješni UDP zahtjevi</translation> +<translation id="1923388006036088459">Boje isticanja</translation> <translation id="1947737735496445907">Ispisano</translation> <translation id="1951012854035635156">Asistent</translation> <translation id="1962550982027027473">Potreban je zadani APN</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">Preuzimanje dovršeno</translation> <translation id="3969602104473960991">Zaporka za Chrome OS je ažurirana</translation> <translation id="397105322502079400">Izračun u tijeku…</translation> +<translation id="3974175076798940554">Sada su dostupni ekskluzivni elementi za Chromebook Plus</translation> <translation id="39823212440917567">Uklonit će se zadaci ispisa stariji od <ph name="NUMBER_OF_DAYS" /> dana</translation> <translation id="3993704782688964914">Uređaj <ph name="DEVICE_NAME" /> je ažuriran</translation> <translation id="4003384961948020559">Nije uspjelo – izlaz je pun</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">Dodajte račun na višestruku prijavu. Svim računima na koje ste prijavljeni može se pristupiti bez zaporke, pa bi se ta značajka trebala upotrebljavati samo s pouzdanim računima.</translation> <translation id="8364946094152050673">Prazni poslužitelji naziva</translation> <translation id="8372477600026034341">Dodatni hostovi</translation> +<translation id="8373046809163484087">Upotreba skupova boja koji odgovaraju pozadini</translation> <translation id="8380114448424469341">Postavi prozor na <ph name="DIRECTION" /> polovicu zaslona</translation> <translation id="8395584934117017006">Uređajem <ph name="DEVICE_TYPE" /> upravlja poduzeće</translation> <translation id="8398927464629426868">Brzina punjenja ili pražnjenja uređaja</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">Korisničko ime</translation> <translation id="8503836310948963452">Još samo nekoliko minuta...</translation> <translation id="8508640263392900755">Pojedinosti o APN-u</translation> +<translation id="8522687886059337719">Sada imate pristup novim <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />pozadinama<ph name="END_LINK_WALLPAPER_SUBPAGE" /> i <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />čuvaru zaslona<ph name="END_LINK_SCREENSAVER_SUBPAGE" /></translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">Vaš mobilni operater može zahtijevati tu opciju radi povezivanja s njegovom mrežom. Više informacija zatražite od svojeg operatera.</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb index 5d3c942..1102e68 100644 --- a/chromeos/strings/chromeos_strings_hy.xtb +++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -140,6 +140,7 @@ <translation id="2056550196601855911">IPv4/IPv6</translation> <translation id="2080070583977670716">Այլ կարգավորումներ</translation> <translation id="2085089206770112532">Էկրանի պայծառության նվազեցում</translation> +<translation id="209751264101900360">Լուսաբացից մայրամուտ. ամպերի հոսքը</translation> <translation id="2102231663024125441">Տեքստի խմբագրում</translation> <translation id="2105810540595158374">Սարքը խաղային վահանակ է։</translation> <translation id="2119172414412204879"><ph name="BOARD_NAME" />, տարբերակ <ph name="MILESTONE_VERSION" /></translation> @@ -370,6 +371,7 @@ <translation id="4275663329226226506">Տեսախցիկ և խոսափող</translation> <translation id="4289540628985791613">Համատեսք</translation> <translation id="4289849978083912975">Պատկերահանդես</translation> +<translation id="4293621540182258188">Լուսաբացից մայրամուտ. Երկրի ընթացքը</translation> <translation id="4297501883039923494">Դադարեցվել է – Անհայտ սխալ</translation> <translation id="4300073214558989"><ph name="IMAGE_COUNT" /> պատկեր</translation> <translation id="4311195029067684288">Ամբողջական</translation> @@ -544,6 +546,7 @@ <translation id="576835345334454681">Էկրանի պայծառության ավելացում</translation> <translation id="57838592816432529">Անջատել ձայնը</translation> <translation id="5784136236926853061">HTTP-ի բարձր հապաղում</translation> +<translation id="5809090008577139505">Հյուսիսափայլ</translation> <translation id="5826644637650799838">Պաստառի մասին</translation> <translation id="5832805196449965646">Ավելացնել անձ</translation> <translation id="583281660410589416">Անհայտ</translation> @@ -562,6 +565,7 @@ <translation id="5907649332524363701">ստեղների գույնը</translation> <translation id="5916084858004523819">Արգելված է</translation> <translation id="5916664084637901428">Միացնել</translation> +<translation id="5918201491776799918">Ընտրել բացառիկ պաստառ Chromebook Plus-ի համար</translation> <translation id="5921506667911082617">{COUNT,plural, =1{Ձեր ֆայլը սկանավորվեց և պահվեց <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> պանակում։}one{Ձեր ֆայլերը սկանավորվեցին և պահվեցին <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> պանակում։}other{Ձեր ֆայլերը սկանավորվեցին և պահվեցին <ph name="LINK_BEGIN" /><ph name="FOLDER_NAME" /><ph name="LINK_END" /> պանակում։}}</translation> <translation id="5931523347251946569">Ֆայլը չի գտնվել</translation> <translation id="5939518447894949180">Վերակայել</translation> @@ -818,6 +822,7 @@ <translation id="8138405288920084977">LTEAdvanced</translation> <translation id="8143951647992294073">Ընտրել «<ph name="TOPIC_SOURCE" /> <ph name="TOPIC_SOURCE_DESC" />» տարբերակը</translation> <translation id="8151185429379586178">Ծրագրավորողի գործիքներ</translation> +<translation id="8153923300383192510">Միայն Chromebook Plus-ի համար</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8183974620058026102">Կցել</translation> <translation id="8206859287963243715">Բջջային</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb index a4661e33..6c1ab110 100644 --- a/chromeos/strings/chromeos_strings_km.xtb +++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">ទាំងនេះគឺជាធនធានដែលមានប្រយោជន៍ផ្សេងៗមួយចំនួនទៀត៖</translation> <translation id="1905710495812624430">បានលើសការព្យាយាមចូូលអតិបរមាដែលបានអនុញ្ញាតហើយ។</translation> <translation id="1908234395526491708">សំណើ UDP មិនបានសម្រេច</translation> +<translation id="1923388006036088459">ពណ៌រំលេច</translation> <translation id="1947737735496445907">បានបោះពុម្ព</translation> <translation id="1951012854035635156">ជំនួយការ</translation> <translation id="1962550982027027473">តម្រូវឱ្យមាន APN លំនាំដើម</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">ការទាញយកបានបញ្ចប់</translation> <translation id="3969602104473960991">បានប្ដូរពាក្យសម្ងាត់ ChromeOS</translation> <translation id="397105322502079400">កំពុងគណនា...</translation> +<translation id="3974175076798940554">ឥឡូវនេះ អាចប្រើទ្រព្យ Chromebook Plus ផ្ដាច់មុខបានហើយ</translation> <translation id="39823212440917567">កិច្ចការបោះពុម្ពដែលចាស់ជាង <ph name="NUMBER_OF_DAYS" /> ថ្ងៃនឹងត្រូវបានលុបចេញ</translation> <translation id="3993704782688964914">ឥឡូវនេះ <ph name="DEVICE_NAME" /> របស់អ្នកមានកំណែថ្មីបំផុតហើយ</translation> <translation id="4003384961948020559">មិនបានសម្រេច - កន្លែងចេញក្រដាសបោះពុម្ពពេញហើយ</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">បន្ថែមគណនីមួយដើម្បីចូលពីគណនីច្រើន។ គណនីដែលចូលទាំងអស់អាចចូលប្រើដោយគ្មានពាក្យសម្ងាត់ ដូច្នេះលក្ខណពិសេសនេះគួរត្រូវបានប្រើជាមួយគណនីដែលគួរជឿជាក់តែប៉ុណ្ណោះ។</translation> <translation id="8364946094152050673">DNS នៅទទេ</translation> <translation id="8372477600026034341">ម៉ាស៊ីនបន្ថែម</translation> +<translation id="8373046809163484087">ប្រើសំណុំពណ៌ដែលត្រូវនឹងផ្ទាំងរូបភាពរបស់អ្នក</translation> <translation id="8380114448424469341">ភ្ជាប់វិនដូនៅផ្នែកពាក់កណ្ដាលខាង<ph name="DIRECTION" />នៃអេក្រង់</translation> <translation id="8395584934117017006"><ph name="DEVICE_TYPE" /> នេះស្ថិតក្រោមការគ្រប់គ្រងលក្ខណៈសហគ្រាស</translation> <translation id="8398927464629426868">អត្រាដែលឧបករណ៍កំពុងសាកថ្ម ឬបញ្ចេញថាមពលក្នុងពេលបច្ចុប្បន្ន</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">ឈ្មោះអ្នកប្រើ</translation> <translation id="8503836310948963452">នៅសល់តែពីរបីនាទីទៀតប៉ុណ្ណោះ...</translation> <translation id="8508640263392900755">ព័ត៌មានលម្អិតអំពី APN</translation> +<translation id="8522687886059337719">ឥឡូវនេះ អ្នកមានសិទ្ធិចូលប្រើ<ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />ផ្ទាំងរូបភាព<ph name="END_LINK_WALLPAPER_SUBPAGE" /> និង<ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />ធាតុរក្សាអេក្រង់<ph name="END_LINK_SCREENSAVER_SUBPAGE" />ថ្មីហើយ</translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">ក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នកអាចតម្រូវឱ្យមានជម្រើសនេះ ដើម្បីភ្ជាប់ជាមួយបណ្ដាញរបស់ក្រុមហ៊ុននោះ។ សូមទាក់ទងក្រុមហ៊ុនសេវាទូរសព្ទរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត។</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index e2218eb..6f52a99 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">Här är några andra användbara resurser:</translation> <translation id="1905710495812624430">Du har försökt för många gånger.</translation> <translation id="1908234395526491708">Misslyckade UDP-förfrågningar</translation> +<translation id="1923388006036088459">Accentfärger</translation> <translation id="1947737735496445907">Utskrivet</translation> <translation id="1951012854035635156">Assistent</translation> <translation id="1962550982027027473">Ett standard-APN krävs</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">Nedladdning slutförd</translation> <translation id="3969602104473960991">Lösenordet för Chrome OS har uppdaterats</translation> <translation id="397105322502079400">Beräknar ...</translation> +<translation id="3974175076798940554">Exklusiva Chromebook Plus-tillgångar är nu tillgängliga</translation> <translation id="39823212440917567">Utskriftsjobb som är äldre än <ph name="NUMBER_OF_DAYS" /> dagar tas bort</translation> <translation id="3993704782688964914"><ph name="DEVICE_NAME" /> har nu uppdaterats</translation> <translation id="4003384961948020559">Misslyckades – utmatningsfacket är fullt</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">Lägg till ett konto för multiinloggning. Alla inloggade konton kan öppnas utan lösenord, så använd bara den här funktionen med konton du litar på.</translation> <translation id="8364946094152050673">Inga namnservrar har angetts</translation> <translation id="8372477600026034341">Ytterligare värdar</translation> +<translation id="8373046809163484087">Använd färguppsättningar som matchar din bakgrund</translation> <translation id="8380114448424469341">Docka fönstret på den <ph name="DIRECTION" /> halvan av skärmen</translation> <translation id="8395584934117017006">Denna <ph name="DEVICE_TYPE" /> är företagshanterad</translation> <translation id="8398927464629426868">Hur fort enheten laddas eller laddas ur för närvarande</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">Användarnamn</translation> <translation id="8503836310948963452">Bara några minuter kvar …</translation> <translation id="8508640263392900755">APN-information</translation> +<translation id="8522687886059337719">Nu har du åtkomst till nya <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />bakgrunder<ph name="END_LINK_WALLPAPER_SUBPAGE" /> och <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />skärmsläckare<ph name="END_LINK_SCREENSAVER_SUBPAGE" /></translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">Det här alternativet kan krävas för att du ska kunna ansluta till operatörens nätverk. Kontakta operatören för mer information.</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb index 8fb9dd7..7b9a4bb 100644 --- a/chromeos/strings/chromeos_strings_th.xtb +++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">แหล่งข้อมูลอื่นๆ บางส่วนที่เป็นประโยชน์มีดังต่อไปนี้</translation> <translation id="1905710495812624430">ลองทำเกินจำนวนครั้งที่กำหนดไว้แล้ว</translation> <translation id="1908234395526491708">ขอ UDP ไม่สำเร็จ</translation> +<translation id="1923388006036088459">สีเฉพาะจุด</translation> <translation id="1947737735496445907">พิมพ์แล้ว</translation> <translation id="1951012854035635156">ผู้ช่วย</translation> <translation id="1962550982027027473">ต้องมี APN เริ่มต้น</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">ดาวน์โหลดเสร็จสมบูรณ์</translation> <translation id="3969602104473960991">อัปเดตรหัสผ่าน Chrome OS แล้ว</translation> <translation id="397105322502079400">กำลังคำนวณ...</translation> +<translation id="3974175076798940554">เนื้อหาสุดพิเศษของ Chromebook Plus พร้อมใช้งานแล้ว</translation> <translation id="39823212440917567">ระบบจะนำงานพิมพ์ที่เก่ากว่า <ph name="NUMBER_OF_DAYS" /> วันออก</translation> <translation id="3993704782688964914"><ph name="DEVICE_NAME" /> เป็นเวอร์ชันล่าสุดแล้ว</translation> <translation id="4003384961948020559">ไม่สำเร็จ - ถาดกระดาษขาออกเต็ม</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">เพิ่มบัญชีเพื่อลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี บัญชีที่ลงชื่อเข้าใช้แล้วทั้งหมดสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสผ่าน คุณจึงควรใช้ฟีเจอร์นี้กับบัญชีที่เชื่อถือเท่านั้น</translation> <translation id="8364946094152050673">เนมเซิร์ฟเวอร์ว่างเปล่า</translation> <translation id="8372477600026034341">โฮสต์เพิ่มเติม</translation> +<translation id="8373046809163484087">ใช้ชุดสีที่เข้ากับวอลเปเปอร์</translation> <translation id="8380114448424469341">ตรึงหน้าต่างไว้กับครึ่งด้าน<ph name="DIRECTION" />ของหน้าจอ</translation> <translation id="8395584934117017006"><ph name="DEVICE_TYPE" /> เครื่องนี้จัดการโดยองค์กร</translation> <translation id="8398927464629426868">อัตราการชาร์จหรือการคายประจุของอุปกรณ์ในปัจจุบัน</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">ชื่อผู้ใช้</translation> <translation id="8503836310948963452">อีกเพียงไม่กี่นาทีเท่านั้น...</translation> <translation id="8508640263392900755">รายละเอียด APN</translation> +<translation id="8522687886059337719">ตอนนี้คุณเข้าถึง<ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />วอลเปเปอร์<ph name="END_LINK_WALLPAPER_SUBPAGE" />และ<ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />ภาพพักหน้าจอ<ph name="END_LINK_SCREENSAVER_SUBPAGE" />ใหม่ได้แล้ว</translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">ผู้ให้บริการอาจกำหนดให้ใช้ตัวเลือกนี้เพื่อให้เชื่อมต่อเครือข่ายของตนได้ โปรดติดต่อสอบถามรายละเอียดจากผู้ให้บริการ</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 3c71c441..c1743283 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -123,6 +123,7 @@ <translation id="1904932688895783618">Dưới đây là một số tài nguyên hữu ích khác:</translation> <translation id="1905710495812624430">Đã vượt quá số lần thử tối đa được phép.</translation> <translation id="1908234395526491708">Không gửi được yêu cầu UDP</translation> +<translation id="1923388006036088459">Màu nhấn</translation> <translation id="1947737735496445907">Đã in</translation> <translation id="1951012854035635156">Trợ lý</translation> <translation id="1962550982027027473">Cần có APN mặc định</translation> @@ -332,6 +333,7 @@ <translation id="3967822245660637423">Đã tải xuống xong</translation> <translation id="3969602104473960991">Đã cập nhật mật khẩu ChromeOS</translation> <translation id="397105322502079400">Đang tính...</translation> +<translation id="3974175076798940554">Đã có nội dung dành riêng cho Chromebook Plus</translation> <translation id="39823212440917567">Các lệnh in quá <ph name="NUMBER_OF_DAYS" /> ngày sẽ bị xóa</translation> <translation id="3993704782688964914"><ph name="DEVICE_NAME" /> của bạn hiện đã cập nhật</translation> <translation id="4003384961948020559">Không thành công – Khay đầu ra đã đầy</translation> @@ -845,6 +847,7 @@ <translation id="8352772353338965963">Thêm một tài khoản để đăng nhập nhiều lần. Tất cả các tài khoản đã đăng nhập đều có thể truy cập được mà không cần mật khẩu, do đó bạn chỉ nên sử dụng tính năng này với các tài khoản đáng tin cậy.</translation> <translation id="8364946094152050673">Máy chủ định danh trống</translation> <translation id="8372477600026034341">Máy chủ khác</translation> +<translation id="8373046809163484087">Sử dụng tập hợp màu phù hợp với hình nền</translation> <translation id="8380114448424469341">Gắn cửa sổ vào nửa <ph name="DIRECTION" /> của màn hình</translation> <translation id="8395584934117017006"><ph name="DEVICE_TYPE" /> này do doanh nghiệp quản lý</translation> <translation id="8398927464629426868">Tốc độ sạc hoặc xả pin hiện tại của thiết bị</translation> @@ -864,6 +867,7 @@ <translation id="8503813439785031346">Tên người dùng</translation> <translation id="8503836310948963452">Còn một vài phút nữa thôi…</translation> <translation id="8508640263392900755">Chi tiết về APN</translation> +<translation id="8522687886059337719">Giờ đây, bạn có thể sử dụng các <ph name="BEGIN_LINK_WALLPAPER_SUBPAGE" />hình nền<ph name="END_LINK_WALLPAPER_SUBPAGE" /> và <ph name="BEGIN_LINK_SCREENSAVER_SUBPAGE" />trình bảo vệ màn hình<ph name="END_LINK_SCREENSAVER_SUBPAGE" /> mới</translation> <translation id="8528615187455571738">Crosvm</translation> <translation id="8557447961879934694">WPA2</translation> <translation id="8575298406870537639">Nhà mạng của bạn có thể yêu cầu bạn bật tùy chọn này để kết nối với mạng của họ. Hãy liên hệ với nhà mạng để biết thông tin chi tiết.</translation>
diff --git a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc index 046e214..27692348 100644 --- a/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc +++ b/chromeos/ui/frame/multitask_menu/multitask_menu_nudge_controller.cc
@@ -210,7 +210,7 @@ if (!parent) { return; } - DCHECK_EQ(window_, window); + CHECK_EQ(window_, window); UpdateWidgetAndPulse(); } @@ -227,14 +227,14 @@ const gfx::Rect& old_bounds, const gfx::Rect& new_bounds, ui::PropertyChangeReason reason) { - DCHECK_EQ(window_, window); + CHECK_EQ(window_, window); UpdateWidgetAndPulse(); } void MultitaskMenuNudgeController::OnWindowTargetTransformChanging( aura::Window* window, const gfx::Transform& new_transform) { - DCHECK_EQ(window_, window); + CHECK_EQ(window_, window); // Prevent unintended behaviour in situations that use transforms such as // overview mode. // TODO(hewer): Decide how the cue behaves when adjusting the split view @@ -244,7 +244,7 @@ void MultitaskMenuNudgeController::OnWindowStackingChanged( aura::Window* window) { - DCHECK_EQ(window_, window); + CHECK_EQ(window_, window); // Stacking may change during the construction of the widget, at which // `nudge_widget_` would still be null. @@ -259,7 +259,7 @@ } void MultitaskMenuNudgeController::OnWindowDestroying(aura::Window* window) { - DCHECK_EQ(window_, window); + CHECK_EQ(window_, window); DismissNudge(); } @@ -338,7 +338,7 @@ } UpdateWidgetAndPulse(); - DCHECK(nudge_widget_); + CHECK(nudge_widget_); // Fade the education nudge in. ui::Layer* layer = nudge_widget_->GetLayer(); @@ -382,13 +382,13 @@ } void MultitaskMenuNudgeController::UpdateWidgetAndPulse() { - DCHECK(window_); - DCHECK(nudge_widget_); + CHECK(window_); + CHECK(nudge_widget_); const bool tablet_mode = TabletState::Get()->InTabletMode(); if (!tablet_mode) { - DCHECK(pulse_layer_); - DCHECK(anchor_view_); + CHECK(pulse_layer_); + CHECK(anchor_view_); } // Dismiss the nudge if the window (or anchor in clamshell mode) is not @@ -472,7 +472,7 @@ return; } - DCHECK(pulse_layer_); + CHECK(pulse_layer_); // The pulse animation scales up and fades out on top of the maximize/restore // button until the nudge disappears.
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index b95a6dfb..bd23dc5 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -428,6 +428,7 @@ "ui/contact_form_label_formatter.h", "ui/country_combobox_model.cc", "ui/country_combobox_model.h", + "ui/fast_checkout_client.h", "ui/label_formatter.cc", "ui/label_formatter.h", "ui/label_formatter_utils.cc", @@ -578,6 +579,7 @@ "//base:i18n", "//build:branding_buildflags", "//build:chromeos_buildflags", + "//components/device_reauth", "//components/feature_engagement", "//components/google/core/common", "//components/history/core/browser", @@ -730,6 +732,8 @@ "test_utils/vote_uploads_test_matchers.h", "ui/mock_autofill_popup_delegate.cc", "ui/mock_autofill_popup_delegate.h", + "ui/mock_fast_checkout_client.cc", + "ui/mock_fast_checkout_client.h", "ui/suggestion_test_helpers.h", "webdata/autofill_sync_bridge_test_util.cc", "webdata/autofill_sync_bridge_test_util.h", @@ -747,6 +751,7 @@ "//base/test:test_support", "//components/autofill/core/browser", "//components/autofill/core/common", + "//components/device_reauth:test_support", "//components/feature_engagement", "//components/leveldb_proto", "//components/os_crypt/sync", @@ -1038,6 +1043,7 @@ "//base/test:test_support", "//build:chromeos_buildflags", "//components/autofill/core/common", + "//components/device_reauth:test_support", "//components/feature_engagement", "//components/image_fetcher/core:core", "//components/image_fetcher/core:test_support",
diff --git a/components/autofill/core/browser/DEPS b/components/autofill/core/browser/DEPS index 0eab771..df94a81 100644 --- a/components/autofill/core/browser/DEPS +++ b/components/autofill/core/browser/DEPS
@@ -67,13 +67,15 @@ "+components/autofill/content/browser/content_autofill_driver.h", "+components/autofill/content/browser/content_autofill_router.h", ], - "credit_card_access_manager_unittest\.cc": [ + "credit_card_access_manager(_unittest)?\.cc": [ + "+components/device_reauth", "+content/public/test", ], "credit_card_save_manager_unittest\.cc": [ "+components/ukm", ], "test_autofill_client\.h": [ + "+components/device_reauth", "+components/ukm", ], "password_requirements_spec_fetcher_unittest\.cc": [
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc index bfb1307..e31ab2ae 100644 --- a/components/autofill/core/browser/autofill_client.cc +++ b/components/autofill/core/browser/autofill_client.cc
@@ -90,6 +90,10 @@ return profile_metrics::BrowserProfileType::kRegular; } +FastCheckoutClient* AutofillClient::GetFastCheckoutClient() { + return nullptr; +} + void AutofillClient::ShowUnmaskAuthenticatorSelectionDialog( const std::vector<CardUnmaskChallengeOption>& challenge_options, base::OnceCallback<void(const std::string&)> @@ -193,4 +197,9 @@ return *ablation_study; } +scoped_refptr<device_reauth::DeviceAuthenticator> +AutofillClient::GetDeviceAuthenticator() const { + return nullptr; +} + } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h index 4127a08..a11c663 100644 --- a/components/autofill/core/browser/autofill_client.h +++ b/components/autofill/core/browser/autofill_client.h
@@ -13,11 +13,13 @@ #include "base/containers/span.h" #include "base/functional/callback_forward.h" #include "base/i18n/rtl.h" +#include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "build/build_config.h" #include "components/autofill/core/browser/autofill_trigger_source.h" #include "components/autofill/core/browser/payments/legal_message_line.h" #include "components/autofill/core/browser/payments/risk_data_loader.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/popup_types.h" #include "components/autofill/core/common/aliases.h" @@ -42,6 +44,10 @@ class PrefService; +namespace device_reauth { +class DeviceAuthenticator; +} + namespace signin { class IdentityManager; } @@ -440,6 +446,9 @@ // Returns the profile type of the session. virtual profile_metrics::BrowserProfileType GetProfileType() const; + // Gets a FastCheckoutClient instance (can be null for unsupported platforms). + virtual FastCheckoutClient* GetFastCheckoutClient(); + #if !BUILDFLAG(IS_IOS) // Creates the appropriate implementation of InternalAuthenticator. May be // null for platforms that don't support this, in which case standard CVC @@ -811,6 +820,11 @@ // calls in the next 20 minutes. Afterwards a new GUID is set and the pattern // repeated. virtual FormInteractionsFlowId GetCurrentFormInteractionsFlowId() = 0; + + // Returns a pointer to a DeviceAuthenticator. Might be nullptr if the given + // platform is not supported. + virtual scoped_refptr<device_reauth::DeviceAuthenticator> + GetDeviceAuthenticator() const; }; } // namespace autofill
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.cc b/components/autofill/core/browser/payments/credit_card_access_manager.cc index 7e7fb7a6..e0b8cd25 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager.cc
@@ -35,6 +35,7 @@ #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/autofill_tick_clock.h" +#include "components/device_reauth/device_authenticator.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -264,9 +265,11 @@ return; } + // Get the card's record type to correctly handle its fetching. + CreditCard::RecordType record_type = card->record_type(); + // Log the server card unmasking attempt, and differentiate based on server // card or virtual card. - CreditCard::RecordType record_type = card->record_type(); if (ShouldLogServerCardUnmaskAttemptMetrics(record_type)) { autofill_metrics::LogServerCardUnmaskAttempt( record_type == CreditCard::VIRTUAL_CARD @@ -281,11 +284,11 @@ accessor->OnCreditCardFetched(CreditCardFetchResult::kSuccess, /*credit_card=*/&it->second.card, /*cvc=*/it->second.cvc); - std::string metrics_name = card->record_type() == CreditCard::VIRTUAL_CARD + std::string metrics_name = record_type == CreditCard::VIRTUAL_CARD ? "Autofill.UsedCachedVirtualCard" : "Autofill.UsedCachedServerCard"; base::UmaHistogramCounts1000(metrics_name, ++it->second.cache_uses); - if (card->record_type() == CreditCard::VIRTUAL_CARD) { + if (record_type == CreditCard::VIRTUAL_CARD) { autofill_metrics::LogServerCardUnmaskResult( autofill_metrics::ServerCardUnmaskResult::kLocalCacheHit, AutofillClient::PaymentsRpcCardType::kVirtualCard, @@ -296,30 +299,18 @@ return; } - // Return immediately if local card and log that unmask details were ignored. - if (card->record_type() != CreditCard::MASKED_SERVER_CARD && - card->record_type() != CreditCard::VIRTUAL_CARD) { - accessor->OnCreditCardFetched(CreditCardFetchResult::kSuccess, card, u""); -#if !BUILDFLAG(IS_IOS) - // Latency metrics should only be logged if the user is verifiable. - if (is_user_verifiable_.value_or(false)) { - autofill_metrics::LogUserPerceivedLatencyOnCardSelection( - autofill_metrics::PreflightCallEvent::kDidNotChooseMaskedCard, - GetOrCreateFidoAuthenticator()->IsUserOptedIn()); - } -#endif - Reset(); - return; - } - card_ = std::make_unique<CreditCard>(*card); accessor_ = accessor; - // Direct to different flows based on the card record type. - if (card_->record_type() == CreditCard::VIRTUAL_CARD) - FetchVirtualCard(); - else - FetchMaskedServerCard(); + switch (record_type) { + case CreditCard::VIRTUAL_CARD: + return FetchVirtualCard(); + case CreditCard::MASKED_SERVER_CARD: + return FetchMaskedServerCard(); + case CreditCard::LOCAL_CARD: + case CreditCard::FULL_SERVER_CARD: + return FetchLocalOrFullServerCard(); + } } void CreditCardAccessManager::FIDOAuthOptChange(bool opt_in) { @@ -1082,6 +1073,37 @@ weak_ptr_factory_.GetWeakPtr())); } +void CreditCardAccessManager::FetchLocalOrFullServerCard() { +#if !BUILDFLAG(IS_IOS) + // Latency metrics should only be logged if the user is verifiable. + if (is_user_verifiable_.value_or(false)) { + autofill_metrics::LogUserPerceivedLatencyOnCardSelection( + autofill_metrics::PreflightCallEvent::kDidNotChooseMaskedCard, + GetOrCreateFidoAuthenticator()->IsUserOptedIn()); + } +#endif + + // Check if we need to authenticate the user before filling the local card + // or full server card. + if (personal_data_manager_ + ->IsAutofillPaymentMethodsMandatoryReauthEnabled()) { + // `StartDeviceAuthenticationForFilling()` will asynchronously trigger + // the re-authentication flow, so we should avoid calling `Reset()` + // until the re-authentication flow is complete. + StartDeviceAuthenticationForFilling(accessor_, card_.get(), /*cvc=*/u""); + } else { + // Fill immediately if local card, and we do not need to authenticate + // the user. + accessor_->OnCreditCardFetched(CreditCardFetchResult::kSuccess, card_.get(), + /*cvc=*/u""); + // `accessor_->OnCreditCardFetched()` makes a copy of `card` and `cvc` + // before it asynchronously fills them into the form. Thus we can safely + // call `Reset()` here, and we should as from this class' point of view the + // authentication flow is complete. + Reset(); + } +} + void CreditCardAccessManager::OnDidGetUnmaskRiskData( const std::string& risk_data) { virtual_card_unmask_request_details_.risk_data = risk_data; @@ -1361,4 +1383,58 @@ return false; } +void CreditCardAccessManager::StartDeviceAuthenticationForFilling( + base::WeakPtr<Accessor> accessor, + const CreditCard* card, + const std::u16string& cvc) { + scoped_refptr<device_reauth::DeviceAuthenticator> device_authenticator = + client_->GetDeviceAuthenticator(); + + // Since this function should only be called on platforms where the + // DeviceAuthenticator is present, we should always have a + // DeviceAuthenticator. + CHECK(device_authenticator); + + is_authentication_in_progress_ = true; + + // TODO(crbug.com/1427216): Add the iOS branching logic as well. +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + device_authenticator->AuthenticateWithMessage( + l10n_util::GetStringUTF16(IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH), + base::BindOnce( + &CreditCardAccessManager::OnDeviceAuthenticationResponseForFilling, + weak_ptr_factory_.GetWeakPtr(), accessor, card, cvc)); +#elif BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/1427216): Convert this to + // DeviceAuthenticator::AuthenticateWithMessage() with the correct message + // once it is supported. Currently, the message is "Verify it's you". + device_authenticator->Authenticate( + device_reauth::DeviceAuthRequester::kLocalCardAutofill, + base::BindOnce( + &CreditCardAccessManager::OnDeviceAuthenticationResponseForFilling, + weak_ptr_factory_.GetWeakPtr(), accessor, card, cvc), + /*use_last_valid_auth=*/true); +#else + NOTREACHED_NORETURN(); +#endif +} + +void CreditCardAccessManager::OnDeviceAuthenticationResponseForFilling( + base::WeakPtr<Accessor> accessor, + const CreditCard* card, + const std::u16string& cvc, + bool successful_auth) { + accessor->OnCreditCardFetched(successful_auth + ? CreditCardFetchResult::kSuccess + : CreditCardFetchResult::kTransientError, + card, cvc); + // TODO(crbug.com/1427216): Add logging for the payments autofill device + // authentication flow. + // `accessor->OnCreditCardFetched()` makes a copy of `card` and `cvc` before + // it asynchronously fills them into the form. Thus we can safely call + // `Reset()` here, and we should as from this class' point of view the + // authentication flow is complete. + Reset(); +} + } // namespace autofill
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager.h b/components/autofill/core/browser/payments/credit_card_access_manager.h index 84f8b2b..84afa1c 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager.h +++ b/components/autofill/core/browser/payments/credit_card_access_manager.h
@@ -349,6 +349,9 @@ // Helper function to fetch virtual cards. void FetchVirtualCard(); + // Helper function to fetch local or full server cards. + void FetchLocalOrFullServerCard(); + // Callback function invoked when risk data is fetched. void OnDidGetUnmaskRiskData(const std::string& risk_data); @@ -396,6 +399,30 @@ bool ShouldLogServerCardUnmaskAttemptMetrics( CreditCard::RecordType record_type); + // Starts the device authentication flow during a payments autofill form fill. + // `OnDeviceAuthenticationResponseForFilling()` will be invoked when we + // receive a response from the device authentication. `accessor` will be used + // to handle the response of the authentication, and possibly fill the card + // into the form. `card` is the card that needs to be filled. `cvc` is the CVC + // of the card that needs to be filled, and can be empty if we are autofilling + // a card that does not have a CVC saved (for example, a local card). This + // function should only be called on platforms where DeviceAuthenticator is + // present. + void StartDeviceAuthenticationForFilling(base::WeakPtr<Accessor> accessor, + const CreditCard* card, + const std::u16string& cvc); + + // Callback function invoked when we receive a response from a mandatory + // re-auth authentication in a flow where we might fill the card after the + // response. If it is successful, we will fill `card` and `cvc` into the form + // using `accessor`, otherwise we will handle the error. `successful_auth` is + // true if the authentication waas successful, false otherwise. + void OnDeviceAuthenticationResponseForFilling( + base::WeakPtr<Accessor> accessor, + const CreditCard* card, + const std::u16string& cvc, + bool successful_auth); + // The current form of authentication in progress. UnmaskAuthFlowType unmask_auth_flow_type_ = UnmaskAuthFlowType::kNone;
diff --git a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc index db45979..c52e48a 100644 --- a/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_access_manager_unittest.cc
@@ -60,6 +60,7 @@ #include "components/autofill/core/common/autofill_switches.h" #include "components/autofill/core/common/autofill_util.h" #include "components/autofill/core/common/form_data.h" +#include "components/device_reauth/mock_device_authenticator.h" #include "components/prefs/pref_service.h" #include "components/security_state/core/security_state.h" #include "components/strings/grit/components_strings.h" @@ -616,6 +617,100 @@ EXPECT_EQ(body, std::u16string()); } +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +// Parameters of the CreditCardAccessManagerMandatoryReauthTest: +// - bool feature_flag_is_on: Whether the mandatory re-auth feature flag is +// turned on or off. +// - bool pref_is_enabled: Whether the mandatory re-auth pref is turned on or +// off. +// - bool mandatory_reauth_response_is_success: Whether the response from the +// mandatory re-auth is a success or failure. +class CreditCardAccessManagerMandatoryReauthTest + : public CreditCardAccessManagerTest, + public testing::WithParamInterface<std::tuple<bool, bool, bool>> { + public: + CreditCardAccessManagerMandatoryReauthTest() = default; + ~CreditCardAccessManagerMandatoryReauthTest() override = default; + + void SetUp() override { + CreditCardAccessManagerTest::SetUp(); + feature_list_.InitWithFeatureState( + features::kAutofillEnablePaymentsMandatoryReauth, FeatureFlagIsOn()); + } + + bool FeatureFlagIsOn() const { return std::get<0>(GetParam()); } + + bool PrefIsEnabled() const { return std::get<1>(GetParam()); } + + bool MandatoryReauthResponseIsSuccess() const { + return std::get<2>(GetParam()); + } + + private: + base::test::ScopedFeatureList feature_list_; +}; + +// Tests that retrieving local cards works correctly in the context of the +// Mandatory Re-Auth feature. +TEST_P(CreditCardAccessManagerMandatoryReauthTest, + MandatoryReauth_FetchLocalCard) { + autofill_client_.GetPrefs()->SetBoolean( + prefs::kAutofillPaymentMethodsMandatoryReauth, /*value=*/PrefIsEnabled()); + CreateLocalCard(kTestGUID, kTestNumber); + CreditCard* card = personal_data().GetCreditCardByGUID(kTestGUID); + + credit_card_access_manager_->PrepareToFetchCreditCard(); + WaitForCallbacks(); + + // We should only expect an AuthenticateWithMessage() call if the feature flag + // is on and the pref is enabled. + if (FeatureFlagIsOn() && PrefIsEnabled()) { + ON_CALL(*static_cast<device_reauth::MockDeviceAuthenticator*>( + autofill_client_.GetDeviceAuthenticator().get()), +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + AuthenticateWithMessage) +#elif BUILDFLAG(IS_ANDROID) + Authenticate) +#endif + .WillByDefault(testing::WithArg<1>( + testing::Invoke([mandatory_reauth_response_is_success = + MandatoryReauthResponseIsSuccess()]( + base::OnceCallback<void(bool)> callback) { + std::move(callback).Run(mandatory_reauth_response_is_success); + }))); + } else { + EXPECT_CALL(*static_cast<device_reauth::MockDeviceAuthenticator*>( + autofill_client_.GetDeviceAuthenticator().get()), +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + AuthenticateWithMessage) +#elif BUILDFLAG(IS_ANDROID) + Authenticate) +#endif + .Times(0); + } + + credit_card_access_manager_->FetchCreditCard(card, accessor_->GetWeakPtr()); + + // The only time we should expect an error is if the feature flag is on, the + // pref is enabled, but the mandatory re-auth authentication was not + // successful. + if (FeatureFlagIsOn() && PrefIsEnabled() && + !MandatoryReauthResponseIsSuccess()) { + EXPECT_EQ(accessor_->result(), CreditCardFetchResult::kTransientError); + EXPECT_TRUE(accessor_->number().empty()); + } else { + EXPECT_EQ(accessor_->result(), CreditCardFetchResult::kSuccess); + EXPECT_EQ(kTestNumber16, accessor_->number()); + } +} + +INSTANTIATE_TEST_SUITE_P(, + CreditCardAccessManagerMandatoryReauthTest, + testing::Combine(testing::Bool(), + testing::Bool(), + testing::Bool())); +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + // Tests retrieving local cards. TEST_F(CreditCardAccessManagerTest, FetchLocalCardSuccess) { CreateLocalCard(kTestGUID, kTestNumber);
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index b56b5965..ee602fa 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -1850,6 +1850,15 @@ sync_service_->GetPreferredDataTypes().Has(model_type); } +bool PersonalDataManager::IsAutofillPaymentMethodsMandatoryReauthEnabled() { + if (!base::FeatureList::IsEnabled( + features::kAutofillEnablePaymentsMandatoryReauth)) { + return false; + } + + return prefs::IsAutofillPaymentMethodsMandatoryReauthEnabled(pref_service_); +} + AutofillProfileMigrationStrikeDatabase* PersonalDataManager::GetProfileMigrationStrikeDatabase() { return const_cast<AutofillProfileMigrationStrikeDatabase*>(
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h index 27ec52c..b32ea600 100644 --- a/components/autofill/core/browser/personal_data_manager.h +++ b/components/autofill/core/browser/personal_data_manager.h
@@ -567,6 +567,9 @@ // Returns true if Sync is enabled for `model_type`. bool IsSyncEnabledFor(syncer::ModelType model_type) const; + // Returns true if payments mandatory re-auth is enabled. + bool IsAutofillPaymentMethodsMandatoryReauthEnabled(); + // Used to automatically import addresses without a prompt. Should only be // set to true in tests. void set_auto_accept_address_imports_for_testing(bool auto_accept) {
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h index 1c6a5be..cc59e52 100644 --- a/components/autofill/core/browser/test_autofill_client.h +++ b/components/autofill/core/browser/test_autofill_client.h
@@ -15,6 +15,7 @@ #include "base/compiler_specific.h" #include "base/feature_list.h" #include "base/i18n/rtl.h" +#include "base/memory/scoped_refptr.h" #include "base/scoped_observation.h" #include "base/strings/utf_string_conversions.h" #include "build/build_config.h" @@ -40,10 +41,12 @@ #include "components/autofill/core/browser/test_address_normalizer.h" #include "components/autofill/core/browser/test_form_data_importer.h" #include "components/autofill/core/browser/test_personal_data_manager.h" +#include "components/autofill/core/browser/ui/mock_fast_checkout_client.h" #include "components/autofill/core/browser/ui/payments/card_unmask_prompt_options.h" #include "components/autofill/core/browser/ui/popup_types.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/autofill/core/common/autofill_features.h" +#include "components/device_reauth/mock_device_authenticator.h" #include "components/prefs/pref_service.h" #include "components/signin/public/identity_manager/identity_test_environment.h" #include "components/translate/core/browser/language_state.h" @@ -192,6 +195,10 @@ return autofill_offer_manager_.get(); } + FastCheckoutClient* GetFastCheckoutClient() override { + return &mock_fast_checkout_client_; + } + const GURL& GetLastCommittedPrimaryMainFrameURL() const override { return last_committed_primary_main_frame_url_; } @@ -453,6 +460,15 @@ return {}; } + scoped_refptr<device_reauth::DeviceAuthenticator> GetDeviceAuthenticator() + const override { +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + return mock_device_authenticator_; +#else + return nullptr; +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + } + void LoadRiskData( base::OnceCallback<void(const std::string&)> callback) override { std::move(callback).Run("some risk data"); @@ -641,6 +657,10 @@ std::unique_ptr<testing::NiceMock<MockIBANManager>> mock_iban_manager_; ::testing::NiceMock<MockMerchantPromoCodeManager> mock_merchant_promo_code_manager_; + ::testing::NiceMock<MockFastCheckoutClient> mock_fast_checkout_client_; + scoped_refptr<device_reauth::MockDeviceAuthenticator> + mock_device_authenticator_ = + base::MakeRefCounted<device_reauth::MockDeviceAuthenticator>(); // NULL by default. std::unique_ptr<PrefService> prefs_;
diff --git a/components/autofill/core/browser/test_autofill_manager_waiter.h b/components/autofill/core/browser/test_autofill_manager_waiter.h index d9dc6876..8e18afe 100644 --- a/components/autofill/core/browser/test_autofill_manager_waiter.h +++ b/components/autofill/core/browser/test_autofill_manager_waiter.h
@@ -10,6 +10,7 @@ #include <vector> #include "base/containers/span.h" +#include "base/location.h" #include "base/run_loop.h" #include "base/scoped_observation.h" #include "base/synchronization/lock.h" @@ -142,10 +143,8 @@ }; bool IsRelevant(Event event) const; - void Increment(Event event, - base::Location location = base::Location::Current()); - void Decrement(Event event, - base::Location location = base::Location::Current()); + void Increment(Event event, base::Location location = FROM_HERE); + void Decrement(Event event, base::Location location = FROM_HERE); void OnAutofillManagerDestroyed(AutofillManager& manager) override; void OnAutofillManagerReset(AutofillManager& manager) override;
diff --git a/components/autofill/core/browser/test_event_waiter.h b/components/autofill/core/browser/test_event_waiter.h index 587b948..00f9043 100644 --- a/components/autofill/core/browser/test_event_waiter.h +++ b/components/autofill/core/browser/test_event_waiter.h
@@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" +#include "testing/gtest/include/gtest/gtest.h" namespace autofill { @@ -30,7 +31,8 @@ class EventWaiter { public: explicit EventWaiter(std::list<Event> expected_event_sequence, - base::TimeDelta timeout = base::Seconds(0)); + base::TimeDelta timeout = base::Seconds(0), + base::Location location = FROM_HERE); EventWaiter(const EventWaiter&) = delete; EventWaiter& operator=(const EventWaiter&) = delete; @@ -40,20 +42,25 @@ // Either returns right away if all events were observed between this // object's construction and this call to Wait(), or use a RunLoop to wait // for them. - bool Wait(); + [[nodiscard]] testing::AssertionResult Wait(); // Observes an event (quits the RunLoop if we are done waiting). void OnEvent(Event event); private: std::list<Event> expected_events_; + base::TimeDelta timeout_; + base::Location location_; base::RunLoop run_loop_; }; template <typename Event> EventWaiter<Event>::EventWaiter(std::list<Event> expected_event_sequence, - base::TimeDelta timeout) - : expected_events_(std::move(expected_event_sequence)) { + base::TimeDelta timeout, + base::Location location) + : expected_events_(std::move(expected_event_sequence)), + timeout_(timeout), + location_(location) { if (!timeout.is_zero()) { base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( FROM_HERE, run_loop_.QuitClosure(), timeout); @@ -64,13 +71,20 @@ EventWaiter<Event>::~EventWaiter() {} template <typename Event> -bool EventWaiter<Event>::Wait() { +testing::AssertionResult EventWaiter<Event>::Wait() { if (expected_events_.empty()) - return true; + return testing::AssertionSuccess(); DCHECK(!run_loop_.running()); run_loop_.Run(); - return expected_events_.empty(); + if (expected_events_.empty()) { + return testing::AssertionSuccess(); + } + return testing::AssertionFailure() + << expected_events_.size() + << " expected event(s) still pending after RunLoop timeout of " + << timeout_ << ", from EventWaiter created in " + << location_.ToString(); } template <typename Event> @@ -78,7 +92,8 @@ if (expected_events_.empty()) return; - ASSERT_EQ(expected_events_.front(), actual_event); + ASSERT_EQ(expected_events_.front(), actual_event) + << " in EventWaiter created at " << location_.ToString(); expected_events_.pop_front(); // Only quit the loop if no other events are expected. if (expected_events_.empty() && run_loop_.running())
diff --git a/chrome/browser/fast_checkout/fast_checkout_client.h b/components/autofill/core/browser/ui/fast_checkout_client.h similarity index 78% rename from chrome/browser/fast_checkout/fast_checkout_client.h rename to components/autofill/core/browser/ui/fast_checkout_client.h index cf4d66d..fc71133 100644 --- a/chrome/browser/fast_checkout/fast_checkout_client.h +++ b/components/autofill/core/browser/ui/fast_checkout_client.h
@@ -1,9 +1,9 @@ -// Copyright 2022 The Chromium Authors +// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_FAST_CHECKOUT_FAST_CHECKOUT_CLIENT_H_ -#define CHROME_BROWSER_FAST_CHECKOUT_FAST_CHECKOUT_CLIENT_H_ +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_UI_FAST_CHECKOUT_CLIENT_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_UI_FAST_CHECKOUT_CLIENT_H_ #include "base/memory/weak_ptr.h" @@ -15,19 +15,12 @@ struct FormFieldData; } // namespace autofill -namespace content { -class WebContents; -} // namespace content - // Abstract interface for handling a fast checkout run. class FastCheckoutClient { public: FastCheckoutClient(const FastCheckoutClient&) = delete; FastCheckoutClient& operator=(const FastCheckoutClient&) = delete; - - // Factory method for creating a `FastCheckoutClient` instance. - static FastCheckoutClient* GetOrCreateForWebContents( - content::WebContents* web_contents); + virtual ~FastCheckoutClient() = default; // Starts the fast checkout run. Returns true if the run was successful. virtual bool TryToStart( @@ -60,7 +53,6 @@ protected: FastCheckoutClient() = default; - virtual ~FastCheckoutClient() = default; }; -#endif // CHROME_BROWSER_FAST_CHECKOUT_FAST_CHECKOUT_CLIENT_H_ +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_UI_FAST_CHECKOUT_CLIENT_H_
diff --git a/components/autofill/core/browser/ui/mock_fast_checkout_client.cc b/components/autofill/core/browser/ui/mock_fast_checkout_client.cc new file mode 100644 index 0000000..ddc4ebb --- /dev/null +++ b/components/autofill/core/browser/ui/mock_fast_checkout_client.cc
@@ -0,0 +1,9 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/ui/mock_fast_checkout_client.h" + +MockFastCheckoutClient::MockFastCheckoutClient() = default; + +MockFastCheckoutClient::~MockFastCheckoutClient() = default;
diff --git a/chrome/browser/fast_checkout/mock_fast_checkout_client.h b/components/autofill/core/browser/ui/mock_fast_checkout_client.h similarity index 71% rename from chrome/browser/fast_checkout/mock_fast_checkout_client.h rename to components/autofill/core/browser/ui/mock_fast_checkout_client.h index 370d9df..751aaa6 100644 --- a/chrome/browser/fast_checkout/mock_fast_checkout_client.h +++ b/components/autofill/core/browser/ui/mock_fast_checkout_client.h
@@ -2,19 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_FAST_CHECKOUT_MOCK_FAST_CHECKOUT_CLIENT_H_ -#define CHROME_BROWSER_FAST_CHECKOUT_MOCK_FAST_CHECKOUT_CLIENT_H_ +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_UI_MOCK_FAST_CHECKOUT_CLIENT_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_UI_MOCK_FAST_CHECKOUT_CLIENT_H_ -#include "chrome/browser/fast_checkout/fast_checkout_client_impl.h" +#include "components/autofill/core/browser/ui/fast_checkout_client.h" #include "testing/gmock/include/gmock/gmock.h" -class MockFastCheckoutClient : public FastCheckoutClientImpl { +class MockFastCheckoutClient : public FastCheckoutClient { public: - static MockFastCheckoutClient* CreateForWebContents( - content::WebContents* web_contents); - - explicit MockFastCheckoutClient(content::WebContents* web_contents); + MockFastCheckoutClient(); ~MockFastCheckoutClient() override; MOCK_METHOD(bool, @@ -40,4 +37,4 @@ MOCK_METHOD(bool, IsNotShownYet, (), (const override)); }; -#endif +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_UI_MOCK_FAST_CHECKOUT_CLIENT_H_
diff --git a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc index eff9fb3..ab981a6b 100644 --- a/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc +++ b/components/autofill/core/browser/webdata/autofill_profile_sync_bridge.cc
@@ -14,7 +14,6 @@ #include "base/strings/utf_string_conversions.h" #include "components/autofill/core/browser/autofill_profile_sync_util.h" #include "components/autofill/core/browser/data_model/autofill_profile.h" -#include "components/autofill/core/browser/geo/country_names.h" #include "components/autofill/core/browser/proto/autofill_sync.pb.h" #include "components/autofill/core/browser/webdata/autofill_profile_sync_difference_tracker.h" #include "components/autofill/core/browser/webdata/autofill_table.h" @@ -80,12 +79,6 @@ web_data_backend_(backend) { DCHECK(web_data_backend_); - // Ensure the CountryNames instance has the locale set, as it is used deeper - // in subsequent bridge lifecycle's calls, which may happen at a very early - // application launching stage. - // TODO(1430250): Find a unified place for setting the locale - CountryNames::SetLocaleString(app_locale); - scoped_observation_.Observe(web_data_backend_.get()); LoadMetadata();
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index a0bf743..26d291a 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -17,6 +17,7 @@ #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/debug/crash_logging.h" #include "base/i18n/case_conversion.h" #include "base/logging.h" #include "base/numerics/safe_conversions.h" @@ -3504,7 +3505,8 @@ s_exists.BindString16(0, element.name); s_exists.BindString16(1, element.value); if (!s_exists.Step()) { - NOTREACHED() << create_debug_info("SELECT"); + SCOPED_CRASH_KEY_STRING1024("autofill", "sql", create_debug_info("SELECT")); + NOTREACHED(); return false; } @@ -3517,7 +3519,9 @@ s.BindString16(1, element.name); s.BindString16(2, element.value); if (!s.Run()) { - NOTREACHED() << create_debug_info("UPDATE"); + SCOPED_CRASH_KEY_STRING1024("autofill", "sql", + create_debug_info("UPDATE")); + NOTREACHED(); return false; } } else { @@ -3533,7 +3537,9 @@ s.BindInt64(4, time_as_time_t); s.BindInt(5, 1); if (!s.Run()) { - NOTREACHED() << create_debug_info("INSERT"); + SCOPED_CRASH_KEY_STRING1024("autofill", "sql", + create_debug_info("INSERT")); + NOTREACHED(); return false; } }
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp index 4c9ab68a..25255f83 100644 --- a/components/autofill_payments_strings.grdp +++ b/components/autofill_payments_strings.grdp
@@ -454,6 +454,18 @@ Verifying... </message> + <!-- DeviceAuthentication titles--> + <if expr="is_macosx"> + <message name="IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH" desc="Text that appears in the payments autofill mandatory re-authentication popup, asking the user to authenticate using biometric or device unlock before filling. Please note that on macOS the string 'Google Chrome is trying to' will always come before this string."> + verify it's you so it can fill in your payment info. + </message> + </if> + <if expr="is_win"> + <message name="IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH" desc="Text that appears in the payments autofill mandatory re-authentication popup, asking the user to authenticate using biometric or device unlock before filling."> + Google Chrome is trying to verify it's you so it can fill in your payment info. + </message> + </if> + <!-- WebAuthn fingerprint opt-in dialog --> <!-- Desktop only --> <if expr="not is_ios and not is_android">
diff --git a/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH.png.sha1 b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH.png.sha1 new file mode 100644 index 0000000..ec02d76 --- /dev/null +++ b/components/autofill_payments_strings_grdp/IDS_PAYMENTS_AUTOFILL_FILLING_MANDATORY_REAUTH.png.sha1
@@ -0,0 +1 @@ +d5f423d6dce6cc813fb9e2faf094a414d9662689 \ No newline at end of file
diff --git a/components/autofill_strings.grdp b/components/autofill_strings.grdp index 83a09dc..fb4e030 100644 --- a/components/autofill_strings.grdp +++ b/components/autofill_strings.grdp
@@ -227,7 +227,7 @@ In your Google Account <ph name="ACCOUNT">$1<ex>alexpark@gmail.com</ex></ph> </message> <message name="IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE" desc="The notice/warning message for the user that this address is going to be migrated in their account."> - Save address in your Google Account, <ph name="ACCOUNT">$1<ex>alexpark@gmail.com</ex></ph> + You can use it across Google products </message> <message name="IDS_AUTOFILL_ADDRESS_ALREADY_SAVED_IN_ACCOUNT_SOURCE_NOTICE" desc="The footer message used to notify user that their address is stored in their account." formatter_data="android_java"> You can use saved addresses across Google products. This address is saved in your Google Account (<ph name="ACCOUNT">$1<ex>alexpark@gmail.com</ex></ph>). @@ -355,6 +355,9 @@ <message name="IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_MIGRATION_OK_BUTTON_LABEL" desc="Label of the OK button in the prompt that offers the user to migrate a new address to their Google account."> Save in account </message> + <message name="IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE" desc="Title shown at the top of prompt that offers the user to save existing address into account."> + Save address in account? + </message> <message name="IDS_AUTOFILL_UPDATE_ADDRESS_PROMPT_OK_BUTTON_LABEL" desc="Label of the OK button in the prompt that offers the user to update an existing address."> Update </message> @@ -429,9 +432,6 @@ <message name="IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_TITLE" desc="Title shown at the top of prompt that offers the user to save a new address."> Save address? </message> - <message name="IDS_AUTOFILL_ACCOUNT_MIGRATE_ADDRESS_PROMPT_TITLE" desc="Title shown at the top of prompt that offers the user to save existing address into account."> - Save address in account? - </message> <message name="IDS_AUTOFILL_SAVE_ADDRESS_PROMPT_CANCEL_BUTTON_LABEL" desc="Label of the Cancel button in the prompt that offers the user to save a new address."> No thanks </message>
diff --git a/components/autofill_strings_grdp/IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE.png.sha1 b/components/autofill_strings_grdp/IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE.png.sha1 index e100dde..dcacb09 100644 --- a/components/autofill_strings_grdp/IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE.png.sha1 +++ b/components/autofill_strings_grdp/IDS_AUTOFILL_SAVE_IN_ACCOUNT_MESSAGE_ADDRESS_MIGRATION_SOURCE_NOTICE.png.sha1
@@ -1 +1 @@ -19c85c61279ca2fb6c4cc53eebbd69ac55fcce8a \ No newline at end of file +08b7842f7fe23522aea2641fa08dc23be2b6999c \ No newline at end of file
diff --git a/components/bookmarks/browser/bookmark_codec.cc b/components/bookmarks/browser/bookmark_codec.cc index e3950e0..0476cf90 100644 --- a/components/bookmarks/browser/bookmark_codec.cc +++ b/components/bookmarks/browser/bookmark_codec.cc
@@ -67,11 +67,7 @@ } // namespace -BookmarkCodec::BookmarkCodec() - : ids_reassigned_(false), - guids_reassigned_(false), - ids_valid_(true), - maximum_id_(0) {} +BookmarkCodec::BookmarkCodec() = default; BookmarkCodec::~BookmarkCodec() = default; @@ -91,7 +87,7 @@ const BookmarkNode::MetaInfoMap* model_unsynced_meta_info_map, std::string sync_metadata_str) { ids_reassigned_ = false; - guids_reassigned_ = false; + uuids_reassigned_ = false; base::Value::Dict main; main.Set(kVersionKey, kCurrentVersion); @@ -131,13 +127,13 @@ int64_t* max_id, std::string* sync_metadata_str) { ids_.clear(); - guids_ = {base::Uuid::ParseLowercase(BookmarkNode::kRootNodeGuid), - base::Uuid::ParseLowercase(BookmarkNode::kBookmarkBarNodeGuid), - base::Uuid::ParseLowercase(BookmarkNode::kOtherBookmarksNodeGuid), - base::Uuid::ParseLowercase(BookmarkNode::kMobileBookmarksNodeGuid), - base::Uuid::ParseLowercase(BookmarkNode::kManagedNodeGuid)}; + uuids_ = {base::Uuid::ParseLowercase(BookmarkNode::kRootNodeUuid), + base::Uuid::ParseLowercase(BookmarkNode::kBookmarkBarNodeUuid), + base::Uuid::ParseLowercase(BookmarkNode::kOtherBookmarksNodeUuid), + base::Uuid::ParseLowercase(BookmarkNode::kMobileBookmarksNodeUuid), + base::Uuid::ParseLowercase(BookmarkNode::kManagedNodeUuid)}; ids_reassigned_ = false; - guids_reassigned_ = false; + uuids_reassigned_ = false; ids_valid_ = true; maximum_id_ = 0; stored_checksum_.clear(); @@ -159,8 +155,8 @@ value.Set(kIdKey, id); const std::u16string& title = node->GetTitle(); value.Set(kNameKey, title); - const std::string& guid = node->guid().AsLowercaseString(); - value.Set(kGuidKey, guid); + const std::string& uuid = node->uuid().AsLowercaseString(); + value.Set(kGuidKey, uuid); // TODO(crbug.com/634507): Avoid ToInternalValue(). value.Set(kDateAddedKey, base::NumberToString(node->date_added().ToInternalValue())); @@ -304,37 +300,37 @@ if (string_value) title = base::UTF8ToUTF16(*string_value); - base::Uuid guid; + base::Uuid uuid; // |node| is only passed in for bookmarks of type BookmarkPermanentNode, in - // which case we do not need to check for GUID validity as their GUIDs are + // which case we do not need to check for UUID validity as their UUIDs are // hard-coded and not read from the persisted file. if (!node) { - // GUIDs can be empty for bookmarks that were created before GUIDs were + // UUIDs can be empty for bookmarks that were created before UUIDs were // required. When encountering one such bookmark we thus assign to it a new - // GUID. The same applies if the stored GUID is invalid or a duplicate. - const std::string* guid_str = value.FindString(kGuidKey); - if (guid_str && !guid_str->empty()) { - guid = base::Uuid::ParseCaseInsensitive(*guid_str); + // UUID. The same applies if the stored UUID is invalid or a duplicate. + const std::string* uuid_str = value.FindString(kGuidKey); + if (uuid_str && !uuid_str->empty()) { + uuid = base::Uuid::ParseCaseInsensitive(*uuid_str); } - if (!guid.is_valid()) { - guid = base::Uuid::GenerateRandomV4(); - guids_reassigned_ = true; + if (!uuid.is_valid()) { + uuid = base::Uuid::GenerateRandomV4(); + uuids_reassigned_ = true; } - if (guid.AsLowercaseString() == BookmarkNode::kBannedGuidDueToPastSyncBug) { - guid = base::Uuid::GenerateRandomV4(); - guids_reassigned_ = true; + if (uuid.AsLowercaseString() == BookmarkNode::kBannedUuidDueToPastSyncBug) { + uuid = base::Uuid::GenerateRandomV4(); + uuids_reassigned_ = true; } - // Guard against GUID collisions, which would violate BookmarkModel's - // invariant that each GUID is unique. - if (base::Contains(guids_, guid)) { - guid = base::Uuid::GenerateRandomV4(); - guids_reassigned_ = true; + // Guard against UUID collisions, which would violate BookmarkModel's + // invariant that each UUID is unique. + if (base::Contains(uuids_, uuid)) { + uuid = base::Uuid::GenerateRandomV4(); + uuids_reassigned_ = true; } - guids_.insert(guid); + uuids_.insert(uuid); } std::string date_added_string; @@ -369,8 +365,8 @@ GURL url = GURL(*url_string); if (!node && url.is_valid()) { - DCHECK(guid.is_valid()); - node = new BookmarkNode(id, guid, url); + DCHECK(uuid.is_valid()); + node = new BookmarkNode(id, uuid, url); } else { return false; // Node invalid. } @@ -391,8 +387,8 @@ return false; if (!node) { - DCHECK(guid.is_valid()); - node = new BookmarkNode(id, guid, GURL()); + DCHECK(uuid.is_valid()); + node = new BookmarkNode(id, uuid, GURL()); } else { // If a new node is not created, explicitly assign ID to the existing one. node->set_id(id);
diff --git a/components/bookmarks/browser/bookmark_codec.h b/components/bookmarks/browser/bookmark_codec.h index ceac548..930d0ad 100644 --- a/components/bookmarks/browser/bookmark_codec.h +++ b/components/bookmarks/browser/bookmark_codec.h
@@ -86,9 +86,9 @@ // false after encoding. bool ids_reassigned() const { return ids_reassigned_; } - // Returns whether the GUIDs were reassigned during decoding. Always returns + // Returns whether the UUIDs were reassigned during decoding. Always returns // false after encoding. - bool guids_reassigned() const { return guids_reassigned_; } + bool uuids_reassigned() const { return uuids_reassigned_; } // Names of the various keys written to the Value. static const char kRootsKey[]; @@ -190,22 +190,22 @@ void FinalizeChecksum(); // Whether or not IDs were reassigned by the codec. - bool ids_reassigned_; + bool ids_reassigned_{false}; - // Whether or not GUIDs were reassigned by the codec. - bool guids_reassigned_; + // Whether or not UUIDs were reassigned by the codec. + bool uuids_reassigned_{false}; // Whether or not IDs are valid. This is initially true, but set to false // if an id is missing or not unique. - bool ids_valid_; + bool ids_valid_{true}; // Contains the id of each of the nodes found in the file. Used to determine // if we have duplicates. std::set<int64_t> ids_; - // Contains the GUID of each of the nodes found in the file. Used to determine + // Contains the UUID of each of the nodes found in the file. Used to determine // if we have duplicates. - std::set<base::Uuid> guids_; + std::set<base::Uuid> uuids_; // MD5 context used to compute MD5 hash of all bookmark data. base::MD5Context md5_context_; @@ -215,7 +215,7 @@ std::string stored_checksum_; // Maximum ID assigned when decoding data. - int64_t maximum_id_; + int64_t maximum_id_{0}; // Meta info set on bookmark model root. BookmarkNode::MetaInfoMap model_meta_info_map_;
diff --git a/components/bookmarks/browser/bookmark_codec_unittest.cc b/components/bookmarks/browser/bookmark_codec_unittest.cc index 934867a..438142c 100644 --- a/components/bookmarks/browser/bookmark_codec_unittest.cc +++ b/components/bookmarks/browser/bookmark_codec_unittest.cc
@@ -61,7 +61,7 @@ ASSERT_TRUE(expected); ASSERT_TRUE(actual); EXPECT_EQ(expected->id(), actual->id()); - EXPECT_EQ(expected->guid(), actual->guid()); + EXPECT_EQ(expected->uuid(), actual->uuid()); EXPECT_EQ(expected->GetTitle(), actual->GetTitle()); EXPECT_EQ(expected->type(), actual->type()); EXPECT_TRUE(expected->date_added() == actual->date_added()); @@ -495,29 +495,29 @@ TEST_F(BookmarkCodecTest, EncodeAndDecodeGuid) { std::unique_ptr<BookmarkModel> model(CreateTestModel2()); - ASSERT_TRUE(model->bookmark_bar_node()->children()[0]->guid().is_valid()); - ASSERT_TRUE(model->bookmark_bar_node()->children()[1]->guid().is_valid()); - ASSERT_NE(model->bookmark_bar_node()->children()[0]->guid(), - model->bookmark_bar_node()->children()[1]->guid()); + ASSERT_TRUE(model->bookmark_bar_node()->children()[0]->uuid().is_valid()); + ASSERT_TRUE(model->bookmark_bar_node()->children()[1]->uuid().is_valid()); + ASSERT_NE(model->bookmark_bar_node()->children()[0]->uuid(), + model->bookmark_bar_node()->children()[1]->uuid()); std::string checksum; base::Value::Dict model_value = EncodeHelper(model.get(), /*sync_metadata_str=*/std::string(), &checksum); - // Decode and check for GUIDs. + // Decode and check for UUIDs. std::unique_ptr<BookmarkModel> decoded_model = DecodeHelper(model_value, checksum, &checksum, /*expected_changes=*/false, /*sync_metadata_str=*/nullptr); ASSERT_NO_FATAL_FAILURE(AssertModelsEqual(model.get(), decoded_model.get())); - EXPECT_EQ(model->bookmark_bar_node()->children()[0]->guid(), - decoded_model->bookmark_bar_node()->children()[0]->guid()); - EXPECT_EQ(model->bookmark_bar_node()->children()[1]->guid(), - decoded_model->bookmark_bar_node()->children()[1]->guid()); + EXPECT_EQ(model->bookmark_bar_node()->children()[0]->uuid(), + decoded_model->bookmark_bar_node()->children()[0]->uuid()); + EXPECT_EQ(model->bookmark_bar_node()->children()[1]->uuid(), + decoded_model->bookmark_bar_node()->children()[1]->uuid()); } -TEST_F(BookmarkCodecTest, ReassignEmptyGUID) { +TEST_F(BookmarkCodecTest, ReassignEmptyUuid) { std::unique_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); BookmarkCodec encoder; @@ -529,15 +529,15 @@ ASSERT_TRUE(Decode(&decoder1, value, decoded_model1.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_FALSE(decoder1.guids_reassigned()); + EXPECT_FALSE(decoder1.uuids_reassigned()); - // Change GUID of child to be empty. + // Change UUID of child to be empty. base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); - std::string* guid_str = + std::string* uuid_str = child_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(guid_str); - std::string original_guid_str = *guid_str; + ASSERT_TRUE(uuid_str); + std::string original_uuid_str = *uuid_str; child_value->GetDict().Set(BookmarkCodec::kGuidKey, ""); std::unique_ptr<BookmarkModel> decoded_model2( @@ -546,15 +546,15 @@ ASSERT_TRUE(Decode(&decoder2, value, decoded_model2.get(), /*sync_metadata_str=*/nullptr)); - const base::Uuid guid = base::Uuid::ParseCaseInsensitive(original_guid_str); - ASSERT_TRUE(guid.is_valid()); - EXPECT_NE(guid, decoded_model2->bookmark_bar_node()->children()[0]->guid()); + const base::Uuid uuid = base::Uuid::ParseCaseInsensitive(original_uuid_str); + ASSERT_TRUE(uuid.is_valid()); + EXPECT_NE(uuid, decoded_model2->bookmark_bar_node()->children()[0]->uuid()); EXPECT_TRUE( - decoded_model2->bookmark_bar_node()->children()[0]->guid().is_valid()); - EXPECT_TRUE(decoder2.guids_reassigned()); + decoded_model2->bookmark_bar_node()->children()[0]->uuid().is_valid()); + EXPECT_TRUE(decoder2.uuids_reassigned()); } -TEST_F(BookmarkCodecTest, ReassignMissingGUID) { +TEST_F(BookmarkCodecTest, ReassignMissingUuid) { std::unique_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); BookmarkCodec encoder; @@ -566,15 +566,15 @@ ASSERT_TRUE(Decode(&decoder1, value, decoded_model1.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_FALSE(decoder1.guids_reassigned()); + EXPECT_FALSE(decoder1.uuids_reassigned()); - // Change GUID of child to be missing. + // Change UUID of child to be missing. base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); - std::string* guid_str = + std::string* uuid_str = child_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(guid_str); - std::string original_guid_str = *guid_str; + ASSERT_TRUE(uuid_str); + std::string original_uuid_str = *uuid_str; child_value->GetDict().Remove(BookmarkCodec::kGuidKey); std::unique_ptr<BookmarkModel> decoded_model2( @@ -583,15 +583,15 @@ ASSERT_TRUE(Decode(&decoder2, value, decoded_model2.get(), /*sync_metadata_str=*/nullptr)); - const base::Uuid guid = base::Uuid::ParseCaseInsensitive(original_guid_str); - ASSERT_TRUE(guid.is_valid()); - EXPECT_NE(guid, decoded_model2->bookmark_bar_node()->children()[0]->guid()); + const base::Uuid uuid = base::Uuid::ParseCaseInsensitive(original_uuid_str); + ASSERT_TRUE(uuid.is_valid()); + EXPECT_NE(uuid, decoded_model2->bookmark_bar_node()->children()[0]->uuid()); EXPECT_TRUE( - decoded_model2->bookmark_bar_node()->children()[0]->guid().is_valid()); - EXPECT_TRUE(decoder2.guids_reassigned()); + decoded_model2->bookmark_bar_node()->children()[0]->uuid().is_valid()); + EXPECT_TRUE(decoder2.uuids_reassigned()); } -TEST_F(BookmarkCodecTest, ReassignInvalidGUID) { +TEST_F(BookmarkCodecTest, ReassignInvalidUuid) { const std::string kInvalidGuid = "0000"; ASSERT_FALSE(base::Uuid::ParseCaseInsensitive(kInvalidGuid).is_valid()); @@ -600,15 +600,15 @@ BookmarkCodec encoder; base::Value::Dict value(encoder.Encode(model_to_encode.get(), std::string())); - // Change GUID of child to be invalid. + // Change UUID of child to be invalid. base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); child_value->GetDict().Set(BookmarkCodec::kGuidKey, kInvalidGuid); - std::string* guid = + std::string* uuid = child_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(guid); - ASSERT_EQ(*guid, kInvalidGuid); + ASSERT_TRUE(uuid); + ASSERT_EQ(*uuid, kInvalidGuid); std::unique_ptr<BookmarkModel> decoded_model( TestBookmarkClient::CreateModel()); @@ -616,12 +616,12 @@ ASSERT_TRUE(Decode(&decoder, value, decoded_model.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_TRUE(decoder.guids_reassigned()); + EXPECT_TRUE(decoder.uuids_reassigned()); EXPECT_TRUE( - decoded_model->bookmark_bar_node()->children()[0]->guid().is_valid()); + decoded_model->bookmark_bar_node()->children()[0]->uuid().is_valid()); } -TEST_F(BookmarkCodecTest, ReassignDuplicateGUID) { +TEST_F(BookmarkCodecTest, ReassignDuplicateUuid) { std::unique_ptr<BookmarkModel> model_to_encode(CreateTestModel2()); BookmarkCodec encoder; @@ -630,20 +630,20 @@ base::Value* child1_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child1_value); - std::string* child1_guid = + std::string* child1_uuid = child1_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(child1_guid); + ASSERT_TRUE(child1_uuid); base::Value* child2_value = nullptr; GetBookmarksBarChildValue(&value, 1, &child2_value); - // Change GUID of child to be duplicate. - child2_value->GetDict().Set(BookmarkCodec::kGuidKey, *child1_guid); + // Change UUID of child to be duplicate. + child2_value->GetDict().Set(BookmarkCodec::kGuidKey, *child1_uuid); - std::string* child2_guid = + std::string* child2_uuid = child2_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(child2_guid); - ASSERT_EQ(*child1_guid, *child2_guid); + ASSERT_TRUE(child2_uuid); + ASSERT_EQ(*child1_uuid, *child2_uuid); std::unique_ptr<BookmarkModel> decoded_model( TestBookmarkClient::CreateModel()); @@ -651,14 +651,14 @@ ASSERT_TRUE(Decode(&decoder, value, decoded_model.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_TRUE(decoder.guids_reassigned()); - EXPECT_NE(decoded_model->bookmark_bar_node()->children()[0]->guid(), - decoded_model->bookmark_bar_node()->children()[1]->guid()); + EXPECT_TRUE(decoder.uuids_reassigned()); + EXPECT_NE(decoded_model->bookmark_bar_node()->children()[0]->uuid(), + decoded_model->bookmark_bar_node()->children()[1]->uuid()); } -TEST_F(BookmarkCodecTest, ReassignBannedGUID) { +TEST_F(BookmarkCodecTest, ReassignBannedUuid) { const base::Uuid kBannedGuid = - base::Uuid::ParseLowercase(BookmarkNode::kBannedGuidDueToPastSyncBug); + base::Uuid::ParseLowercase(BookmarkNode::kBannedUuidDueToPastSyncBug); ASSERT_TRUE(kBannedGuid.is_valid()); std::unique_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); @@ -666,7 +666,7 @@ BookmarkCodec encoder; base::Value::Dict value(encoder.Encode(model_to_encode.get(), std::string())); - // Change GUID of child to be invalid. + // Change UUID of child to be invalid. base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); child_value->GetDict().Set(BookmarkCodec::kGuidKey, @@ -678,14 +678,14 @@ ASSERT_TRUE(Decode(&decoder, value, decoded_model.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_TRUE(decoder.guids_reassigned()); + EXPECT_TRUE(decoder.uuids_reassigned()); EXPECT_TRUE( - decoded_model->bookmark_bar_node()->children()[0]->guid().is_valid()); - EXPECT_NE(decoded_model->bookmark_bar_node()->children()[0]->guid(), + decoded_model->bookmark_bar_node()->children()[0]->uuid().is_valid()); + EXPECT_NE(decoded_model->bookmark_bar_node()->children()[0]->uuid(), kBannedGuid); } -TEST_F(BookmarkCodecTest, ReassignPermanentNodeDuplicateGUID) { +TEST_F(BookmarkCodecTest, ReassignPermanentNodeDuplicateUuid) { std::unique_ptr<BookmarkModel> model_to_encode(CreateTestModel1()); BookmarkCodec encoder; @@ -694,14 +694,14 @@ base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); - // Change GUID of child to be the root node GUID. + // Change UUID of child to be the root node UUID. child_value->GetDict().Set(BookmarkCodec::kGuidKey, - BookmarkNode::kRootNodeGuid); + BookmarkNode::kRootNodeUuid); - std::string* child_guid = + std::string* child_uuid = child_value->GetDict().FindString(BookmarkCodec::kGuidKey); - ASSERT_TRUE(child_guid); - ASSERT_EQ(BookmarkNode::kRootNodeGuid, *child_guid); + ASSERT_TRUE(child_uuid); + ASSERT_EQ(BookmarkNode::kRootNodeUuid, *child_uuid); std::unique_ptr<BookmarkModel> decoded_model( TestBookmarkClient::CreateModel()); @@ -709,12 +709,12 @@ ASSERT_TRUE(Decode(&decoder, value, decoded_model.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_TRUE(decoder.guids_reassigned()); - EXPECT_NE(base::Uuid::ParseLowercase(BookmarkNode::kRootNodeGuid), - decoded_model->bookmark_bar_node()->children()[0]->guid()); + EXPECT_TRUE(decoder.uuids_reassigned()); + EXPECT_NE(base::Uuid::ParseLowercase(BookmarkNode::kRootNodeUuid), + decoded_model->bookmark_bar_node()->children()[0]->uuid()); } -TEST_F(BookmarkCodecTest, CanonicalizeGUID) { +TEST_F(BookmarkCodecTest, CanonicalizeUuid) { const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kUpperCaseGuid = base::ToUpperASCII(kGuid.AsLowercaseString()); @@ -723,7 +723,7 @@ BookmarkCodec encoder; base::Value::Dict value(encoder.Encode(model_to_encode.get(), std::string())); - // Change a GUID to a capitalized form, which could have been produced by an + // Change a UUID to a capitalized form, which could have been produced by an // older version of the browser, before canonicalization was enforced. base::Value* child_value = nullptr; GetBookmarksBarChildValue(&value, 0, &child_value); @@ -735,7 +735,7 @@ ASSERT_TRUE(Decode(&decoder2, value, decoded_model2.get(), /*sync_metadata_str=*/nullptr)); - EXPECT_EQ(kGuid, decoded_model2->bookmark_bar_node()->children()[0]->guid()); + EXPECT_EQ(kGuid, decoded_model2->bookmark_bar_node()->children()[0]->uuid()); } } // namespace bookmarks
diff --git a/components/bookmarks/browser/bookmark_load_details.cc b/components/bookmarks/browser/bookmark_load_details.cc index a557577..44bceedb 100644 --- a/components/bookmarks/browser/bookmark_load_details.cc +++ b/components/bookmarks/browser/bookmark_load_details.cc
@@ -19,7 +19,7 @@ // thread, and |client_| is not thread safe, and/or may be destroyed before // this. root_node_ = std::make_unique<BookmarkNode>( - /*id=*/0, base::Uuid::ParseLowercase(BookmarkNode::kRootNodeGuid), + /*id=*/0, base::Uuid::ParseLowercase(BookmarkNode::kRootNodeUuid), GURL()); root_node_ptr_ = root_node_.get(); // WARNING: order is important here, various places assume the order is
diff --git a/components/bookmarks/browser/bookmark_load_details.h b/components/bookmarks/browser/bookmark_load_details.h index b6d5fc62..eed55313 100644 --- a/components/bookmarks/browser/bookmark_load_details.h +++ b/components/bookmarks/browser/bookmark_load_details.h
@@ -88,9 +88,9 @@ void set_ids_reassigned(bool value) { ids_reassigned_ = value; } bool ids_reassigned() const { return ids_reassigned_; } - // Whether new GUIDs were assigned to Bookmarks that lacked them. - void set_guids_reassigned(bool value) { guids_reassigned_ = value; } - bool guids_reassigned() const { return guids_reassigned_; } + // Whether new UUIDs were assigned to Bookmarks that lacked them. + void set_uuids_reassigned(bool value) { uuids_reassigned_ = value; } + bool uuids_reassigned() const { return uuids_reassigned_; } // Returns the string blob representing the sync metadata in the json file. // The string blob is set during decode time upon the call to Bookmark::Load. @@ -120,7 +120,7 @@ std::string computed_checksum_; std::string stored_checksum_; bool ids_reassigned_ = false; - bool guids_reassigned_ = false; + bool uuids_reassigned_ = false; scoped_refptr<UrlIndex> url_index_; // A string blob represetning the sync metadata stored in the json file. std::string sync_metadata_str_;
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index 290581f..98fa518 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -132,7 +132,7 @@ : client_(std::move(client)), owned_root_(std::make_unique<BookmarkNode>( /*id=*/0, - base::Uuid::ParseLowercase(BookmarkNode::kRootNodeGuid), + base::Uuid::ParseLowercase(BookmarkNode::kRootNodeUuid), GURL())), root_(owned_root_.get()), observers_(base::ObserverListPolicy::EXISTING_ONLY), @@ -750,20 +750,20 @@ const std::u16string& title, const BookmarkNode::MetaInfoMap* meta_info, absl::optional<base::Time> creation_time, - absl::optional<base::Uuid> guid) { + absl::optional<base::Uuid> uuid) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(loaded_); DCHECK(parent); DCHECK(parent->is_folder()); DCHECK(!is_root_node(parent)); DCHECK(IsValidIndex(parent, index, true)); - DCHECK(!guid || guid->is_valid()); + DCHECK(!uuid || uuid->is_valid()); const base::Time provided_creation_time_or_now = creation_time.value_or(Time::Now()); auto new_node = std::make_unique<BookmarkNode>( - generate_next_node_id(), guid.value_or(base::Uuid::GenerateRandomV4()), + generate_next_node_id(), uuid.value_or(base::Uuid::GenerateRandomV4()), GURL()); new_node->set_date_added(provided_creation_time_or_now); new_node->set_date_folder_modified(provided_creation_time_or_now); @@ -794,7 +794,7 @@ const GURL& url, const BookmarkNode::MetaInfoMap* meta_info, absl::optional<base::Time> creation_time, - absl::optional<base::Uuid> guid, + absl::optional<base::Uuid> uuid, bool added_by_user) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(loaded_); @@ -803,7 +803,7 @@ DCHECK(parent->is_folder()); DCHECK(!is_root_node(parent)); DCHECK(IsValidIndex(parent, index, true)); - DCHECK(!guid || guid->is_valid()); + DCHECK(!uuid || uuid->is_valid()); const base::Time provided_creation_time_or_now = creation_time.value_or(Time::Now()); @@ -814,7 +814,7 @@ } auto new_node = std::make_unique<BookmarkNode>( - generate_next_node_id(), guid.value_or(base::Uuid::GenerateRandomV4()), + generate_next_node_id(), uuid.value_or(base::Uuid::GenerateRandomV4()), url); new_node->SetTitle(title); new_node->set_date_added(provided_creation_time_or_now); @@ -984,11 +984,11 @@ next_node_id_ = details->max_id(); if (details->computed_checksum() != details->stored_checksum() || - details->ids_reassigned() || details->guids_reassigned()) { + details->ids_reassigned() || details->uuids_reassigned()) { // If bookmarks file changed externally, the IDs may have changed // externally. In that case, the decoder may have reassigned IDs to make // them unique. So when the file has changed externally, we should save the - // bookmarks file to persist such changes. The same applies if new GUIDs + // bookmarks file to persist such changes. The same applies if new UUIDs // have been assigned to bookmarks. if (store_) { store_->ScheduleSave(); @@ -1055,7 +1055,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // TODO(crbug.com/1143246): add a DCHECK to validate that all nodes have - // unique GUID when it is guaranteed. + // unique UUID when it is guaranteed. if (node->is_url()) { titled_url_index_->Add(node);
diff --git a/components/bookmarks/browser/bookmark_model.h b/components/bookmarks/browser/bookmark_model.h index 265a662..389f8773 100644 --- a/components/bookmarks/browser/bookmark_model.h +++ b/components/bookmarks/browser/bookmark_model.h
@@ -221,8 +221,8 @@ void GetBookmarks(std::vector<UrlAndTitle>* urls); // Adds a new folder node at the specified position with the given - // |creation_time|, |guid| and |meta_info|. If no GUID is provided (i.e. - // nullopt), then a random one will be generated. If a GUID is provided, it + // |creation_time|, |uuid| and |meta_info|. If no UUID is provided (i.e. + // nullopt), then a random one will be generated. If a UUID is provided, it // must be valid. const BookmarkNode* AddFolder( const BookmarkNode* parent, @@ -230,7 +230,7 @@ const std::u16string& title, const BookmarkNode::MetaInfoMap* meta_info = nullptr, absl::optional<base::Time> creation_time = absl::nullopt, - absl::optional<base::Uuid> guid = absl::nullopt); + absl::optional<base::Uuid> uuid = absl::nullopt); // Adds a new bookmark for the given `url` at the specified position with the // given `meta_info`. Used for bookmarks being added through some direct user @@ -243,8 +243,8 @@ const BookmarkNode::MetaInfoMap* meta_info = nullptr); // Adds a url at the specified position with the given `creation_time`, - // `meta_info`, `guid`, and `last_used_time`. If no GUID is provided - // (i.e. nullopt), then a random one will be generated. If a GUID is + // `meta_info`, `uuid`, and `last_used_time`. If no UUID is provided + // (i.e. nullopt), then a random one will be generated. If a UUID is // provided, it must be valid. Used for bookmarks not being added from // direct user actions (e.g. created via sync, locally modified bookmark // or pre-existing bookmark). `added_by_user` is true when a new bookmark was @@ -256,7 +256,7 @@ const GURL& url, const BookmarkNode::MetaInfoMap* meta_info = nullptr, absl::optional<base::Time> creation_time = absl::nullopt, - absl::optional<base::Uuid> guid = absl::nullopt, + absl::optional<base::Uuid> uuid = absl::nullopt, bool added_by_user = false); // Sorts the children of |parent|, notifying observers by way of the
diff --git a/components/bookmarks/browser/bookmark_model_unittest.cc b/components/bookmarks/browser/bookmark_model_unittest.cc index 140a58a..e785f9f 100644 --- a/components/bookmarks/browser/bookmark_model_unittest.cc +++ b/components/bookmarks/browser/bookmark_model_unittest.cc
@@ -567,7 +567,7 @@ ASSERT_EQ(1u, root->children().size()); ASSERT_EQ(title, new_node->GetTitle()); ASSERT_TRUE(url == new_node->url()); - ASSERT_TRUE(new_node->guid().is_valid()); + ASSERT_TRUE(new_node->uuid().is_valid()); ASSERT_EQ(BookmarkNode::URL, new_node->type()); ASSERT_EQ(new_node, model_->GetMostRecentlyAddedUserNodeForURL(url)); @@ -590,7 +590,7 @@ ASSERT_EQ(1u, root->children().size()); ASSERT_EQ(title, new_node->GetTitle()); ASSERT_TRUE(url == new_node->url()); - ASSERT_TRUE(new_node->guid().is_valid()); + ASSERT_TRUE(new_node->uuid().is_valid()); ASSERT_EQ(BookmarkNode::URL, new_node->type()); ASSERT_TRUE(new_node == model_->GetMostRecentlyAddedUserNodeForURL(url)); @@ -654,7 +654,7 @@ ASSERT_EQ(1u, root->children().size()); ASSERT_EQ(title, new_node->GetTitle()); ASSERT_TRUE(url == new_node->url()); - ASSERT_TRUE(new_node->guid().is_valid()); + ASSERT_TRUE(new_node->uuid().is_valid()); ASSERT_EQ(BookmarkNode::URL, new_node->type()); ASSERT_EQ(time, new_node->date_added()); ASSERT_TRUE(new_node->GetMetaInfoMap()); @@ -677,7 +677,7 @@ const BookmarkNode* new_node = model_->AddURL(root, /*index=*/0, title, url, &meta_info, time, guid); - EXPECT_EQ(guid, new_node->guid()); + EXPECT_EQ(guid, new_node->uuid()); } TEST_F(BookmarkModelTest, AddURLToMobileBookmarks) { @@ -712,7 +712,7 @@ ASSERT_EQ(1u, root->children().size()); ASSERT_EQ(title, new_node->GetTitle()); - ASSERT_TRUE(new_node->guid().is_valid()); + ASSERT_TRUE(new_node->uuid().is_valid()); ASSERT_EQ(BookmarkNode::FOLDER, new_node->type()); EXPECT_TRUE(new_node->id() != root->id() && @@ -749,7 +749,7 @@ model_->AddFolder(root, /*index=*/0, title, &meta_info, /*creation_time=*/Time::Now(), guid); - EXPECT_EQ(guid, new_node->guid()); + EXPECT_EQ(guid, new_node->uuid()); } TEST_F(BookmarkModelTest, AddFolderWithWhitespaceTitle) {
diff --git a/components/bookmarks/browser/bookmark_node.cc b/components/bookmarks/browser/bookmark_node.cc index 37eecb21..6da992e 100644 --- a/components/bookmarks/browser/bookmark_node.cc +++ b/components/bookmarks/browser/bookmark_node.cc
@@ -32,8 +32,8 @@ // BookmarkNode --------------------------------------------------------------- -// Below predefined GUIDs for permanent bookmark folders, determined via named -// GUIDs/UUIDs. Do NOT modify them as they may be exposed via Sync. For +// Below predefined UUIDs for permanent bookmark folders, determined via named +// UUIDs/UUIDs. Do NOT modify them as they may be exposed via Sync. For // reference, here's the python script to produce them: // > import uuid // > chromium_namespace = uuid.uuid5(uuid.NAMESPACE_DNS, "chromium.org") @@ -45,32 +45,32 @@ // > managed_bookmarks = uuid.uuid5(bookmarks_namespace, "managed_bookmarks") // static -const char BookmarkNode::kRootNodeGuid[] = +const char BookmarkNode::kRootNodeUuid[] = "2509a7dc-215d-52f7-a429-8d80431c6c75"; // static -const char BookmarkNode::kBookmarkBarNodeGuid[] = +const char BookmarkNode::kBookmarkBarNodeUuid[] = "0bc5d13f-2cba-5d74-951f-3f233fe6c908"; // static -const char BookmarkNode::kOtherBookmarksNodeGuid[] = +const char BookmarkNode::kOtherBookmarksNodeUuid[] = "82b081ec-3dd3-529c-8475-ab6c344590dd"; // static -const char BookmarkNode::kMobileBookmarksNodeGuid[] = +const char BookmarkNode::kMobileBookmarksNodeUuid[] = "4cf2e351-0e85-532b-bb37-df045d8f8d0f"; // static -const char BookmarkNode::kManagedNodeGuid[] = +const char BookmarkNode::kManagedNodeUuid[] = "323123f4-9381-5aee-80e6-ea5fca2f7672"; // This value is the result of exercising sync's function // syncer::InferGuidForLegacyBookmark() with an empty input. -const char BookmarkNode::kBannedGuidDueToPastSyncBug[] = +const char BookmarkNode::kBannedUuidDueToPastSyncBug[] = "da39a3ee-5e6b-fb0d-b255-bfef95601890"; -BookmarkNode::BookmarkNode(int64_t id, const base::Uuid& guid, const GURL& url) - : BookmarkNode(id, guid, url, url.is_empty() ? FOLDER : URL, false) {} +BookmarkNode::BookmarkNode(int64_t id, const base::Uuid& uuid, const GURL& url) + : BookmarkNode(id, uuid, url, url.is_empty() ? FOLDER : URL, false) {} BookmarkNode::~BookmarkNode() = default; @@ -203,19 +203,19 @@ } BookmarkNode::BookmarkNode(int64_t id, - const base::Uuid& guid, + const base::Uuid& uuid, const GURL& url, Type type, bool is_permanent_node) : id_(id), - guid_(guid), + uuid_(uuid), url_(url), type_(type), date_added_(base::Time::Now()), is_permanent_node_(is_permanent_node) { DCHECK_NE(type == URL, url.is_empty()); - DCHECK(guid.is_valid()); - DCHECK_NE(guid.AsLowercaseString(), std::string(kBannedGuidDueToPastSyncBug)); + DCHECK(uuid.is_valid()); + DCHECK_NE(uuid.AsLowercaseString(), std::string(kBannedUuidDueToPastSyncBug)); } void BookmarkNode::InvalidateFavicon() { @@ -231,7 +231,7 @@ BookmarkPermanentNode::CreateManagedBookmarks(int64_t id) { // base::WrapUnique() used because the constructor is private. return base::WrapUnique(new BookmarkPermanentNode( - id, FOLDER, base::Uuid::ParseLowercase(kManagedNodeGuid), + id, FOLDER, base::Uuid::ParseLowercase(kManagedNodeUuid), std::u16string(), /*visible_when_empty=*/false)); } @@ -248,7 +248,7 @@ bool visible_when_empty) { // base::WrapUnique() used because the constructor is private. return base::WrapUnique(new BookmarkPermanentNode( - id, BOOKMARK_BAR, base::Uuid::ParseLowercase(kBookmarkBarNodeGuid), + id, BOOKMARK_BAR, base::Uuid::ParseLowercase(kBookmarkBarNodeUuid), l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_FOLDER_NAME), visible_when_empty)); } @@ -259,7 +259,7 @@ bool visible_when_empty) { // base::WrapUnique() used because the constructor is private. return base::WrapUnique(new BookmarkPermanentNode( - id, OTHER_NODE, base::Uuid::ParseLowercase(kOtherBookmarksNodeGuid), + id, OTHER_NODE, base::Uuid::ParseLowercase(kOtherBookmarksNodeUuid), l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_OTHER_FOLDER_NAME), visible_when_empty)); } @@ -270,17 +270,17 @@ bool visible_when_empty) { // base::WrapUnique() used because the constructor is private. return base::WrapUnique(new BookmarkPermanentNode( - id, MOBILE, base::Uuid::ParseLowercase(kMobileBookmarksNodeGuid), + id, MOBILE, base::Uuid::ParseLowercase(kMobileBookmarksNodeUuid), l10n_util::GetStringUTF16(IDS_BOOKMARK_BAR_MOBILE_FOLDER_NAME), visible_when_empty)); } BookmarkPermanentNode::BookmarkPermanentNode(int64_t id, Type type, - const base::Uuid& guid, + const base::Uuid& uuid, const std::u16string& title, bool visible_when_empty) - : BookmarkNode(id, guid, GURL(), type, /*is_permanent_node=*/true), + : BookmarkNode(id, uuid, GURL(), type, /*is_permanent_node=*/true), visible_when_empty_(visible_when_empty) { DCHECK(type != URL); SetTitle(title);
diff --git a/components/bookmarks/browser/bookmark_node.h b/components/bookmarks/browser/bookmark_node.h index 5b2a3ac..13e7d3d 100644 --- a/components/bookmarks/browser/bookmark_node.h +++ b/components/bookmarks/browser/bookmark_node.h
@@ -48,17 +48,17 @@ // TODO(crbug.com/1026195): Make these constants of type base::Uuid once there // exists a constexpr constructor. - static const char kRootNodeGuid[]; - static const char kBookmarkBarNodeGuid[]; - static const char kOtherBookmarksNodeGuid[]; - static const char kMobileBookmarksNodeGuid[]; - static const char kManagedNodeGuid[]; + static const char kRootNodeUuid[]; + static const char kBookmarkBarNodeUuid[]; + static const char kOtherBookmarksNodeUuid[]; + static const char kMobileBookmarksNodeUuid[]; + static const char kManagedNodeUuid[]; - // A bug in sync caused some problematic GUIDs to be produced. - static const char kBannedGuidDueToPastSyncBug[]; + // A bug in sync caused some problematic UUIDs to be produced. + static const char kBannedUuidDueToPastSyncBug[]; - // Creates a new node with |id|, |guid| and |url|. - BookmarkNode(int64_t id, const base::Uuid& guid, const GURL& url); + // Creates a new node with |id|, |uuid| and |url|. + BookmarkNode(int64_t id, const base::Uuid& uuid, const GURL& url); BookmarkNode(const BookmarkNode&) = delete; BookmarkNode& operator=(const BookmarkNode&) = delete; @@ -80,11 +80,11 @@ int64_t id() const { return id_; } void set_id(int64_t id) { id_ = id; } - // Returns this node's GUID, which is guaranteed to be valid. - // For bookmark nodes that are managed by the bookmark model, the GUIDs are + // Returns this node's UUID, which is guaranteed to be valid. + // For bookmark nodes that are managed by the bookmark model, the UUIDs are // persisted across sessions and stable throughout the lifetime of the // bookmark. - const base::Uuid& guid() const { return guid_; } + const base::Uuid& uuid() const { return uuid_; } const GURL& url() const { return url_; } void set_url(const GURL& url) { url_ = url; } @@ -158,7 +158,7 @@ protected: BookmarkNode(int64_t id, - const base::Uuid& guid, + const base::Uuid& uuid, const GURL& url, Type type, bool is_permanent_node); @@ -193,12 +193,12 @@ // The unique identifier for this node. int64_t id_; - // The GUID for this node. A BookmarkNode GUID is immutable and differs from + // The UUID for this node. A BookmarkNode UUID is immutable and differs from // the |id_| in that it is consistent across different clients and // stable throughout the lifetime of the bookmark, with the exception of nodes - // added to the Managed Bookmarks folder, whose GUIDs are re-assigned at + // added to the Managed Bookmarks folder, whose UUIDs are re-assigned at // start-up every time. - const base::Uuid guid_; + const base::Uuid uuid_; // The URL of this node. BookmarkModel maintains maps off this URL, so changes // to the URL must be done through the BookmarkModel. @@ -275,7 +275,7 @@ // other than the well-known ones, see factory methods. BookmarkPermanentNode(int64_t id, Type type, - const base::Uuid& guid, + const base::Uuid& uuid, const std::u16string& title, bool visible_when_empty);
diff --git a/components/bookmarks/browser/bookmark_test_util.cc b/components/bookmarks/browser/bookmark_test_util.cc index 5eb11af..a6f7bf51 100644 --- a/components/bookmarks/browser/bookmark_test_util.cc +++ b/components/bookmarks/browser/bookmark_test_util.cc
@@ -23,15 +23,15 @@ switch (node.type()) { case BookmarkNode::URL: *os << "bookmark URL " << node.url() << " title \"" << node.GetTitle() - << "\" GUID " << node.guid() << " icon "; + << "\" UUID " << node.uuid() << " icon "; if (node.icon_url()) *os << *node.icon_url(); else *os << "null"; break; case BookmarkNode::FOLDER: - *os << "bookmark folder with title \"" << node.GetTitle() << "\" GUID " - << node.guid(); + *os << "bookmark folder with title \"" << node.GetTitle() << "\" UUID " + << node.uuid(); break; case BookmarkNode::BOOKMARK_BAR: *os << "BOOKMARK_BAR folder";
diff --git a/components/bookmarks/browser/bookmark_utils.cc b/components/bookmarks/browser/bookmark_utils.cc index 95c0ebec..a31b6df 100644 --- a/components/bookmarks/browser/bookmark_utils.cc +++ b/components/bookmarks/browser/bookmark_utils.cc
@@ -565,10 +565,10 @@ [id](const BookmarkNode* node) { return node->id() == id; }); } -const BookmarkNode* GetBookmarkNodeByGUID(const BookmarkModel* model, - const base::Uuid& guid) { - return FindNode(model->root_node(), [&guid](const BookmarkNode* node) { - return node->guid() == guid; +const BookmarkNode* GetBookmarkNodeByUuid(const BookmarkModel* model, + const base::Uuid& uuid) { + return FindNode(model->root_node(), [&uuid](const BookmarkNode* node) { + return node->uuid() == uuid; }); }
diff --git a/components/bookmarks/browser/bookmark_utils.h b/components/bookmarks/browser/bookmark_utils.h index bd88263..a1a33cb1 100644 --- a/components/bookmarks/browser/bookmark_utils.h +++ b/components/bookmarks/browser/bookmark_utils.h
@@ -183,9 +183,9 @@ // Returns the node with |id|, or NULL if there is no node with |id|. const BookmarkNode* GetBookmarkNodeByID(const BookmarkModel* model, int64_t id); -// Returns the node with |guid|, or NULL if there is no node with |guid|. -const BookmarkNode* GetBookmarkNodeByGUID(const BookmarkModel* model, - const base::Uuid& guid); +// Returns the node with |uuid|, or NULL if there is no node with |uuid|. +const BookmarkNode* GetBookmarkNodeByUuid(const BookmarkModel* model, + const base::Uuid& uuid); // Returns true if |node| is a descendant of |root|. bool IsDescendantOf(const BookmarkNode* node, const BookmarkNode* root);
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index a79624a..7b19a661 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -67,7 +67,7 @@ details->set_computed_checksum(codec.computed_checksum()); details->set_stored_checksum(codec.stored_checksum()); details->set_ids_reassigned(codec.ids_reassigned()); - details->set_guids_reassigned(codec.guids_reassigned()); + details->set_uuids_reassigned(codec.uuids_reassigned()); details->set_model_meta_info_map(codec.model_meta_info_map()); details->set_model_unsynced_meta_info_map( codec.model_unsynced_meta_info_map());
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 01286a24..fcfbce7 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Aflaai is voltooi <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Kenmerke op sommige werwe sal dalk nie in Incognitomodus werk nie</translation> <translation id="2442870161001914531">Versoek altyd rekenaarwerf</translation> +<translation id="2479148705183875116">Gaan na Instellings</translation> <translation id="2482878487686419369">Kennisgewings</translation> <translation id="2485422356828889247">Deïnstalleer</translation> <translation id="2490684707762498678">Bestuur deur <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index 1cea70ac..6a2f8fcca 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ማውረድ ተጠናቅቋል <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">በአንዳንድ ጣቢያዎች ላይ ያሉ ባህሪያት ማንነትን በማያሳውቅ ሁነታ ውስጥ ላይሰሩ ይችላሉ</translation> <translation id="2442870161001914531">ሁልጊዜ የዴስክቶፕ ጣቢያን ጠይቅ</translation> +<translation id="2479148705183875116">ወደ ቅንብሮች ሂድ</translation> <translation id="2482878487686419369">ማስታወቂያዎች</translation> <translation id="2485422356828889247">አራግፍ</translation> <translation id="2490684707762498678">በ<ph name="APP_NAME" /> የሚተዳደር ነው</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 53e6e7c2..bba6763 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">اكتمل التنزيل <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">قد لا تعمل ميزات بعض المواقع الإلكترونية في وضع التصفُّح المتخفي.</translation> <translation id="2442870161001914531">دائمًا طلب الموقع الإلكتروني المتوافق مع أجهزة الكمبيوتر</translation> +<translation id="2479148705183875116">الانتقال إلى الإعدادات</translation> <translation id="2482878487686419369">الإشعارات</translation> <translation id="2485422356828889247">إزالة التثبيت</translation> <translation id="2490684707762498678">تتم إدارتها من خلال <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index 27c0396..dd1194f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ডাউনল’ড সম্পূর্ণ হৈছে <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ইনক’গনিট’ ম’ডত কিছুমান ছাইটৰ সুবিধাসমূহে কাম নকৰিবও পাৰে</translation> <translation id="2442870161001914531">সদায়েই ডেস্কটপ ছাইট অনুৰোধ কৰিব</translation> +<translation id="2479148705183875116">ছেটিংসমূহলৈ যাওক</translation> <translation id="2482878487686419369">জাননী</translation> <translation id="2485422356828889247">আনইনষ্টল কৰক</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />এ পৰিচালনা কৰে</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 8041a0c..a83a2cb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Endirmə tamamlandı <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Bəzi saytlardakı funksiyalar Anonim rejimdə işləməyə bilər</translation> <translation id="2442870161001914531">Həmişə masaüstü saytını tələb edin</translation> +<translation id="2479148705183875116">Ayarlara keçin</translation> <translation id="2482878487686419369">Bildirişlər</translation> <translation id="2485422356828889247">Sistemdən silin</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tərəfindən idarə edilir</translation>
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 4b04df1a..03938f3 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Спампоўванне завершана <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">На некаторых сайтах у рэжыме інкогніта можа не працаваць частка функцый</translation> <translation id="2442870161001914531">Заўсёды запытваць версію сайта для настольнага камп'ютара</translation> +<translation id="2479148705183875116">Перайсці ў Налады</translation> <translation id="2482878487686419369">Апавяшчэнні</translation> <translation id="2485422356828889247">Выдаліць</translation> <translation id="2490684707762498678">Пад кіраваннем праграмы "<ph name="APP_NAME" />"</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 33ac5b0..1d3493c9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Изтеглянето завърши <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Функциите в някои сайтове може да не работят в режим „инкогнито“</translation> <translation id="2442870161001914531">Винаги да се заявява настолният сайт</translation> +<translation id="2479148705183875116">Към настройките</translation> <translation id="2482878487686419369">Известия</translation> <translation id="2485422356828889247">Деинсталиране</translation> <translation id="2490684707762498678">Управляват се от <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb index faaf11a..bc8abd5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628"><ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /> ডাউনলোড সম্পূর্ণ হয়েছে</translation> <translation id="244264527810019436">কিছু সাইটের ফিচার ছদ্মবেশী মোডে কাজ নাও করতে পারে</translation> <translation id="2442870161001914531">সবসময়ের ডেস্কটপ সাইটের অনুরোধ করুন</translation> +<translation id="2479148705183875116">সেটিংসে যান</translation> <translation id="2482878487686419369">বিজ্ঞপ্তিগুলি</translation> <translation id="2485422356828889247">আনইনস্টল</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ম্যানেজ করে</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb index b1122f66..3419d7f1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Preuzimanje je završeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funkcije na nekim web lokacijama možda neće funkcionirati u anonimnom načinu rada</translation> <translation id="2442870161001914531">Uvijek zatraži verziju web lokacije za računar</translation> +<translation id="2479148705183875116">Idi u postavke</translation> <translation id="2482878487686419369">Obavještenja</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2490684707762498678">Upravlja aplikacija <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index 13e2e8b1..73c6af9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">S'ha completat la baixada <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">És possible que les funcions d'alguns llocs web no funcionin en mode d'incògnit</translation> <translation id="2442870161001914531">Sol·licita sempre el lloc web per a ordinadors</translation> +<translation id="2479148705183875116">Ves a Configuració</translation> <translation id="2482878487686419369">Notificacions</translation> <translation id="2485422356828889247">Desinstal·la</translation> <translation id="2490684707762498678">Gestionades per <ph name="APP_NAME" /></translation>
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 a3babec..049ee76 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Stažení bylo dokončeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Některé weby nemusejí v anonymním režimu fungovat správně</translation> <translation id="2442870161001914531">Vždy požadovat zobrazení na počítači</translation> +<translation id="2479148705183875116">Přejít do nastavení</translation> <translation id="2482878487686419369">Oznámení</translation> <translation id="2485422356828889247">Odinstalovat</translation> <translation id="2490684707762498678">Spravováno aplikací <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb index 90ef3f2..2352128 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Mae'r lawrlwythiad wedi'i gwblhau <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Mae'n bosib na fydd nodweddion ar rai gwefannau yn gweithio yn y modd anhysbys</translation> <translation id="2442870161001914531">Gofyn am wefan bwrdd gwaith bob amser</translation> +<translation id="2479148705183875116">Mynd i'r Gosodiadau</translation> <translation id="2482878487686419369">Hysbysiadau</translation> <translation id="2485422356828889247">Dadosod</translation> <translation id="2490684707762498678">Rheolir gan <ph name="APP_NAME" /></translation>
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 f1c316a0..27634124 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Downloaden er fuldført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funktioner på visse websites fungerer muligvis ikke i inkognitotilstand</translation> <translation id="2442870161001914531">Anmod altid om computerversion</translation> +<translation id="2479148705183875116">Gå til Indstillinger</translation> <translation id="2482878487686419369">Notifikationer</translation> <translation id="2485422356828889247">Afinstaller</translation> <translation id="2490684707762498678">Administreret af <ph name="APP_NAME" /></translation>
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 9f17a38e..be77acd 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download abgeschlossen <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Einige Websites funktionieren im Inkognitomodus möglicherweise nicht richtig</translation> <translation id="2442870161001914531">Desktopwebsite immer anfordern</translation> +<translation id="2479148705183875116">Zu den Einstellungen</translation> <translation id="2482878487686419369">Benachrichtigungen</translation> <translation id="2485422356828889247">Deinstallieren</translation> <translation id="2490684707762498678">Über <ph name="APP_NAME" /> verwaltet</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index 0ad8edb..20ff60c9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Η λήψη ολοκληρώθηκε <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Οι λειτουργίες σε ορισμένους ιστοτόπους ενδέχεται να μην λειτουργούν σε Κατάσταση ανώνυμης περιήγησης</translation> <translation id="2442870161001914531">Να ζητείται πάντα ιστότοπος για υπολογιστές</translation> +<translation id="2479148705183875116">Μετάβαση στις Ρυθμίσεις</translation> <translation id="2482878487686419369">Ειδοποιήσεις</translation> <translation id="2485422356828889247">Απεγκατάσταση</translation> <translation id="2490684707762498678">Διαχειριζόμενες από την εφαρμογή <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index c2fcb72c..aef17da 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download complete <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Features on some sites may not work in Incognito mode</translation> <translation id="2442870161001914531">Always request desktop site</translation> +<translation id="2479148705183875116">Go to Settings</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2485422356828889247">Uninstall</translation> <translation id="2490684707762498678">Managed by <ph name="APP_NAME" /></translation>
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 1c79fd9..94aaad41f 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Se completó la descarga <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Es posible que las funciones de algunos sitios no funcionen en el modo Incógnito</translation> <translation id="2442870161001914531">Solicitar siempre el sitio para computadoras</translation> +<translation id="2479148705183875116">Ir a Configuración</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2485422356828889247">Desinstalación</translation> <translation id="2490684707762498678">Administradas por <ph name="APP_NAME" /></translation>
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 0d29ebb..b531cf0 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Descarga finalizada <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Es posible que las funciones de algunos sitios no funcionen en modo Incógnito</translation> <translation id="2442870161001914531">Solicitar siempre la vista para ordenador</translation> +<translation id="2479148705183875116">Ve a Ajustes</translation> <translation id="2482878487686419369">Notificaciones</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2490684707762498678">Gestionadas por <ph name="APP_NAME" /></translation>
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 39d1418..c7eb9f7f 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Allalaadimine jõudis lõpule: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Mõne saidi funktsioonid ei pruugi inkognito režiimis toimida</translation> <translation id="2442870161001914531">Alati taotletakse arvutisaiti</translation> +<translation id="2479148705183875116">Ava seaded</translation> <translation id="2482878487686419369">Märguanded</translation> <translation id="2485422356828889247">Desinstalli</translation> <translation id="2490684707762498678">Haldab <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index a7facdc4..71418ec 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Deskargatu da <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Baliteke ezkutuko modua aktibatuta dagoenean webgune batzuetako eginbideek ez funtzionatzea</translation> <translation id="2442870161001914531">Eskatu beti ordenagailuetarako webgunea</translation> +<translation id="2479148705183875116">Joan "Ezarpenak" atalera</translation> <translation id="2482878487686419369">Jakinarazpenak</translation> <translation id="2485422356828889247">Desinstalatu</translation> <translation id="2490684707762498678">Kudeatzailea: <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb index db49d7c..3ae53a4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">بارگیری کامل شد <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ممکن است ویژگیهای برخیاز سایتها در «حالت ناشناس» کار نکند</translation> <translation id="2442870161001914531">همیشه سایت ویژه رایانه درخواست شود</translation> +<translation id="2479148705183875116">رفتن به تنظیمات</translation> <translation id="2482878487686419369">اعلانها</translation> <translation id="2485422356828889247">حذف نصب</translation> <translation id="2490684707762498678">تحت مدیریت <ph name="APP_NAME" /></translation>
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 b3c39de..6ccbad2 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Lataus valmis <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Joidenkin sivustojen ominaisuudet eivät välttämättä toimi incognito-tilassa</translation> <translation id="2442870161001914531">Pyydä aina tietokonesivustoa</translation> +<translation id="2479148705183875116">Avaa Asetukset</translation> <translation id="2482878487686419369">Ilmoitukset</translation> <translation id="2485422356828889247">Poista</translation> <translation id="2490684707762498678">Ylläpitäjä: <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb index 5a81308..5b81ade5 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Tapos nang mag-download <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Posibleng hindi gumana sa Incognito mode ang mga feature sa ilang site</translation> <translation id="2442870161001914531">Palaging hilingin ang pang-desktop na site</translation> +<translation id="2479148705183875116">Pumunta sa Mga Setting</translation> <translation id="2482878487686419369">Mga Abiso</translation> <translation id="2485422356828889247">I-uninstall</translation> <translation id="2490684707762498678">Pinapamahalaan ng <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index a81d92e8..a9726175 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Téléchargement terminé <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Les fonctionnalités de certains sites peuvent ne pas fonctionner en mode de navigation privée</translation> <translation id="2442870161001914531">Toujours demander le site pour ordinateurs de bureau</translation> +<translation id="2479148705183875116">Accéder aux paramètres</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2485422356828889247">Désinstaller</translation> <translation id="2490684707762498678">Les notifications sont gérées par <ph name="APP_NAME" /></translation>
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 e59ef5c..036ad75d 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Téléchargement terminé <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Il est possible que les fonctionnalités de certains sites ne soient pas opérationnelles en mode navigation privée</translation> <translation id="2442870161001914531">Toujours demander la version pour ordinateur</translation> +<translation id="2479148705183875116">Accéder aux paramètres</translation> <translation id="2482878487686419369">Notifications</translation> <translation id="2485422356828889247">Désinstaller</translation> <translation id="2490684707762498678">Géré par <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb index d195324..bcc7f11 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Completouse a descarga <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">É posible que as funcións dalgúns sitios non estean dispoñibles no modo de incógnito</translation> <translation id="2442870161001914531">Solicitar sempre o sitio para ordenadores</translation> +<translation id="2479148705183875116">Ir a Configuración</translation> <translation id="2482878487686419369">Notificacións</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2490684707762498678">Xestionadas por <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index d47ee75..745b74c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ડાઉનલોડ પૂર્ણ <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">છૂપા મોડમાં અમુક સાઇટ પર અમુક સુવિધાઓ કદાચ કામ કરી શકશે નહીં</translation> <translation id="2442870161001914531">હંમેશાં ડેસ્કટૉપ સાઇટની વિનંતી કરો</translation> +<translation id="2479148705183875116">સેટિંગ પર જાઓ</translation> <translation id="2482878487686419369">નોટિફિકેશનો</translation> <translation id="2485422356828889247">અનઇન્સ્ટૉલ કરો</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> દ્વારા મેનેજ થયેલ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index b056789..a494b68 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">डाउनलोड हो गया <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ऐसा मुमकिन है कि ये सुविधाएं गुप्त मोड में कुछ साइटों पर काम न करें</translation> <translation id="2442870161001914531">हमेशा साइट के डेस्कटॉप व्यू का अनुरोध करें</translation> +<translation id="2479148705183875116">सेटिंग पर जाएं</translation> <translation id="2482878487686419369">सूचनाएं</translation> <translation id="2485422356828889247">विस्थापित करें</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> मैनेज करता है</translation>
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 2513ddce..851213097 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Preuzimanje je dovršeno: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Značajke na nekim web-lokacijama možda neće funkcionirati u anonimnom načinu rada</translation> <translation id="2442870161001914531">Uvijek zahtijevaj web-lokaciju za računalo</translation> +<translation id="2479148705183875116">Otvori Postavke</translation> <translation id="2482878487686419369">Obavijesti</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2490684707762498678">Upravlja: <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index 5dbb2b52..1a77ffd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Letöltés befejezve <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Előfordulhat, hogy bizonyos webhelyek funkciói nem működnek inkognitó módban</translation> <translation id="2442870161001914531">Mindig az asztali webhely kérése</translation> +<translation id="2479148705183875116">Beállítások</translation> <translation id="2482878487686419369">Értesítések</translation> <translation id="2485422356828889247">Eltávolítás</translation> <translation id="2490684707762498678">Kezelő: <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb index e5b03c2..6fcf06e0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Ներբեռնումն ավարտված է՝ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Ինկոգնիտո ռեժիմում որոշ կայքերի գործառույթները կարող են չաշխատել</translation> <translation id="2442870161001914531">Միշտ պահանջել կայքի ամբողջական տարբերակը</translation> +<translation id="2479148705183875116">Անցնել կարգավորումներ</translation> <translation id="2482878487686419369">Ծանուցումներ</translation> <translation id="2485422356828889247">Ապատեղադրել</translation> <translation id="2490684707762498678">Կառավարվում է <ph name="APP_NAME" /> հավելվածի կողմից</translation>
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 267e7fd..93dda36 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download selesai <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Fitur di beberapa situs mungkin tidak berfungsi dalam mode Samaran</translation> <translation id="2442870161001914531">Selalu minta situs desktop</translation> +<translation id="2479148705183875116">Buka Setelan</translation> <translation id="2482878487686419369">Notifikasi</translation> <translation id="2485422356828889247">Uninstal</translation> <translation id="2490684707762498678">Dikelola oleh <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb index 5c9130f..db7842c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Niðurhali lokið <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Eiginleikar sumra vefsvæða virka e.t.v. ekki í huliðsstillingu</translation> <translation id="2442870161001914531">Biðja alltaf um tölvuútgáfu vefsvæða</translation> +<translation id="2479148705183875116">Opna stillingar</translation> <translation id="2482878487686419369">Tilkynningar</translation> <translation id="2485422356828889247">Fjarlægja</translation> <translation id="2490684707762498678">Stýrt af <ph name="APP_NAME" /></translation>
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 5ff0b80..d0b55ca 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download completato: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Le funzionalità su alcuni siti potrebbero non essere disponibili in modalità di navigazione in incognito</translation> <translation id="2442870161001914531">Richiedi sempre sito desktop</translation> +<translation id="2479148705183875116">Vai a Impostazioni</translation> <translation id="2482878487686419369">Notifiche</translation> <translation id="2485422356828889247">Disinstalla</translation> <translation id="2490684707762498678">Gestite da <ph name="APP_NAME" /></translation>
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 3135912f..49988c7 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ההורדה הושלמה <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">יכול להיות שתכונות באתרים מסוימים לא יפעלו במצב פרטי</translation> <translation id="2442870161001914531">תמיד תוצג בקשה לגרסת האתר למחשב</translation> +<translation id="2479148705183875116">למעבר אל ההגדרות</translation> <translation id="2482878487686419369">התראות</translation> <translation id="2485422356828889247">הסרת התקנה</translation> <translation id="2490684707762498678">מנוהלות על-ידי <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 2da8f75..6484025e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ダウンロードが完了しました<ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">シークレット モードでは、一部サイトの機能が使用できなくなる可能性があります</translation> <translation id="2442870161001914531">常に PC 版サイトを表示する</translation> +<translation id="2479148705183875116">設定に移動</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">アンインストール</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> で管理</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb index dff6319..ef44501 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ჩამოტვირთვა დასრულდა: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ფუნქციებმა, შესაძლოა, არ იმუშაოს ზოგიერთ საიტზე ინკოგნიტო რეჟიმში</translation> <translation id="2442870161001914531">საიტის დესკტოპის ვერსიის ყოველთვის მოთხოვნა</translation> +<translation id="2479148705183875116">პარამეტრებზე გადასვლა</translation> <translation id="2482878487686419369">შეტყობინებები</translation> <translation id="2485422356828889247">დეინსტალაცია</translation> <translation id="2490684707762498678">მართავს <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index 119b5a9..aa7c3e7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628"><ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /> жүктеп алынды</translation> <translation id="244264527810019436">Инкогнито режимінде кейбір сайттардағы функциялар істемеуі мүмкін.</translation> <translation id="2442870161001914531">Әрдайым сайттың компьютерлік нұсқасын сұрау</translation> +<translation id="2479148705183875116">Параметрлерге өту</translation> <translation id="2482878487686419369">Хабарландырулар</translation> <translation id="2485422356828889247">Жою</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> басқарады</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb index 6c31a6e..345ab6c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ការទាញយកបានបញ្ចប់ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">មុខងារនៅលើគេហទំព័រមួយចំនួនអាចមិនដំណើរការនៅក្នុងមុខងារឯកជនទេ</translation> <translation id="2442870161001914531">ស្នើគេហទំព័រសម្រាប់កុំព្យូទ័រជានិច្ច</translation> +<translation id="2479148705183875116">ចូលទៅកាន់ការកំណត់</translation> <translation id="2482878487686419369">ការជូនដំណឹង</translation> <translation id="2485422356828889247">លុប</translation> <translation id="2490684707762498678">ស្ថិតក្រោមការគ្រប់គ្រងរបស់ <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index 6d5d576..1fa0af5e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ಡೌನ್ಲೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸದಿರಬಹುದು</translation> <translation id="2442870161001914531">ಡೆಸ್ಕ್ಟಾಪ್ ಸೈಟ್ ಅನ್ನು ಯಾವಾಗಲೂ ವಿನಂತಿಸಿ</translation> +<translation id="2479148705183875116">ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ</translation> <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation> <translation id="2485422356828889247">ಅನ್ಇನ್ಸ್ಟಾಲ್</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ಆ್ಯಪ್ ನಿರ್ವಹಿಸುತ್ತಿದೆ</translation>
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 6e0036c..76268628 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">다운로드 완료: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">시크릿 모드에서는 일부 사이트의 기능이 작동하지 않을 수 있습니다.</translation> <translation id="2442870161001914531">항상 데스크톱 사이트 요청</translation> +<translation id="2479148705183875116">설정으로 이동</translation> <translation id="2482878487686419369">알림</translation> <translation id="2485422356828889247">제거</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />에서 관리함</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index 0d8610ce..e9f0f73e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Жүктөлүп алынды: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Айрым сайттардагы функциялар Жашыруун режимде иштебеши мүмкүн</translation> <translation id="2442870161001914531">Иш такта сайты ар дайым суралсын</translation> +<translation id="2479148705183875116">Жөндөөлөргө өтүү</translation> <translation id="2482878487686419369">Билдирмелер</translation> <translation id="2485422356828889247">Орнотуудан чыгаруу</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> тарабынан башкарылат</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index e37f1d3..fa94e433 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ການດາວໂຫຼດສຳເລັດແລ້ວ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ຄຸນສົມບັດຢູ່ບາງເວັບໄຊອາດບໍ່ເຮັດວຽກໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="2442870161001914531">ຮ້ອງຂໍເວັບໄຊເດັສທັອບທຸກເທື່ອ</translation> +<translation id="2479148705183875116">ໄປທີ່ການຕັ້ງຄ່າ</translation> <translation id="2482878487686419369">ການແຈ້ງເຕືອນ</translation> <translation id="2485422356828889247">ຖອນຕິດຕັ້ງ</translation> <translation id="2490684707762498678">ຈັດການໂດຍ <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index 7b9a82b..f53d3c0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Atsisiųsta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Kai kurių svetainių funkcijos gali neveikti inkognito režimu</translation> <translation id="2442870161001914531">Visada galite pateikti užklausą dėl svetainės staliniams kompiuteriams</translation> +<translation id="2479148705183875116">Eiti į nustatymus</translation> <translation id="2482878487686419369">Pranešimai</translation> <translation id="2485422356828889247">Pašalinti</translation> <translation id="2490684707762498678">Tvarko „<ph name="APP_NAME" />“</translation>
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 02d09c3..867e7b9 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Lejupielāde pabeigta: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Noteiktās vietnēs funkcijas var nedarboties, ja tiek izmantots inkognito režīms</translation> <translation id="2442870161001914531">Vienmēr pieprasīt datora vietni</translation> +<translation id="2479148705183875116">Atvērt iestatījumus</translation> <translation id="2482878487686419369">Paziņojumi</translation> <translation id="2485422356828889247">Atinstalēt</translation> <translation id="2490684707762498678">Pārvalda <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index 993b2f1..7c805cb3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Преземањето е завршено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Функциите на некои сајтови можеби нема да работат во режимот „Инкогнито“</translation> <translation id="2442870161001914531">Секогаш барај сајт за компјутер</translation> +<translation id="2479148705183875116">Одете во „Поставки“</translation> <translation id="2482878487686419369">Известувања</translation> <translation id="2485422356828889247">Деинсталирај</translation> <translation id="2490684707762498678">Управувани од <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index 74b2a8b..ff734d4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ഡൗൺലോഡ് പൂർത്തിയായി <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ചില സൈറ്റുകളിലെ ഫീച്ചറുകൾ അദൃശ്യ മോഡിൽ പ്രവർത്തിക്കണമെന്നില്ല</translation> <translation id="2442870161001914531">എല്ലായ്പ്പോഴും ഡെസ്ക്ടോപ്പ് സൈറ്റ് അഭ്യർത്ഥിക്കുക</translation> +<translation id="2479148705183875116">ക്രമീകരണത്തിലേക്ക് പോകുക</translation> <translation id="2482878487686419369">അറിയിപ്പുകൾ</translation> <translation id="2485422356828889247">അണ്ഇന്സ്റ്റാള് ചെയ്യുക</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ആണ് മാനേജ് ചെയ്യുന്നത്</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb index fbdc267..d71c680a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Татаж дууссан <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Зарим сайт дээрх онцлогууд Нууцлалын горимд ажиллахгүй байж магадгүй</translation> <translation id="2442870161001914531">Үргэлж дэлгэцийн сайтын хүсэлт тавих</translation> +<translation id="2479148705183875116">Тохиргоо руу очих</translation> <translation id="2482878487686419369">Мэдэгдэл</translation> <translation id="2485422356828889247">Устгах</translation> <translation id="2490684707762498678"><ph name="APP_NAME" />-с удирддаг</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index 6a2c45d..0bb55f342 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">डाउनलोड पूर्ण झाले <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">काही साइटवरील वैशिष्ट्ये कदाचित गुप्त मोडमध्ये काम करणार नाहीत</translation> <translation id="2442870161001914531">नेहमी डेस्कटॉप साइटची विनंती करा</translation> +<translation id="2479148705183875116">सेटिंग्ज वर जा</translation> <translation id="2482878487686419369">सूचना</translation> <translation id="2485422356828889247">अनइंस्टॉल करा</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> द्वारे व्यवस्थापित केले आहे</translation>
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 e82027d..e16c8e1 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Muat turun selesai: <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Ciri pada sesetengah laman mungkin tidak berfungsi dalam mod Inkognito</translation> <translation id="2442870161001914531">Sentiasa minta laman desktop</translation> +<translation id="2479148705183875116">Pergi ke Tetapan</translation> <translation id="2482878487686419369">Pemberitahuan</translation> <translation id="2485422356828889247">Nyahpasang</translation> <translation id="2490684707762498678">Diurus oleh <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb index 4ba1b272..82cb1f4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ဒေါင်းလုဒ်လုပ်ပြီးပါပြီ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">‘ရုပ်ဖျက်မုဒ်’ တွင် အချို့ဝဘ်ဆိုက်များရှိ ဝန်ဆောင်မှုများ အလုပ်မလုပ်နိုင်ပါ</translation> <translation id="2442870161001914531">ဒက်စ်တော့ဝဘ်ဆိုက် အမြဲတောင်းဆိုပါ</translation> +<translation id="2479148705183875116">'ဆက်တင်များ' သို့ သွားရန်</translation> <translation id="2482878487686419369">အကြောင်းကြားစာ</translation> <translation id="2485422356828889247">ဖြုတ်ရန်</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> က စီမံခန့်ခွဲထားပါသည်</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb index e6922ed..64609d6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">डाउनलोड सम्पन्न भयो <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">इन्कोग्निटो मोडमा केही साइटका सुविधाहरूले काम नगर्न सक्छन्</translation> <translation id="2442870161001914531">सधैँ साइटको डेस्कटप भ्यू देखाइयोस्</translation> +<translation id="2479148705183875116">सेटिङमा जानुहोस्</translation> <translation id="2482878487686419369">सूचनाहरू</translation> <translation id="2485422356828889247">विस्थापन गर्नुहोस्</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ले व्यवस्थापन गरेको</translation>
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 4984185..98dcfa75 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download voltooid <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Functies op bepaalde sites werken misschien niet in de incognitomodus</translation> <translation id="2442870161001914531">Altijd desktopsite aanvragen</translation> +<translation id="2479148705183875116">Naar Instellingen</translation> <translation id="2482878487686419369">Meldingen</translation> <translation id="2485422356828889247">Installatie ongedaan maken</translation> <translation id="2490684707762498678">Beheerd door <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb index 6e6f9e7..91a7dfd9a8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Nedlasting fullført <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Det kan hende at funksjoner på enkelte nettsteder ikke fungerer i Inkognitomodus</translation> <translation id="2442870161001914531">Be alltid om nettstedet for datamaskiner</translation> +<translation id="2479148705183875116">Gå til Innstillinger</translation> <translation id="2482878487686419369">Varsler</translation> <translation id="2485422356828889247">Avinstaller</translation> <translation id="2490684707762498678">Administreres av <ph name="APP_NAME" /></translation>
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 ce67df2..f94b0e5 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ଡାଉନ୍ଲୋଡ୍ ଶେଷ ହେଲା <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଇନକଗ୍ନିଟୋ ମୋଡରେ କାମ କରିନପାରେ</translation> <translation id="2442870161001914531">ସର୍ବଦା ଡେସ୍କଟପ ସାଇଟର ଅନୁରୋଧ କରନ୍ତୁ</translation> +<translation id="2479148705183875116">ସେଟିଂସକୁ ଯାଆନ୍ତୁ</translation> <translation id="2482878487686419369">ବିଜ୍ଞପ୍ତି</translation> <translation id="2485422356828889247">ଅନ୍ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ଦ୍ୱାରା ପରିଚାଳିତ</translation>
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 5592799..31a7587 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ ਹੋਇਆ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਵਿੱਚ ਕੁਝ ਸਾਈਟਾਂ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਸ਼ਾਇਦ ਕੰਮ ਨਾ ਕਰਨ</translation> <translation id="2442870161001914531">ਹਮੇਸ਼ਾਂ ਡੈਸਕਟਾਪ ਸਾਈਟ ਦੀ ਬੇਨਤੀ ਕਰੋ</translation> +<translation id="2479148705183875116">ਸੈਟਿੰਗਾਂ 'ਤੇ ਜਾਓ</translation> <translation id="2482878487686419369">ਸੂਚਨਾਵਾਂ</translation> <translation id="2485422356828889247">ਅਣਸਥਾਪਤ ਕਰੋ</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ਵੱਲੋਂ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation>
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 168191a..ece7eee 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Ukończono pobieranie <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">W niektórych witrynach funkcje mogą nie działać w trybie incognito</translation> <translation id="2442870161001914531">Zawsze żądaj strony na komputery</translation> +<translation id="2479148705183875116">Otwórz Ustawienia</translation> <translation id="2482878487686419369">Powiadomienia</translation> <translation id="2485422356828889247">Odinstaluj</translation> <translation id="2490684707762498678">Zarządzane przez <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 6d2fd36..997ebba 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Download concluído <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Os recursos de alguns sites podem não funcionar no modo de navegação anônima</translation> <translation id="2442870161001914531">Sempre ver a versão para computador</translation> +<translation id="2479148705183875116">Acessar as configurações</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2490684707762498678">Gerenciadas por <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index 3dee823..da6cac9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Transferência concluída: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">As funcionalidades em alguns sites podem não funcionar no Modo de navegação anónima</translation> <translation id="2442870161001914531">Peça sempre o site para computador</translation> +<translation id="2479148705183875116">Aceder às Definições</translation> <translation id="2482878487686419369">Notificações</translation> <translation id="2485422356828889247">Desinstalar</translation> <translation id="2490684707762498678">Gerido por <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb index 745f322..2cbecf3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Descărcare finalizată <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Este posibil ca funcțiile de pe anumite site-uri să nu ruleze în modul incognito</translation> <translation id="2442870161001914531">Solicită întotdeauna site-ul pentru computer</translation> +<translation id="2479148705183875116">Accesează Setările</translation> <translation id="2482878487686419369">Notificări</translation> <translation id="2485422356828889247">Dezinstalează</translation> <translation id="2490684707762498678">Gestionate de <ph name="APP_NAME" /></translation>
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 dd15c769d..b8b30ea4 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Скачивание завершено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">В режиме инкогнито некоторые функции сайтов могут быть отключены</translation> <translation id="2442870161001914531">Всегда запрашивать версию для ПК</translation> +<translation id="2479148705183875116">Открыть настройки</translation> <translation id="2482878487686419369">Уведомления</translation> <translation id="2485422356828889247">Удалить</translation> <translation id="2490684707762498678">Под управлением приложения "<ph name="APP_NAME" />"</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb index 94e78ddb..9a8e14f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">බාගැනීම සම්පූර්ණයි <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">සමහර අඩවිවල විශේෂාංග අප්රසිද්ධ ප්රකාරයේ ක්රියා නොකළ හැක</translation> <translation id="2442870161001914531">සැම විට ඩෙස්ක්ටොප් අඩවිය ඉල්ලන්න</translation> +<translation id="2479148705183875116">සැකසීම් වෙත යන්න</translation> <translation id="2482878487686419369">දැනුම්දීම්</translation> <translation id="2485422356828889247">අස්ථාපනය</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> විසින් කළමනා කෙරේ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index bf0bc60..f109085 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Sťahovanie bolo dokončené <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funkcie na niektorých weboch nemusia byť v režime inkognito k dispozícii</translation> <translation id="2442870161001914531">Vždy požadovať web pre počítače</translation> +<translation id="2479148705183875116">Prejsť do Nastavení</translation> <translation id="2482878487686419369">Upozornenia</translation> <translation id="2485422356828889247">Odinštalovať</translation> <translation id="2490684707762498678">Spravuje <ph name="APP_NAME" /></translation>
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 608f54d..a401eecf 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Prenos je končan <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funkcije na nekaterih spletnih mestih morda ne bodo delovale v anonimnem načinu</translation> <translation id="2442870161001914531">Vedno zahtevaj spletno mesto za namizne računalnike</translation> +<translation id="2479148705183875116">V nastavitve</translation> <translation id="2482878487686419369">Obvestila</translation> <translation id="2485422356828889247">Odmeščanje</translation> <translation id="2490684707762498678">Upravlja aplikacija <ph name="APP_NAME" /></translation>
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 175b5e0..15c0547 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Shkarkimi përfundoi <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Veçoritë në disa sajte mund të mos funksionojnë në "Modalitetin 'e fshehtë'"</translation> <translation id="2442870161001914531">Kërko gjithmonë sajtin për desktop</translation> +<translation id="2479148705183875116">Shko te "Cilësimet"</translation> <translation id="2482878487686419369">Njoftimet</translation> <translation id="2485422356828889247">Çinstalo</translation> <translation id="2490684707762498678">Menaxhuar nga <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb index a78b065d..d8ddb74 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Preuzimanje je završeno <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funkcije na nekim sajtovima možda neće raditi u režimu bez arhiviranja</translation> <translation id="2442870161001914531">Uvek se zahteva sajt za računar</translation> +<translation id="2479148705183875116">Idi u Podešavanja</translation> <translation id="2482878487686419369">Obaveštenja</translation> <translation id="2485422356828889247">Deinstaliraj</translation> <translation id="2490684707762498678">Upravlja <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb index a3dc570..5acec12 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Преузимање је завршено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Функције на неким сајтовима можда неће радити у режиму без архивирања</translation> <translation id="2442870161001914531">Увек се захтева сајт за рачунар</translation> +<translation id="2479148705183875116">Иди у Подешавања</translation> <translation id="2482878487686419369">Обавештења</translation> <translation id="2485422356828889247">Деинсталирај</translation> <translation id="2490684707762498678">Управља <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb index 908674a..2719e77 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Nedladdningen är klar<ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Funktioner på vissa webbplatser kanske inte fungerar i inkognitoläge</translation> <translation id="2442870161001914531">Begär alltid datorversionen av webbplatsen</translation> +<translation id="2479148705183875116">Öppna inställningarna</translation> <translation id="2482878487686419369">Aviseringar</translation> <translation id="2485422356828889247">Avinstallera</translation> <translation id="2490684707762498678">Hanteras av <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb index 8e59b0b..b0e971d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Upakuaji umekamilika <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Huenda vipengele kwenye baadhi ya tovuti visifanye kazi katika Hali fiche</translation> <translation id="2442870161001914531">Omba tovuti katika mwonekano wa kompyuta kila wakati</translation> +<translation id="2479148705183875116">Nenda kwenye Mipangilio</translation> <translation id="2482878487686419369">Arifa</translation> <translation id="2485422356828889247">Ondoa</translation> <translation id="2490684707762498678">Inasimamiwa na <ph name="APP_NAME" /></translation>
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 ac67e44..e528b863 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">பதிவிறக்கம் முடிந்தது <ph name="SEPARATOR" /><ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">மறைநிலைப் பயன்முறையில் இருக்கும்போது சில தளங்களில் உள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="2442870161001914531">எப்போதும் டெஸ்க்டாப் காட்சியில் காட்டப்படுபவை</translation> +<translation id="2479148705183875116">அமைப்புகளுக்குச் செல்லவும்</translation> <translation id="2482878487686419369">அறிவிப்புகள்</translation> <translation id="2485422356828889247">நிறுவல் நீக்கு</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> நிர்வகிக்கிறது</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index a387a0f..fc589ef 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">డౌన్లోడ్ పూర్తయింది <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">అజ్ఞాత మోడ్లో కొన్ని సైట్లలోని ఫీచర్లు పని చేయవు</translation> <translation id="2442870161001914531">ఎల్లప్పుడూ డెస్క్టాప్ సైట్ కోసం రిక్వెస్ట్ చేయండి</translation> +<translation id="2479148705183875116">సెట్టింగ్లకు వెళ్లు</translation> <translation id="2482878487686419369">నోటిఫికేషన్లు</translation> <translation id="2485422356828889247">అన్ఇన్స్టాల్ చేయి</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> ద్వారా నిర్వహించబడుతున్నాయి</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index 01f637e6..b4559b0 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ดาวน์โหลดเสร็จสมบูรณ์ <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ฟีเจอร์บนเว็บไซต์บางแห่งอาจใช้งานในโหมดไม่ระบุตัวตนไม่ได้</translation> <translation id="2442870161001914531">ขอเว็บไซต์เวอร์ชันเดสก์ท็อปเสมอ</translation> +<translation id="2479148705183875116">ไปที่การตั้งค่า</translation> <translation id="2482878487686419369">การแจ้งเตือน</translation> <translation id="2485422356828889247">ถอนการติดตั้ง</translation> <translation id="2490684707762498678">จัดการโดย <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index 762b920..db6bb44 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">İndirme işlemi tamamlandı <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Bazı sitelerdeki özellikler Gizli modda çalışmayabilir</translation> <translation id="2442870161001914531">Her zaman masaüstü sitesini iste</translation> +<translation id="2479148705183875116">Ayarlar'a git</translation> <translation id="2482878487686419369">Bildirimler</translation> <translation id="2485422356828889247">Kaldır</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tarafından yönetiliyor</translation>
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 0d50ea8c..90fa253d 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Завантажено <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Функції на деяких сайтах можуть не працювати в режимі анонімного перегляду</translation> <translation id="2442870161001914531">Завжди запитувати версію сайту для комп’ютера</translation> +<translation id="2479148705183875116">Перейти в налаштування</translation> <translation id="2482878487686419369">Сповіщення</translation> <translation id="2485422356828889247">Видалити</translation> <translation id="2490684707762498678">Адміністратор сімейної групи: <ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index d981708..5d725ef8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">ڈاؤن لوڈ مکمل ہو گیا <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">ہو سکتا ہے کہ کچھ سائٹس پر خصوصیات پوشیدگی وضع میں کام نہ کریں</translation> <translation id="2442870161001914531">ہمیشہ ڈیسک ٹاپ سائٹ کی درخواست کریں</translation> +<translation id="2479148705183875116">ترتیبات پر جائیں</translation> <translation id="2482878487686419369">اطلاعات</translation> <translation id="2485422356828889247">ان انسٹال کریں</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> کے زیر انتظام</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 8baabee..84af295 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Yuklab olindi: <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Ayrim saytlardagi funksiyalar Inkognito rejimida ishlamasligi mumkin</translation> <translation id="2442870161001914531">Har doim kompyuter versiyasi ochilsin</translation> +<translation id="2479148705183875116">Sozlamalarni ochish</translation> <translation id="2482878487686419369">Bildirishnomalar</translation> <translation id="2485422356828889247">O‘chirib tashlash</translation> <translation id="2490684707762498678"><ph name="APP_NAME" /> tomonidan boshqariladi</translation>
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 38a5b3a..1b456d0b 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
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Quá trình tải xuống hoàn tất <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Tính năng trên một số trang web có thể không hoạt động được ở Chế độ ẩn danh</translation> <translation id="2442870161001914531">Luôn yêu cầu trang web dành cho máy tính</translation> +<translation id="2479148705183875116">Chuyển đến phần Cài đặt</translation> <translation id="2482878487686419369">Thông báo</translation> <translation id="2485422356828889247">Gỡ cài đặt</translation> <translation id="2490684707762498678">Do <ph name="APP_NAME" /> quản lý</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index f644b14..2c089de 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">下载完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">在无痕模式下,某些网站上的功能可能会无法正常运行</translation> <translation id="2442870161001914531">始终请求访问桌面版网站</translation> +<translation id="2479148705183875116">转到“设置”</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">卸载</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index 184b0039..9d677fae 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">下載完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">部分網站的功能可能無法在無痕模式中正常運作</translation> <translation id="2442870161001914531">一律要求桌面版網站</translation> +<translation id="2479148705183875116">前往「設定」</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">解除安裝</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index 0817237..3cbcafa 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">下載完成 <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">在無痕模式下,某些網站的功能可能無法正常運作</translation> <translation id="2442870161001914531">一律要求電腦版網站</translation> +<translation id="2479148705183875116">前往「設定」</translation> <translation id="2482878487686419369">通知</translation> <translation id="2485422356828889247">解除安裝</translation> <translation id="2490684707762498678">由 <ph name="APP_NAME" /> 管理</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb index 3342b29..ef9c6974 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -83,6 +83,7 @@ <translation id="2434158240863470628">Ukulanda kuqedile <ph name="SEPARATOR" /> <ph name="BYTES_DOWNLOADED" /></translation> <translation id="244264527810019436">Izakhi kwamanye amasayithi zingase zingasebenzi kumodi ye-Incognito</translation> <translation id="2442870161001914531">Njalo cela isayithi ledeskithophu</translation> +<translation id="2479148705183875116">Iya kumasethingi</translation> <translation id="2482878487686419369">Izaziso</translation> <translation id="2485422356828889247">Khipha</translation> <translation id="2490684707762498678">Ilawulwa ngu-<ph name="APP_NAME" /></translation>
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn index 33b87e318..fec29638 100644 --- a/components/browser_ui/widget/android/BUILD.gn +++ b/components/browser_ui/widget/android/BUILD.gn
@@ -62,6 +62,7 @@ "java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java", "java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapter.java", "java/src/org/chromium/components/browser_ui/widget/dragreorder/DragStateDelegate.java", + "java/src/org/chromium/components/browser_ui/widget/dragreorder/DragUtils.java", "java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java", "java/src/org/chromium/components/browser_ui/widget/gesture/SwipeGestureListener.java", "java/src/org/chromium/components/browser_ui/widget/highlight/PulseDrawable.java",
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java index 0fea2ec3..fcb0d4b 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java
@@ -6,12 +6,10 @@ import android.content.Context; import android.content.res.Resources; -import android.graphics.Color; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.ColorUtils; -import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView.ViewHolder; @@ -29,8 +27,6 @@ * @param <T> The type of item that inhabits this adapter's list */ public abstract class DragReorderableListAdapter<T> extends RecyclerView.Adapter<ViewHolder> { - private static final int ANIMATION_DELAY_MS = 100; - protected final Context mContext; // keep track of the list and list managers @@ -136,14 +132,9 @@ * @param viewHolder The DraggableRowViewHolder that is holding this row's content. */ private void updateVisualState(boolean dragged, ViewHolder viewHolder) { - // Animate background colors and elevations - ViewCompat.animate(viewHolder.itemView) - .translationZ(dragged ? mDraggedElevation : 0) - .withEndAction( - () - -> viewHolder.itemView.setBackgroundColor( - dragged ? mDraggedBackgroundColor : Color.TRANSPARENT)) - .setDuration(ANIMATION_DELAY_MS) + DragUtils + .createViewDragAnimation(dragged, viewHolder.itemView, mDraggedBackgroundColor, + mDraggedElevation) .start(); } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapter.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapter.java index c6b84ee..06824a4 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapter.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapter.java
@@ -6,7 +6,6 @@ import android.content.Context; import android.content.res.Resources; -import android.graphics.Color; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.view.View; @@ -14,7 +13,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.ColorUtils; -import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -38,8 +36,6 @@ * but it keeps track of the view to make it available to drag over later. */ public class DragReorderableRecyclerViewAdapter extends SimpleRecyclerViewAdapter { - private static final int ANIMATION_DELAY_MS = 100; - /** * Responsible for binding draggable views to the items adapter. The viewHolder should add a * listener to the correct view (e.g. a drag handle) which informs the ItemTouchHandler that @@ -153,19 +149,13 @@ /** * Update the visual state of this row. - * * @param dragged Whether this row is currently being dragged. * @param viewHolder The DraggableRowViewHolder that is holding this row's content. */ private void updateVisualState(boolean dragged, RecyclerView.ViewHolder viewHolder) { - // Animate background colors and elevations - ViewCompat.animate(viewHolder.itemView) - .translationZ(dragged ? mDraggedElevation : 0) - .withEndAction( - () - -> viewHolder.itemView.setBackgroundColor( - dragged ? mDraggedBackgroundColor : Color.TRANSPARENT)) - .setDuration(ANIMATION_DELAY_MS) + DragUtils + .createViewDragAnimation(dragged, viewHolder.itemView, mDraggedBackgroundColor, + mDraggedElevation) .start(); } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java index 9333255..fa3b47d 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableRecyclerViewAdapterTest.java
@@ -5,16 +5,17 @@ package org.chromium.components.browser_ui.widget.dragreorder; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.IntDef; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.test.filters.SmallTest; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,31 +29,33 @@ import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; import org.chromium.ui.test.util.BlankUiTestActivityTestCase; -/** - * Tests to ensure/validate SimpleRecyclerViewAdapter behavior. - */ +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** Tests to ensure/validate SimpleRecyclerViewAdapter behavior. */ @RunWith(ChromeJUnit4ClassRunner.class) @Batch(Batch.PER_CLASS) public class DragReorderableRecyclerViewAdapterTest extends BlankUiTestActivityTestCase { static final WritableObjectPropertyKey<String> TITLE = new WritableObjectPropertyKey<>(); static final PropertyKey[] ALL_KEYS = {TITLE}; - private static final Integer NORMAL = 1; - private static final Integer DRAGGABLE = 2; - private static final Integer PASSIVELY_DRAGGABLE = 3; + @IntDef({Type.NORMAL, Type.DRAGGABLE, Type.PASSIVELY_DRAGGABLE}) + @Retention(RetentionPolicy.SOURCE) + public @interface Type { + int NORMAL = 0; + int DRAGGABLE = 1; + int PASSIVELY_DRAGGABLE = 2; + } private ModelList mModelList; private DragReorderableRecyclerViewAdapter mAdapter; private RecyclerView mRecyclerView; - private LinearLayoutManager mLinearLayoutManager; @Override public void setUpTest() throws Exception { super.setUpTest(); TestThreadUtils.runOnUiThreadBlocking(() -> { - createAdapter(); - mLinearLayoutManager = new LinearLayoutManager(getActivity()); mRecyclerView = new RecyclerView(getActivity()); RecyclerView.LayoutParams params = new RecyclerView.LayoutParams( RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT); @@ -71,12 +74,11 @@ mAdapter = new DragReorderableRecyclerViewAdapter( getActivity(), mModelList, this::isLongPressDragEnabled); - View view = new View(getActivity()); - mAdapter.registerType(NORMAL, (parent) -> { return createListItemView(); }, this::bindView); - mAdapter.registerDraggableType(DRAGGABLE, - (parent) -> { return createListItemView(); }, this::bindView, (vh, it) -> {}); + mAdapter.registerType(Type.NORMAL, (parent) -> createListItemView(), this::bindView); + mAdapter.registerDraggableType( + Type.DRAGGABLE, (parent) -> createListItemView(), this::bindView, (vh, it) -> {}); mAdapter.registerPassivelyDraggableType( - PASSIVELY_DRAGGABLE, (parent) -> { return createListItemView(); }, this::bindView); + Type.PASSIVELY_DRAGGABLE, (parent) -> createListItemView(), this::bindView); mAdapter.enableDrag(); return mAdapter; @@ -113,50 +115,51 @@ @SmallTest public void testDrag_cannotDragOverNormal() { TestThreadUtils.runOnUiThreadBlocking(() -> { - mModelList.add(new ModelListAdapter.ListItem(NORMAL, createPropertyModel("normal_1"))); mModelList.add( - new ModelListAdapter.ListItem(DRAGGABLE, createPropertyModel("draggable_1"))); + new ModelListAdapter.ListItem(Type.NORMAL, createPropertyModel("normal_1"))); + mModelList.add(new ModelListAdapter.ListItem( + Type.DRAGGABLE, createPropertyModel("draggable_1"))); }); TestThreadUtils.runOnUiThreadBlocking(() -> { mAdapter.simulateDragForTests(1, 0); }); // The order should remain since you can't drag over a normal view. - Assert.assertThat(mModelList.get(0).type, is(NORMAL)); - Assert.assertThat(mModelList.get(1).type, is(DRAGGABLE)); + assertThat(mModelList.get(0).type, is(Type.NORMAL)); + assertThat(mModelList.get(1).type, is(Type.DRAGGABLE)); } @Test @SmallTest public void testDrag_normalOverNormal() { TestThreadUtils.runOnUiThreadBlocking(() -> { - mModelList.add( - new ModelListAdapter.ListItem(DRAGGABLE, createPropertyModel("draggable_1"))); - mModelList.add( - new ModelListAdapter.ListItem(DRAGGABLE, createPropertyModel("draggable_2"))); + mModelList.add(new ModelListAdapter.ListItem( + Type.DRAGGABLE, createPropertyModel("draggable_1"))); + mModelList.add(new ModelListAdapter.ListItem( + Type.DRAGGABLE, createPropertyModel("draggable_2"))); }); TestThreadUtils.runOnUiThreadBlocking(() -> { mAdapter.simulateDragForTests(1, 0); }); // The order should remain since you can't drag over a normal view. - Assert.assertThat(mModelList.get(0).model.get(TITLE), is("draggable_2")); - Assert.assertThat(mModelList.get(1).model.get(TITLE), is("draggable_1")); + assertThat(mModelList.get(0).model.get(TITLE), is("draggable_2")); + assertThat(mModelList.get(1).model.get(TITLE), is("draggable_1")); } @Test @SmallTest public void testDrag_normalThroughPassivelyDraggable() { TestThreadUtils.runOnUiThreadBlocking(() -> { - mModelList.add( - new ModelListAdapter.ListItem(DRAGGABLE, createPropertyModel("draggable_1"))); mModelList.add(new ModelListAdapter.ListItem( - PASSIVELY_DRAGGABLE, createPropertyModel("passively_draggable_1"))); - mModelList.add( - new ModelListAdapter.ListItem(DRAGGABLE, createPropertyModel("draggable_2"))); + Type.DRAGGABLE, createPropertyModel("draggable_1"))); + mModelList.add(new ModelListAdapter.ListItem( + Type.PASSIVELY_DRAGGABLE, createPropertyModel("passively_draggable_1"))); + mModelList.add(new ModelListAdapter.ListItem( + Type.DRAGGABLE, createPropertyModel("draggable_2"))); }); TestThreadUtils.runOnUiThreadBlocking(() -> { mAdapter.simulateDragForTests(0, 1); }); - Assert.assertThat(mModelList.get(0).model.get(TITLE), is("passively_draggable_1")); - Assert.assertThat(mModelList.get(1).model.get(TITLE), is("draggable_1")); + assertThat(mModelList.get(0).model.get(TITLE), is("passively_draggable_1")); + assertThat(mModelList.get(1).model.get(TITLE), is("draggable_1")); } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragUtils.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragUtils.java new file mode 100644 index 0000000..6198703d --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragUtils.java
@@ -0,0 +1,66 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.browser_ui.widget.dragreorder; + +import android.animation.Animator; +import android.animation.AnimatorSet; +import android.animation.ValueAnimator; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.view.View; + +import androidx.annotation.ColorInt; +import androidx.core.graphics.ColorUtils; + +/** While multiple drag adapters exist, this class holds shared functionality. */ +public class DragUtils { + private static final int ANIMATION_DURATION_MS = 100; + + private static @ColorInt int getColorFromView(View view, @ColorInt int fallback) { + Drawable bg = view.getBackground(); + return bg instanceof ColorDrawable ? ((ColorDrawable) bg).getColor() : fallback; + } + + /** + * Builds a drag animation on the given View. Assumes that when there is no drag, the background + * is fully transparent and the elevation is 0. + * @param isDragging Whether a drag is happening or not. + * @param view The view who's background should be modified. + * @param dragColor The end color when being dragged. + * @param dragElevation The end elevation when being dragged. + * @return An un-started animator. + */ + public static Animator createViewDragAnimation( + boolean isDragging, View view, @ColorInt int dragColor, float dragElevation) { + // Use the same color just with full transparency. If we use Color.TRANSPARENT, it's + // actually using 0s for rgb values, and will temporarily cause a dark color to be shown. + final @ColorInt int transparentColor = ColorUtils.setAlphaComponent(dragColor, 0); + + // If the particular view has not been dragged yet, it will not have a drawable with a + // color. Can safely assume its background was fully transparent. But once that has + // happened, we can then read out the background color to make smooth transitions instead of + // assuming the previous animation completed. + final @ColorInt int startColor = getColorFromView(view, transparentColor); + + final @ColorInt int endColor = isDragging ? dragColor : transparentColor; + ValueAnimator colorAnimator = ValueAnimator.ofArgb(startColor, endColor); + colorAnimator.addUpdateListener( + (anim) -> view.setBackgroundColor((int) anim.getAnimatedValue())); + + float startElevation = view.getTranslationZ(); + float endElevation = isDragging ? dragElevation : 0; + ValueAnimator elevationAnimator = ValueAnimator.ofFloat(startElevation, endElevation); + elevationAnimator.addUpdateListener( + (anim) -> view.setTranslationZ((float) anim.getAnimatedValue())); + + // When multiple conflicting animators are playing on the same View, it seems like the last + // one to attach wins. So it effectively does not matter. So don't bother tracking + // outstanding animations to save resources. + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.setDuration(ANIMATION_DURATION_MS); + animatorSet.play(elevationAnimator).with(colorAnimator); + return animatorSet; + } +}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/OWNERS b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/OWNERS new file mode 100644 index 0000000..578d687 --- /dev/null +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/OWNERS
@@ -0,0 +1,4 @@ +mdjones@chromium.org +skym@chromium.org +twellington@chromium.org +wylieb@chromium.org
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index d2cc47b..eee98150 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "20.36", - "log_list_timestamp": "2023-04-11T12:55:27Z", + "version": "20.37", + "log_list_timestamp": "2023-04-12T12:57:23Z", "operators": [ { "name": "Google",
diff --git a/components/commerce/core/BUILD.gn b/components/commerce/core/BUILD.gn index 264b2b9..e4fc689 100644 --- a/components/commerce/core/BUILD.gn +++ b/components/commerce/core/BUILD.gn
@@ -291,7 +291,6 @@ ":shopping_service_test_support", "subscriptions:test_support", "webui:unit_tests", - "//components/search", ] }
diff --git a/components/commerce/core/commerce_feature_list.cc b/components/commerce/core/commerce_feature_list.cc index ed3c268..ab33865 100644 --- a/components/commerce/core/commerce_feature_list.cc +++ b/components/commerce/core/commerce_feature_list.cc
@@ -42,6 +42,7 @@ static const base::NoDestructor<CountryLocaleMap> allowed_map([] { CountryLocaleMap map; + map[&kCommerceProductInfoApiEnabledRegionLaunched] = {{"us", {"en-us"}}}; map[&kShoppingListRegionLaunched] = {{"us", {"en-us"}}}; map[&kShoppingPDPMetricsRegionLaunched] = {{"us", {"en-us"}}}; map[&ntp_features::kNtpChromeCartModule] = {{"us", {"en-us"}}}; @@ -142,6 +143,14 @@ "CommercePriceTracking", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kCommerceProductInfoApiEnabled, + "CommerceProductInfoApiEnabled", + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kCommerceProductInfoApiEnabledRegionLaunched, + "CommerceProductInfoApiEnabledRegionLaunched", + base::FEATURE_ENABLED_BY_DEFAULT); + const base::FeatureParam<bool> kDeleteAllMerchantsOnClearBrowsingHistory{ &kCommerceMerchantViewer, "delete_all_merchants_on_clear_history", false};
diff --git a/components/commerce/core/commerce_feature_list.h b/components/commerce/core/commerce_feature_list.h index 583e430..0e3fe6c 100644 --- a/components/commerce/core/commerce_feature_list.h +++ b/components/commerce/core/commerce_feature_list.h
@@ -74,6 +74,8 @@ BASE_DECLARE_FEATURE(kCommerceAllowServerImages); BASE_DECLARE_FEATURE(kCommerceMerchantViewer); BASE_DECLARE_FEATURE(kCommerceMerchantViewerRegionLaunched); +BASE_DECLARE_FEATURE(kCommerceProductInfoApiEnabled); +BASE_DECLARE_FEATURE(kCommerceProductInfoApiEnabledRegionLaunched); extern const base::FeatureParam<bool> kDeleteAllMerchantsOnClearBrowsingHistory; BASE_DECLARE_FEATURE(kShoppingList); BASE_DECLARE_FEATURE(kShoppingListRegionLaunched);
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc index 69d35eb..7630d2e8 100644 --- a/components/commerce/core/shopping_service.cc +++ b/components/commerce/core/shopping_service.cc
@@ -396,12 +396,9 @@ bool ShoppingService::IsProductInfoApiEnabled() { return IsRegionLockedFeatureEnabled( - kShoppingList, kShoppingListRegionLaunched, country_on_startup_, - locale_on_startup_) || - (base::FeatureList::IsEnabled(ntp_features::kNtpChromeCartModule) && - IsEnabledForCountryAndLocale(ntp_features::kNtpChromeCartModule, - country_on_startup_, - locale_on_startup_)); + kCommerceProductInfoApiEnabled, + kCommerceProductInfoApiEnabledRegionLaunched, country_on_startup_, + locale_on_startup_); } bool ShoppingService::IsPDPMetricsRecordingEnabled() {
diff --git a/components/commerce/core/shopping_service_unittest.cc b/components/commerce/core/shopping_service_unittest.cc index fbeb5a8c..02b7ab6 100644 --- a/components/commerce/core/shopping_service_unittest.cc +++ b/components/commerce/core/shopping_service_unittest.cc
@@ -22,7 +22,6 @@ #include "components/power_bookmarks/core/proto/power_bookmark_meta.pb.h" #include "components/power_bookmarks/core/proto/shopping_specifics.pb.h" #include "components/prefs/testing_pref_service.h" -#include "components/search/ntp_features.h" #include "testing/gtest/include/gtest/gtest.h" using optimization_guide::OptimizationGuideDecision; @@ -75,10 +74,9 @@ // Test that product info is processed correctly. TEST_F(ShoppingServiceTest, TestProductInfoResponse) { - // Ensure a feature that uses product info is enabled. This doesn't - // necessarily need to be the shopping list. + // Ensure a feature that uses product info is enabled. test_features_.InitWithFeatures( - {commerce::kShoppingList, commerce::kCommerceAllowServerImages}, {}); + {kCommerceProductInfoApiEnabled, kCommerceAllowServerImages}, {}); OptimizationMetadata meta = opt_guide_->BuildPriceTrackingResponse( kTitle, kImageUrl, kOfferId, kClusterId, kCountryCode, kPrice, @@ -119,9 +117,7 @@ // if it is disabled. TEST_F(ShoppingServiceTest, TestProductInfoResponse_ApiDisabled) { // Ensure a feature that uses product info is disabled. - test_features_.InitWithFeatures({}, - {kShoppingList, kShoppingListRegionLaunched, - ntp_features::kNtpChromeCartModule}); + test_features_.InitAndDisableFeature(kCommerceProductInfoApiEnabled); base::RunLoop run_loop; shopping_service_->GetProductInfoForUrl( @@ -140,7 +136,7 @@ // Ensure a feature that uses product info is enabled. This doesn't // necessarily need to be the shopping list. test_features_.InitWithFeatures( - {commerce::kShoppingList, commerce::kCommerceAllowServerImages}, {}); + {kCommerceProductInfoApiEnabled, kCommerceAllowServerImages}, {}); OptimizationMetadata meta = opt_guide_->BuildPriceTrackingResponse( kTitle, kImageUrl, kOfferId, kClusterId, kCountryCode, kPrice, @@ -182,7 +178,8 @@ // Test that no object is provided for a negative optimization guide response. TEST_F(ShoppingServiceTest, TestProductInfoResponse_OptGuideFalse) { test_features_.InitWithFeatures( - {kShoppingList, kCommerceAllowLocalImages, kCommerceAllowServerImages}, + {kCommerceProductInfoApiEnabled, kCommerceAllowLocalImages, + kCommerceAllowServerImages}, {}); opt_guide_->SetResponse(GURL(kProductUrl), OptimizationType::PRICE_TRACKING, @@ -205,7 +202,8 @@ // Test that the product info cache only keeps track of live tabs. TEST_F(ShoppingServiceTest, TestProductInfoCacheURLCount) { test_features_.InitWithFeatures( - {kShoppingList, kCommerceAllowLocalImages, kCommerceAllowServerImages}, + {kCommerceProductInfoApiEnabled, kCommerceAllowLocalImages, + kCommerceAllowServerImages}, {}); std::string url = "http://example.com/foo"; @@ -254,7 +252,8 @@ // necessarily querying for it. TEST_F(ShoppingServiceTest, TestProductInfoCacheFullLifecycle) { test_features_.InitWithFeatures( - {kShoppingList, kCommerceAllowLocalImages, kCommerceAllowServerImages}, + {kCommerceProductInfoApiEnabled, kCommerceAllowLocalImages, + kCommerceAllowServerImages}, {}); MockWebWrapper web(GURL(kProductUrl), false); @@ -307,7 +306,8 @@ // necessarily querying for it. TEST_F(ShoppingServiceTest, TestProductInfoCacheFullLifecycleWithFallback) { test_features_.InitWithFeatures( - {kShoppingList, kCommerceAllowLocalImages, kCommerceAllowServerImages}, + {kCommerceProductInfoApiEnabled, kCommerceAllowLocalImages, + kCommerceAllowServerImages}, {}); MockWebWrapper web(GURL(kProductUrl), false);
diff --git a/components/commerce/core/subscriptions/subscriptions_server_proxy.cc b/components/commerce/core/subscriptions/subscriptions_server_proxy.cc index 8a92a58a..6f49fb6b 100644 --- a/components/commerce/core/subscriptions/subscriptions_server_proxy.cc +++ b/components/commerce/core/subscriptions/subscriptions_server_proxy.cc
@@ -356,8 +356,9 @@ const data_decoder::DataDecoder::ValueOrError& result) { auto subscriptions = std::make_unique<std::vector<CommerceSubscription>>(); if (result.has_value() && result->is_dict()) { - if (auto* subscriptions_json = result->FindListKey(kSubscriptionsKey)) { - for (const auto& subscription_json : subscriptions_json->GetList()) { + if (auto* subscriptions_json = + result->GetDict().FindList(kSubscriptionsKey)) { + for (const auto& subscription_json : *subscriptions_json) { if (auto subscription = Deserialize(subscription_json)) subscriptions->push_back(*subscription); } @@ -366,26 +367,25 @@ return subscriptions; } -base::Value SubscriptionsServerProxy::Serialize( +base::Value::Dict SubscriptionsServerProxy::Serialize( const CommerceSubscription& subscription) { - base::Value subscription_json(base::Value::Type::DICT); - subscription_json.SetStringKey(kSubscriptionTypeKey, - SubscriptionTypeToString(subscription.type)); - subscription_json.SetStringKey( - kSubscriptionIdTypeKey, SubscriptionIdTypeToString(subscription.id_type)); - subscription_json.SetStringKey(kSubscriptionIdKey, subscription.id); - subscription_json.SetStringKey( + base::Value::Dict subscription_json; + subscription_json.Set(kSubscriptionTypeKey, + SubscriptionTypeToString(subscription.type)); + subscription_json.Set(kSubscriptionIdTypeKey, + SubscriptionIdTypeToString(subscription.id_type)); + subscription_json.Set(kSubscriptionIdKey, subscription.id); + subscription_json.Set( kSubscriptionManagementTypeKey, SubscriptionManagementTypeToString(subscription.management_type)); if (auto seen_offer = subscription.user_seen_offer) { - base::Value seen_offer_json(base::Value::Type::DICT); - seen_offer_json.SetStringKey(kSeenOfferIdKey, seen_offer->offer_id); - seen_offer_json.SetStringKey( - kSeenOfferPriceKey, base::NumberToString(seen_offer->user_seen_price)); - seen_offer_json.SetStringKey(kSeenOfferCountryKey, - seen_offer->country_code); - subscription_json.SetKey(kSubscriptionSeenOfferKey, - std::move(seen_offer_json)); + base::Value::Dict seen_offer_json; + seen_offer_json.Set(kSeenOfferIdKey, seen_offer->offer_id); + seen_offer_json.Set(kSeenOfferPriceKey, + base::NumberToString(seen_offer->user_seen_price)); + seen_offer_json.Set(kSeenOfferCountryKey, seen_offer->country_code); + subscription_json.Set(kSubscriptionSeenOfferKey, + std::move(seen_offer_json)); } return subscription_json; } @@ -393,12 +393,14 @@ absl::optional<CommerceSubscription> SubscriptionsServerProxy::Deserialize( const base::Value& value) { if (value.is_dict()) { - auto* type = value.FindStringKey(kSubscriptionTypeKey); - auto* id_type = value.FindStringKey(kSubscriptionIdTypeKey); - auto* id = value.FindStringKey(kSubscriptionIdKey); - auto* management_type = value.FindStringKey(kSubscriptionManagementTypeKey); + const base::Value::Dict& value_dict = value.GetDict(); + auto* type = value_dict.FindString(kSubscriptionTypeKey); + auto* id_type = value_dict.FindString(kSubscriptionIdTypeKey); + auto* id = value_dict.FindString(kSubscriptionIdKey); + auto* management_type = + value_dict.FindString(kSubscriptionManagementTypeKey); auto timestamp = - base::ValueToInt64(value.GetDict().Find(kSubscriptionTimestampKey)); + base::ValueToInt64(value_dict.Find(kSubscriptionTimestampKey)); if (type && id_type && id && management_type && timestamp) { return absl::make_optional<CommerceSubscription>( StringToSubscriptionType(*type), StringToSubscriptionIdType(*id_type),
diff --git a/components/commerce/core/subscriptions/subscriptions_server_proxy.h b/components/commerce/core/subscriptions/subscriptions_server_proxy.h index 7270d11c..d384e866 100644 --- a/components/commerce/core/subscriptions/subscriptions_server_proxy.h +++ b/components/commerce/core/subscriptions/subscriptions_server_proxy.h
@@ -105,7 +105,7 @@ GetSubscriptionsFromParsedJson( const data_decoder::DataDecoder::ValueOrError& result); - base::Value Serialize(const CommerceSubscription& subscription); + base::Value::Dict Serialize(const CommerceSubscription& subscription); absl::optional<CommerceSubscription> Deserialize(const base::Value& value);
diff --git a/components/device_reauth/device_authenticator.h b/components/device_reauth/device_authenticator.h index 95a5177..ae3b3eb 100644 --- a/components/device_reauth/device_authenticator.h +++ b/components/device_reauth/device_authenticator.h
@@ -46,7 +46,11 @@ // passwords from settings page on Windows and Mac. kPasswordsInSettings = 7, - kMaxValue = kPasswordsInSettings, + // The prompt displayed when the user is trying to autofill a local card, and + // re-auth is triggered. + kLocalCardAutofill = 8, + + kMaxValue = kLocalCardAutofill, }; // This interface encapsulates operations related to biometric authentication.
diff --git a/components/domain_reliability/uploader.cc b/components/domain_reliability/uploader.cc index 06f8a21..c14da10 100644 --- a/components/domain_reliability/uploader.cc +++ b/components/domain_reliability/uploader.cc
@@ -113,11 +113,9 @@ "the setting is named 'Automatically send diagnostic and usage " "data to Google'." chrome_policy { - subProto1 { - DomainReliabilityAllowed { - policy_options {mode: MANDATORY} - DomainReliabilityAllowed: false - } + DomainReliabilityAllowed { + policy_options {mode: MANDATORY} + DomainReliabilityAllowed: false } } chrome_policy {
diff --git a/components/exo/wayland/shell_unittest.cc b/components/exo/wayland/shell_unittest.cc index 582991e9..29fced60 100644 --- a/components/exo/wayland/shell_unittest.cc +++ b/components/exo/wayland/shell_unittest.cc
@@ -234,7 +234,8 @@ using RemoteShellTest = test::WaylandServerTest; // Calling SetPined w/o commit should not crash (crbug.com/979128). -TEST_F(RemoteShellTest, DestroyRootSurfaceBeforeCommit) { +// Flacky crbug.com/1432518 +TEST_F(RemoteShellTest, DISABLED_DestroyRootSurfaceBeforeCommit) { test::ResourceKey surface_key; PostToClientAndWait([&](test::TestClient* client) {
diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc index f5a005f..44ed7f0 100644 --- a/components/external_intents/android/external_intents_features.cc +++ b/components/external_intents/android/external_intents_features.cc
@@ -18,8 +18,7 @@ // Array of features exposed through the Java ExternalIntentsFeatures API. const base::Feature* kFeaturesExposedToJava[] = { - &kExternalNavigationDebugLogs, &kExternalNavigationSubframeRedirects, - &kBlockSubframeIntentToSelf, &kBlockFrameRenavigations, + &kExternalNavigationDebugLogs, &kBlockFrameRenavigations, &kDoNotRequireSpecializedCCTHandler, &kBlockIntentsToSelf}; } // namespace @@ -30,14 +29,6 @@ "ExternalNavigationDebugLogs", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kExternalNavigationSubframeRedirects, - "ExternalNavigationSubframeRedirects", - base::FEATURE_ENABLED_BY_DEFAULT); - -BASE_FEATURE(kBlockSubframeIntentToSelf, - "BlockSubframeIntentToSelf", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kBlockFrameRenavigations, "BlockFrameRenavigations", base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/components/external_intents/android/external_intents_features.h b/components/external_intents/android/external_intents_features.h index 85592f2..53100e3 100644 --- a/components/external_intents/android/external_intents_features.h +++ b/components/external_intents/android/external_intents_features.h
@@ -10,8 +10,6 @@ namespace external_intents { BASE_DECLARE_FEATURE(kExternalNavigationDebugLogs); -BASE_DECLARE_FEATURE(kExternalNavigationSubframeRedirects); -BASE_DECLARE_FEATURE(kBlockSubframeIntentToSelf); BASE_DECLARE_FEATURE(kBlockFrameRenavigations); BASE_DECLARE_FEATURE(kDoNotRequireSpecializedCCTHandler); BASE_DECLARE_FEATURE(kBlockIntentsToSelf);
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java index 2f11ebc..1aa3cef 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -18,9 +18,6 @@ @JNINamespace("external_intents") public class ExternalIntentsFeatures extends Features { public static final String EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME = "ExternalNavigationDebugLogs"; - public static final String EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME = - "ExternalNavigationSubframeRedirects"; - public static final String BLOCK_SUBFRAME_INTENT_TO_SELF_NAME = "BlockSubframeIntentToSelf"; public static final String BLOCK_FRAME_RENAVIGATIONS_NAME = "BlockFrameRenavigations"; public static final String DO_NOT_REQUIRE_SPECIALIZED_CCT_HANDLER_NAME = "DoNotRequireSpecializedCCTHandler"; @@ -29,20 +26,14 @@ public static final ExternalIntentsFeatures EXTERNAL_NAVIGATION_DEBUG_LOGS = new ExternalIntentsFeatures(0, EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME); - public static final ExternalIntentsFeatures EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS = - new ExternalIntentsFeatures(1, EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS_NAME); - - public static final ExternalIntentsFeatures BLOCK_SUBFRAME_INTENT_TO_SELF = - new ExternalIntentsFeatures(2, BLOCK_SUBFRAME_INTENT_TO_SELF_NAME); - public static final ExternalIntentsFeatures BLOCK_FRAME_RENAVIGATIONS = - new ExternalIntentsFeatures(3, BLOCK_FRAME_RENAVIGATIONS_NAME); + new ExternalIntentsFeatures(1, BLOCK_FRAME_RENAVIGATIONS_NAME); public static final ExternalIntentsFeatures DO_NOT_REQUIRE_SPECIALIZED_CCT_HANDLER = - new ExternalIntentsFeatures(4, DO_NOT_REQUIRE_SPECIALIZED_CCT_HANDLER_NAME); + new ExternalIntentsFeatures(2, DO_NOT_REQUIRE_SPECIALIZED_CCT_HANDLER_NAME); public static final ExternalIntentsFeatures BLOCK_INTENTS_TO_SELF = - new ExternalIntentsFeatures(5, BLOCK_INTENTS_TO_SELF_NAME); + new ExternalIntentsFeatures(3, BLOCK_INTENTS_TO_SELF_NAME); private final int mOrdinal;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java index aa8217e..ea8988d 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -1131,7 +1131,6 @@ QueryIntentActivitiesSupplier resolvingInfos, ResolveActivitySupplier resolveActivity, boolean isExternalProtocol) { if (sAllowIntentsToSelfForTesting) return false; - if (!ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF.isEnabled()) return false; if (!ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF.isEnabled() && params.isMainFrame()) { return false; }
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java index c903189..45f83d1 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -217,12 +217,8 @@ case OverrideUrlLoadingResultType.OVERRIDE_WITH_EXTERNAL_INTENT: return null; case OverrideUrlLoadingResultType.OVERRIDE_WITH_NAVIGATE_TAB: - if (ExternalIntentsFeatures.EXTERNAL_NAVIGATION_SUBFRAME_REDIRECTS.isEnabled()) { - assert result.getTargetUrl() != null; - return result.getTargetUrl(); - } else { - return null; - } + assert result.getTargetUrl() != null; + return result.getTargetUrl(); case OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION: // Empty GURL indicates a pending async action. return GURL.emptyGURL();
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java index 0d23c8b5..2ad7a66 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java
@@ -75,8 +75,7 @@ @RunWith(BaseJUnit4ClassRunner.class) @Batch(Batch.UNIT_TESTS) @Features.DisableFeatures(ExternalIntentsFeatures.EXTERNAL_NAVIGATION_DEBUG_LOGS_NAME) -@Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_SUBFRAME_INTENT_TO_SELF_NAME, - ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME, +@Features.EnableFeatures({ExternalIntentsFeatures.BLOCK_FRAME_RENAVIGATIONS_NAME, ExternalIntentsFeatures.DO_NOT_REQUIRE_SPECIALIZED_CCT_HANDLER_NAME, ExternalIntentsFeatures.BLOCK_INTENTS_TO_SELF_NAME}) public class ExternalNavigationHandlerTest {
diff --git a/components/feed/core/proto/v2/wire/feed_entry_point_source.proto b/components/feed/core/proto/v2/wire/feed_entry_point_source.proto index f2b3412b..6da0de8 100644 --- a/components/feed/core/proto/v2/wire/feed_entry_point_source.proto +++ b/components/feed/core/proto/v2/wire/feed_entry_point_source.proto
@@ -14,5 +14,6 @@ CHROME_SINGLE_WEB_FEED_MENU = 24; CHROME_SINGLE_WEB_FEED_ATTRIBUTION = 25; CHROME_SINGLE_WEB_FEED_RECOMMENDATION = 26; + CHROME_SINGLE_WEB_FEED_GROUP_HEADER = 28; CHROME_SINGLE_WEB_FEED_OTHER = 27; }
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index 28ae44bc..d63bd24 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -442,7 +442,8 @@ void FeedStream::AttachSurface(FeedStreamSurface* surface) { metrics_reporter_->SurfaceOpened(surface->GetStreamType(), - surface->GetSurfaceId()); + surface->GetSurfaceId(), + surface->GetSingleWebFeedEntryPoint()); Stream& stream = GetStream(surface->GetStreamType()); // Skip normal processing when overriding stream data from the internals page. if (forced_stream_update_for_debugging_.updated_slices_size() > 0) {
diff --git a/components/feed/core/v2/metrics_reporter.cc b/components/feed/core/v2/metrics_reporter.cc index bb47cbd0..c485787 100644 --- a/components/feed/core/v2/metrics_reporter.cc +++ b/components/feed/core/v2/metrics_reporter.cc
@@ -784,13 +784,19 @@ good_visit_state_.AddTimeInFeed(delta); } -void MetricsReporter::SurfaceOpened(const StreamType& stream_type, - SurfaceId surface_id) { +void MetricsReporter::SurfaceOpened( + const StreamType& stream_type, + SurfaceId surface_id, + SingleWebFeedEntryPoint single_web_feed_entry_point) { VVLOG << "Feed SurfaceOpened " << stream_type << " id=" << surface_id; ReportPersistentDataIfDayIsDone(); surfaces_waiting_for_content_.emplace( surface_id, SurfaceWaiting{stream_type, base::TimeTicks::Now()}); ReportUserActionHistogram(FeedUserActionType::kOpenedFeedSurface); + if (stream_type.IsSingleWebFeed()) { + base::UmaHistogramEnumeration("ContentSuggestions.SingleWebFeed.EntryPoint", + single_web_feed_entry_point); + } base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( FROM_HERE, base::BindOnce(&MetricsReporter::ReportOpenFeedIfNeeded, GetWeakPtr(),
diff --git a/components/feed/core/v2/metrics_reporter.h b/components/feed/core/v2/metrics_reporter.h index cc106d9..556ee6d6 100644 --- a/components/feed/core/v2/metrics_reporter.h +++ b/components/feed/core/v2/metrics_reporter.h
@@ -89,7 +89,10 @@ void StreamScrollStart(); // Called when the Feed surface is opened and closed. - void SurfaceOpened(const StreamType& stream_type, SurfaceId surface_id); + void SurfaceOpened(const StreamType& stream_type, + SurfaceId surface_id, + SingleWebFeedEntryPoint single_web_feed_entry_point = + SingleWebFeedEntryPoint::kOther); void SurfaceClosed(SurfaceId surface_id); // Network metrics.
diff --git a/components/feed/core/v2/metrics_reporter_unittest.cc b/components/feed/core/v2/metrics_reporter_unittest.cc index 9706247..3cd64b3 100644 --- a/components/feed/core/v2/metrics_reporter_unittest.cc +++ b/components/feed/core/v2/metrics_reporter_unittest.cc
@@ -958,6 +958,20 @@ FeedUserActionType::kOpenedFeedSurface, 1); } +TEST_F(MetricsReporterTest, SurfaceOpenedSingleWebFeedEntryPoint) { + reporter_->SurfaceOpened(StreamType(StreamKind::kSingleWebFeed), kSurfaceId, + SingleWebFeedEntryPoint::kMenu); + + std::map<FeedEngagementType, int> want_empty; + EXPECT_EQ(want_empty, + ReportedEngagementType(StreamType(StreamKind::kSingleWebFeed))); + EXPECT_EQ(want_empty, ReportedEngagementType(kCombinedStreams)); + histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserActions", + FeedUserActionType::kOpenedFeedSurface, 1); + histogram_.ExpectUniqueSample("ContentSuggestions.SingleWebFeed.EntryPoint", + SingleWebFeedEntryPoint::kMenu, 1); +} + TEST_F(MetricsReporterTest, OpenFeedSuccessDuration) { reporter_->SurfaceOpened(StreamType(StreamKind::kForYou), kSurfaceId); task_environment_.FastForwardBy(base::Seconds(9));
diff --git a/components/feed/core/v2/proto_util.cc b/components/feed/core/v2/proto_util.cc index 3675349..01c81a91 100644 --- a/components/feed/core/v2/proto_util.cc +++ b/components/feed/core/v2/proto_util.cc
@@ -240,6 +240,11 @@ feedwire::FeedEntryPointSource:: CHROME_SINGLE_WEB_FEED_RECOMMENDATION); break; + case SingleWebFeedEntryPoint::kGroupHeader: + entry_point.set_feed_entry_point_source_value( + feedwire::FeedEntryPointSource:: + CHROME_SINGLE_WEB_FEED_GROUP_HEADER); + break; case SingleWebFeedEntryPoint::kOther: entry_point.set_feed_entry_point_source_value( feedwire::FeedEntryPointSource::CHROME_SINGLE_WEB_FEED_OTHER);
diff --git a/components/feed/core/v2/public/public_types.cc b/components/feed/core/v2/public/public_types.cc index 28f0b10..323f31a9 100644 --- a/components/feed/core/v2/public/public_types.cc +++ b/components/feed/core/v2/public/public_types.cc
@@ -191,6 +191,8 @@ return out << "kAttribution"; case SingleWebFeedEntryPoint::kRecommendation: return out << "kRecommendation"; + case SingleWebFeedEntryPoint::kGroupHeader: + return out << "kGroupHeader"; case SingleWebFeedEntryPoint::kOther: return out << "kOther"; }
diff --git a/components/feed/core/v2/public/types.h b/components/feed/core/v2/public/types.h index 08feddb..15795ffe 100644 --- a/components/feed/core/v2/public/types.h +++ b/components/feed/core/v2/public/types.h
@@ -273,8 +273,10 @@ kAttribution = 1, // Feed Recomentation kRecommendation = 2, + // Feed Recomentation + kGroupHeader = 3, // Other - kOther = 3, + kOther = 4, kMaxValue = kOther, };
diff --git a/components/feedback/redaction_tool/redaction_tool.cc b/components/feedback/redaction_tool/redaction_tool.cc index 726e1af..7bbeb9e92 100644 --- a/components/feedback/redaction_tool/redaction_tool.cc +++ b/components/feedback/redaction_tool/redaction_tool.cc
@@ -103,7 +103,7 @@ // PSM identifier is a 4-character brand code, which can be encoded as 8 hex // digits, followed by a slash ('/') and a serial number. {"PSM ID", - "(?i)(PSM.*\\b)((?:[a-z]{4}|[0-9a-f]{8})\\/" + "(?i)(PSM.*\\s+.*\\b)((?:[a-z]{4}|[0-9a-f]{8})\\/" "[0-9a-z\\-.:\\/\\\\\\x00-\\x09\\x0B-\\x1F]+)(\\b)", PIIType::kSerial},
diff --git a/components/feedback/redaction_tool/redaction_tool_unittest.cc b/components/feedback/redaction_tool/redaction_tool_unittest.cc index b1dc104..0fc9dd9 100644 --- a/components/feedback/redaction_tool/redaction_tool_unittest.cc +++ b/components/feedback/redaction_tool/redaction_tool_unittest.cc
@@ -441,6 +441,8 @@ EXPECT_EQ("PSM: zefg0000/123xx", RedactCustomPatterns("PSM: zefg0000/123xx")); // No mention of PSM prior to identifier, e.g. in unrelated paths. EXPECT_EQ("/root/123xx", RedactCustomPatterns("/root/123xx")); + // PSM mention without whitespace, e.g. in base64-encoded data. + EXPECT_EQ("PSM+ABCZ/123xx", RedactCustomPatterns("PSM+ABCZ/123xx")); EXPECT_EQ("\"gaia_id\":\"<GAIA: 1>\"", RedactCustomPatterns("\"gaia_id\":\"1234567890\""));
diff --git a/components/gcm_driver/crypto/gcm_key_store.cc b/components/gcm_driver/crypto/gcm_key_store.cc index c73ecd57..eb107f6e 100644 --- a/components/gcm_driver/crypto/gcm_key_store.cc +++ b/components/gcm_driver/crypto/gcm_key_store.cc
@@ -10,7 +10,6 @@ #include "base/functional/bind.h" #include "base/functional/callback.h" -#include "base/functional/callback_helpers.h" #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/strings/string_util.h" @@ -71,7 +70,7 @@ DCHECK(blocking_task_runner); } -GCMKeyStore::~GCMKeyStore() {} +GCMKeyStore::~GCMKeyStore() = default; void GCMKeyStore::GetKeys(const std::string& app_id, const std::string& authorized_entity, @@ -106,7 +105,6 @@ } } - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.GetKeySuccessRate", success); if (!success) std::move(callback).Run(nullptr /* key */, std::string() /* auth_secret */); } @@ -261,8 +259,6 @@ } void GCMKeyStore::DidRemoveKeys(base::OnceClosure callback, bool success) { - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.RemoveKeySuccessRate", success); - if (!success) { DVLOG(1) << "Unable to delete a key from the GCM Key Store."; @@ -274,7 +270,6 @@ } void GCMKeyStore::DidUpgradeDatabase(bool success) { - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.GCMDatabaseUpgradeResult", success); if (!success) { DVLOG(1) << "Unable to upgrade the GCM Key Store database."; // Our cache is now inconsistent. Reject requests until restarted. @@ -310,7 +305,6 @@ void GCMKeyStore::DidInitialize(leveldb_proto::Enums::InitStatus status) { bool success = status == leveldb_proto::Enums::kOK; - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.InitKeyStoreSuccessRate", success); if (!success) { DVLOG(1) << "Unable to initialize the GCM Key Store."; state_ = State::FAILED; @@ -341,8 +335,6 @@ << entry.keys(0).private_key(); state_ = State::FAILED; delayed_task_controller_.SetReady(); - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.GCMDatabaseUpgradeResult", - false /* sucess */); return; } @@ -361,7 +353,6 @@ void GCMKeyStore::DidLoadKeys( bool success, std::unique_ptr<std::vector<EncryptionData>> entries) { - UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.LoadKeyStoreSuccessRate", success); if (!success) { DVLOG(1) << "Unable to load entries into the GCM Key Store."; state_ = State::FAILED;
diff --git a/components/gcm_driver/crypto/gcm_key_store_unittest.cc b/components/gcm_driver/crypto/gcm_key_store_unittest.cc index afb95d4..99e6be1 100644 --- a/components/gcm_driver/crypto/gcm_key_store_unittest.cc +++ b/components/gcm_driver/crypto/gcm_key_store_unittest.cc
@@ -8,7 +8,6 @@ #include <string> #include "base/base64url.h" -#include "base/check_op.h" #include "base/files/scoped_temp_dir.h" #include "base/functional/bind.h" #include "base/functional/callback.h" @@ -16,7 +15,6 @@ #include "base/run_loop.h" #include "base/strings/string_util.h" #include "base/test/gtest_util.h" -#include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "components/gcm_driver/crypto/p256_key_util.h" #include "components/leveldb_proto/public/proto_database.h" @@ -57,8 +55,8 @@ class GCMKeyStoreTest : public ::testing::Test { public: - GCMKeyStoreTest() {} - ~GCMKeyStoreTest() override {} + GCMKeyStoreTest() = default; + ~GCMKeyStoreTest() override = default; void SetUp() override { ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); @@ -138,7 +136,6 @@ protected: GCMKeyStore* gcm_key_store() { return gcm_key_store_.get(); } - base::HistogramTester* histogram_tester() { return &histogram_tester_; } void UpdatedEntries(base::OnceClosure quit_closure, bool success) { EXPECT_TRUE(success); @@ -149,17 +146,11 @@ private: base::test::SingleThreadTaskEnvironment task_environment_; base::ScopedTempDir scoped_temp_dir_; - base::HistogramTester histogram_tester_; std::unique_ptr<GCMKeyStore> gcm_key_store_; }; TEST_F(GCMKeyStoreTest, EmptyByDefault) { - // The key store is initialized lazily, so this histogram confirms that - // calling the constructor does not in fact cause initialization. - histogram_tester()->ExpectTotalCount( - "GCM.Crypto.InitKeyStoreSuccessRate", 0); - ECPrivateKeyUniquePtr key; std::string auth_secret; base::RunLoop run_loop; @@ -173,9 +164,6 @@ ASSERT_FALSE(key); EXPECT_EQ(0u, auth_secret.size()); - - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.GetKeySuccessRate", 0, 1); // failure } TEST_F(GCMKeyStoreTest, CreateAndGetKeys) { @@ -198,8 +186,6 @@ EXPECT_GT(private_key.size(), 0u); ASSERT_GT(auth_secret.size(), 0u); - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.CreateKeySuccessRate", 1, 1); // success ECPrivateKeyUniquePtr read_key; std::string read_auth_secret; @@ -221,9 +207,6 @@ ASSERT_EQ(read_public_key, public_key); EXPECT_EQ(auth_secret, read_auth_secret); - histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1, - 1); // success - // GetKey should also succeed if fallback_to_empty_authorized_entity is true // (fallback should not occur, since an exact match is found). base::RunLoop second_get_run_loop; @@ -243,9 +226,6 @@ ASSERT_EQ(read_private_key, private_key); ASSERT_EQ(read_public_key, public_key); EXPECT_EQ(auth_secret, read_auth_secret); - - histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1, - 2); // another success } TEST_F(GCMKeyStoreTest, GetKeysFallback) { @@ -271,9 +251,6 @@ EXPECT_GT(private_key.size(), 0u); ASSERT_GT(auth_secret.size(), 0u); - histogram_tester()->ExpectBucketCount("GCM.Crypto.CreateKeySuccessRate", 1, - 1); // success - // GetKeys should fail when fallback_to_empty_authorized_entity is false, as // there is not an exact match for kFakeAuthorizedEntity. ECPrivateKeyUniquePtr read_key; @@ -292,9 +269,6 @@ ASSERT_FALSE(read_key); EXPECT_EQ(0u, read_auth_secret.size()); - histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 0, - 1); // failure - // GetKey should succeed when fallback_to_empty_authorized_entity is true, as // falling back to empty authorized entity will match the created key. { @@ -317,9 +291,6 @@ EXPECT_EQ(public_key, read_public_key); EXPECT_EQ(auth_secret, read_auth_secret); - - histogram_tester()->ExpectBucketCount("GCM.Crypto.GetKeySuccessRate", 1, - 1); // success } TEST_F(GCMKeyStoreTest, KeysPersistenceBetweenInstances) { @@ -337,11 +308,6 @@ ASSERT_TRUE(key); - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.InitKeyStoreSuccessRate", 1, 1); // success - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.LoadKeyStoreSuccessRate", 1, 1); // success - // Create a new GCM Key Store instance. CreateKeyStore(); @@ -360,11 +326,6 @@ ASSERT_TRUE(read_key); EXPECT_GT(read_auth_secret.size(), 0u); - - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.InitKeyStoreSuccessRate", 1, 2); // success - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.LoadKeyStoreSuccessRate", 1, 2); // success } TEST_F(GCMKeyStoreTest, CreateAndRemoveKeys) { @@ -402,9 +363,6 @@ base::RunLoop().RunUntilIdle(); - histogram_tester()->ExpectBucketCount( - "GCM.Crypto.RemoveKeySuccessRate", 1, 1); // success - { base::RunLoop run_loop; gcm_key_store()->GetKeys( @@ -453,9 +411,6 @@ base::RunLoop().RunUntilIdle(); - histogram_tester()->ExpectBucketCount("GCM.Crypto.RemoveKeySuccessRate", 1, - 1); // success - ECPrivateKeyUniquePtr key_after_idle; std::string auth_secret_after_idle; gcm_key_store()->GetKeys( @@ -534,9 +489,6 @@ base::RunLoop().RunUntilIdle(); - histogram_tester()->ExpectBucketCount("GCM.Crypto.RemoveKeySuccessRate", 1, - 1); // success - gcm_key_store()->GetKeys( kFakeAppId, kFakeAuthorizedEntity, false /* fallback_to_empty_authorized_entity */, @@ -697,9 +649,6 @@ } TEST_F(GCMKeyStoreTest, TestUpgradePathForKeyStorageDeprecation) { - // Expect Upgrade count to be 0. - histogram_tester()->ExpectTotalCount("GCM.Crypto.GCMDatabaseUpgradeResult", - 0); // Initialize GCM store and the underlying levelDB database by trying // to fetch keys. ECPrivateKeyUniquePtr key; @@ -715,8 +664,6 @@ run_loop.Run(); } ASSERT_FALSE(key); - histogram_tester()->ExpectTotalCount("GCM.Crypto.GCMDatabaseUpgradeResult", - 0); // Add old format Encryption Data. ASSERT_NO_FATAL_FAILURE(AddOldFormatEncryptionDataToKeyStoreDatabase( @@ -737,8 +684,6 @@ run_loop.Run(); } - histogram_tester()->ExpectBucketCount("GCM.Crypto.GCMDatabaseUpgradeResult", - 1, 1); ASSERT_TRUE(key); ASSERT_GT(auth_secret.size(), 0u); @@ -767,9 +712,6 @@ } ASSERT_FALSE(key); ASSERT_EQ(auth_secret.size(), 0u); - // GCMDatabaseUpgradeResult should not have increased. - histogram_tester()->ExpectBucketCount("GCM.Crypto.GCMDatabaseUpgradeResult", - 1, 1); } } // namespace gcm
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index a274e708..cda5d923 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -898,7 +898,8 @@ last_visit_id = AddPageVisit(request.url, request.time, last_visit_id, t, request.hidden, request.visit_source, IsTypedIncrement(t), - opener_visit, request.title) + opener_visit, request.consider_for_ntp_most_visited, + request.title) .second; // Update the segment for this visit. KEYWORD_GENERATED visits should not @@ -1023,7 +1024,8 @@ AddPageVisit(redirects[redirect_index], request.time, last_visit_id, t, request.hidden, request.visit_source, should_increment_typed_count, - redirect_index == 0 ? opener_visit : 0, request.title) + redirect_index == 0 ? opener_visit : 0, + request.consider_for_ntp_most_visited, request.title) .second; if (t & ui::PAGE_TRANSITION_CHAIN_START) { @@ -1221,6 +1223,7 @@ VisitSource visit_source, bool should_increment_typed_count, VisitID opener_visit, + bool consider_for_ntp_most_visited, absl::optional<std::u16string> title, absl::optional<base::TimeDelta> visit_duration, absl::optional<std::string> originator_cache_guid, @@ -1278,8 +1281,9 @@ visit_info.originator_referring_visit = *originator_referring_visit; if (originator_opener_visit.has_value()) visit_info.originator_opener_visit = *originator_opener_visit; - visit_info.is_known_to_sync = is_known_to_sync; + visit_info.is_known_to_sync = is_known_to_sync; + visit_info.consider_for_ntp_most_visited = consider_for_ntp_most_visited; visit_info.visit_id = db_->AddVisit(&visit_info, visit_source); if (visit_info.visit_time < first_recorded_time_) @@ -1510,7 +1514,8 @@ if (!AddPageVisit(url, visit.first, /*referring_visit=*/0, visit.second, /*hidden=*/!ui::PageTransitionIsMainFrame(visit.second), visit_source, IsTypedIncrement(visit.second), - /*opener_visit=*/0) + /*opener_visit=*/0, + /*consider_for_ntp_most_visited=*/true) .first) { return false; } @@ -1552,13 +1557,13 @@ return kInvalidVisitID; } - auto [url_id, visit_id] = - AddPageVisit(url, visit.visit_time, visit.referring_visit, - visit.transition, hidden, VisitSource::SOURCE_SYNCED, - IsTypedIncrement(visit.transition), visit.opener_visit, - title, visit.visit_duration, visit.originator_cache_guid, - visit.originator_visit_id, visit.originator_referring_visit, - visit.originator_opener_visit, visit.is_known_to_sync); + auto [url_id, visit_id] = AddPageVisit( + url, visit.visit_time, visit.referring_visit, visit.transition, hidden, + VisitSource::SOURCE_SYNCED, IsTypedIncrement(visit.transition), + visit.opener_visit, visit.consider_for_ntp_most_visited, title, + visit.visit_duration, visit.originator_cache_guid, + visit.originator_visit_id, visit.originator_referring_visit, + visit.originator_opener_visit, visit.is_known_to_sync); if (visit_id == kInvalidVisitID) { // Adding the page visit failed, do not continue.
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index 5107495..a86245c 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -821,6 +821,7 @@ VisitSource visit_source, bool should_increment_typed_count, VisitID opener_visit, + bool consider_for_ntp_most_visited, absl::optional<std::u16string> title = absl::nullopt, absl::optional<base::TimeDelta> visit_duration = absl::nullopt, absl::optional<std::string> originator_cache_guid = absl::nullopt,
diff --git a/components/history/core/browser/history_backend_db_unittest.cc b/components/history/core/browser/history_backend_db_unittest.cc index 2f3c9ad1..4dc938aa 100644 --- a/components/history/core/browser/history_backend_db_unittest.cc +++ b/components/history/core/browser/history_backend_db_unittest.cc
@@ -2748,6 +2748,64 @@ } } +TEST_F(HistoryBackendDBTest, + MigrateVisitsAddConsiderForNewTabPageMostVisitedColumn) { + ASSERT_NO_FATAL_FAILURE(CreateDBVersion(62)); + + const VisitID visit_id = 1; + const URLID url_id = 2; + const base::Time visit_time(base::Time::Now()); + // visit_id == referring_visit will trigger DCHECK_NE in UpdateVisitRow. + const VisitID referring_visit = 1; + const ui::PageTransition transition = ui::PAGE_TRANSITION_TYPED; + const SegmentID segment_id = 8; + const base::TimeDelta visit_duration(base::Seconds(45)); + + const char kInsertStatement[] = + "INSERT INTO visits " + "(id, url, visit_time, from_visit, transition, segment_id, " + "visit_duration) VALUES (?, ?, ?, ?, ?, ?, ?)"; + + // Open the old version of the DB and make sure the new columns don't exist + // yet. + { + sql::Database db; + ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); + ASSERT_FALSE(db.DoesColumnExist("visits", "consider_for_ntp_most_visited")); + + // Add entry to visits. + sql::Statement s(db.GetUniqueStatement(kInsertStatement)); + s.BindInt64(0, visit_id); + s.BindInt64(1, url_id); + s.BindInt64(2, visit_time.ToDeltaSinceWindowsEpoch().InMicroseconds()); + s.BindInt64(3, referring_visit); + s.BindInt64(4, transition); + s.BindInt64(5, segment_id); + s.BindInt64(6, visit_duration.InMicroseconds()); + + ASSERT_TRUE(s.Run()); + } + + // Re-open the db, triggering migration. + CreateBackendAndDatabase(); + + // The version should have been updated. + ASSERT_GE(HistoryDatabase::GetCurrentVersion(), 63); + + VisitRow visit_row; + db_->GetRowForVisit(visit_id, &visit_row); + EXPECT_FALSE(visit_row.consider_for_ntp_most_visited); + + DeleteBackend(); + + // Open the db manually again and make sure the new columns exist. + { + sql::Database db; + ASSERT_TRUE(db.Open(history_dir_.Append(kHistoryFilename))); + EXPECT_TRUE(db.DoesColumnExist("visits", "consider_for_ntp_most_visited")); + } +} + // ^^^ NEW MIGRATION TESTS GO HERE ^^^ // Preparation for the next DB migration: This test verifies that the test DB
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 1f1f2a9..55fc986 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -539,7 +539,7 @@ GURL("https://google.com/" + base::NumberToString(relative_seconds)), GetRelativeTime(relative_seconds), 0, ui::PageTransition::PAGE_TRANSITION_FIRST, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddContextAnnotationsForVisit(ids.second, {}); } @@ -1406,7 +1406,7 @@ // Visit the url with username, password. backend_->AddPageVisit(url, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_BROWSED, true, false); + false, SOURCE_BROWSED, true, false, true); // Fetch the row information about stripped url from history db. VisitVector visits; @@ -1427,7 +1427,7 @@ // Visit the url after typing it. backend_->AddPageVisit(url, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_BROWSED, true, false); + false, SOURCE_BROWSED, true, false, true); // Ensure both the typed count and visit count are 1. VisitVector visits; @@ -1442,7 +1442,7 @@ url, base::Time::Now(), 0, ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FORWARD_BACK), - false, SOURCE_BROWSED, false, false); + false, SOURCE_BROWSED, false, false, true); // Ensure the typed count is still 1 but the visit count is 2. id = backend_->db()->GetRowForURL(url, &row); @@ -1462,12 +1462,12 @@ // Visit a typed URL with a redirect. backend_->AddPageVisit(url1, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_BROWSED, true, false); + false, SOURCE_BROWSED, true, false, true); backend_->AddPageVisit( url2, base::Time::Now(), 0, ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_CLIENT_REDIRECT), - false, SOURCE_BROWSED, false, false); + false, SOURCE_BROWSED, false, false, true); // Ensure the redirected URL does not count as typed. VisitVector visits; @@ -1483,7 +1483,7 @@ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_FORWARD_BACK | ui::PAGE_TRANSITION_CLIENT_REDIRECT), - false, SOURCE_BROWSED, false, false); + false, SOURCE_BROWSED, false, false, true); // Ensure the typed count is still 1 but the visit count is 2. id = backend_->db()->GetRowForURL(url2, &row); @@ -1502,13 +1502,13 @@ // Assume visiting the url from an extension. backend_->AddPageVisit(url, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_EXTENSION, true, false); + false, SOURCE_EXTENSION, true, false, true); // Assume the url is imported from Firefox. backend_->AddPageVisit(url, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_FIREFOX_IMPORTED, true, false); + false, SOURCE_FIREFOX_IMPORTED, true, false, true); // Assume this url is also synced. backend_->AddPageVisit(url, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, - false, SOURCE_SYNCED, true, false); + false, SOURCE_SYNCED, true, false, true); // Fetch the row information about the url from history db. VisitVector visits; @@ -1554,12 +1554,12 @@ // Visit the url with recent time. backend_->AddPageVisit(url, recent_time, 0, ui::PAGE_TRANSITION_TYPED, false, - SOURCE_BROWSED, true, false); + SOURCE_BROWSED, true, false, true); // Add to the url a visit with older time (could be syncing from another // client, etc.). backend_->AddPageVisit(url, older_time, 0, ui::PAGE_TRANSITION_TYPED, false, - SOURCE_SYNCED, true, false); + SOURCE_SYNCED, true, false, true); // Fetch the row information about url from history db. VisitVector visits; @@ -1585,11 +1585,11 @@ // Visit two distinct URLs, the second one twice. backend_->AddPageVisit(url1, base::Time::Now(), 0, ui::PAGE_TRANSITION_LINK, - false, SOURCE_BROWSED, false, false); + false, SOURCE_BROWSED, false, false, true); for (int i = 0; i < 2; ++i) { backend_->AddPageVisit(url2, base::Time::Now(), 0, ui::PAGE_TRANSITION_TYPED, false, SOURCE_BROWSED, - true, false); + true, false, true); } URLRow stored_row1, stored_row2; @@ -1652,6 +1652,46 @@ EXPECT_EQ(SOURCE_SYNCED, visit_sources.begin()->second); } +TEST_F(HistoryBackendTest, AddPageArgsConsiderForNewTabPageMostVisited) { + ASSERT_TRUE(backend_.get()); + + GURL url("http://testpageargs.com"); + + // Request with `consider_for_ntp_most_visited` as true. + HistoryAddPageArgs request1( + url, base::Time::Now() - base::Days(2), 0, 0, GURL(), RedirectList(), + ui::PAGE_TRANSITION_KEYWORD_GENERATED, false, SOURCE_BROWSED, false, + /* consider_for_ntp_most_visited */ true); + backend_->AddPage(request1); + + // Request with `consider_for_ntp_most_visited` as false. + HistoryAddPageArgs request2(url, base::Time::Now() - base::Days(1), 0, 0, + GURL(), RedirectList(), ui::PAGE_TRANSITION_LINK, + false, SOURCE_SYNCED, false, + /* consider_for_ntp_most_visited */ false); + backend_->AddPage(request2); + + // Request with `consider_for_ntp_most_visited` as true. + HistoryAddPageArgs request3(url, base::Time::Now(), 0, 0, GURL(), + RedirectList(), ui::PAGE_TRANSITION_TYPED, false, + SOURCE_BROWSED, false, + /* consider_for_ntp_most_visited */ true); + backend_->AddPage(request3); + + // Three visits should be added. + VisitVector visits; + URLRow row; + URLID id = backend_->db()->GetRowForURL(url, &row); + + ASSERT_TRUE(backend_->db()->GetVisitsForURL(id, &visits)); + ASSERT_EQ(3U, visits.size()); + + // Assert consider_for_ntp_most_visited is correctly set for the visits. + EXPECT_EQ(visits[0].consider_for_ntp_most_visited, true); + EXPECT_EQ(visits[1].consider_for_ntp_most_visited, false); + EXPECT_EQ(visits[2].consider_for_ntp_most_visited, true); +} + TEST_F(HistoryBackendTest, AddContentModelAnnotationsWithNoEntryInVisitTable) { ASSERT_TRUE(backend_.get()); @@ -2797,22 +2837,22 @@ backend_->AddPageVisit(GURL("http://cnn.com/intl"), yesterday, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddPageVisit(GURL("http://cnn.com/us"), last_week, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddPageVisit(GURL("http://cnn.com/ny"), now, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddPageVisit(GURL("https://cnn.com/intl"), yesterday, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddPageVisit(GURL("http://cnn.com:8080/path"), yesterday, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); backend_->AddPageVisit(GURL("http://dogtopia.com/pups?q=poods"), now, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); std::set<GURL> origins; origins.insert(GURL("http://cnn.com/")); @@ -2826,7 +2866,7 @@ origins.insert(GURL("http://notpresent.com/")); backend_->AddPageVisit(GURL("http://cnn.com/"), tomorrow, 0, ui::PAGE_TRANSITION_LINK, false, SOURCE_BROWSED, false, - false); + false, true); EXPECT_THAT( backend_->GetCountsAndLastVisitForOrigins(origins), @@ -3815,7 +3855,7 @@ ui::PAGE_TRANSITION_CHAIN_START | ui::PAGE_TRANSITION_CHAIN_END), /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/true, - /*opener_visit=*/0); + /*opener_visit=*/0, /*consider_for_ntp_most_visited=*/true); }; const auto delete_url = [&](URLID id) { backend_->db_->DeleteURLRow(id); }; @@ -3909,7 +3949,7 @@ ui::PAGE_TRANSITION_CHAIN_START | ui::PAGE_TRANSITION_CHAIN_END), /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/true, - /*opener_visit=*/0); + /*opener_visit=*/0, /*consider_for_ntp_most_visited=*/true); // Add context annotations with non-default values for all fields. VisitContextAnnotations annotations_in; @@ -4358,9 +4398,9 @@ ui::PAGE_TRANSITION_TYPED | ui::PAGE_TRANSITION_CHAIN_END | (is_redirect ? ui::PageTransition::PAGE_TRANSITION_IS_REDIRECT_MASK : ui::PageTransition::PAGE_TRANSITION_CHAIN_START)); - auto ids = backend_->AddPageVisit(GURL(url), last_visit_time, - referring_visit, transition, false, - SOURCE_BROWSED, false, opener_visit); + auto ids = backend_->AddPageVisit( + GURL(url), last_visit_time, referring_visit, transition, false, + SOURCE_BROWSED, false, opener_visit, true); backend_->AddContextAnnotationsForVisit(ids.second, VisitContextAnnotations()); }; @@ -4456,7 +4496,7 @@ auto url_and_visit_id = backend_->AddPageVisit(GURL(urls[i]), visit_time, referring_visit, ui::PageTransitionFromInt(transition), false, - SOURCE_BROWSED, false, 0); + SOURCE_BROWSED, false, 0, true); ids.push_back(url_and_visit_id.second); referring_visit = url_and_visit_id.second; @@ -4581,7 +4621,8 @@ /*referring_visit=*/kInvalidVisitID, kLink, /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/false, - /*opener_visit=*/kInvalidVisitID) + /*opener_visit=*/kInvalidVisitID, + /*consider_for_ntp_most_visited=*/true) .second; task_environment_.FastForwardBy(base::Seconds(1)); @@ -4603,7 +4644,8 @@ /*referring_visit=*/kInvalidVisitID, kLink, /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/false, - /*opener_visit=*/kInvalidVisitID) + /*opener_visit=*/kInvalidVisitID, + /*consider_for_ntp_most_visited=*/true) .second; task_environment_.FastForwardBy(base::Seconds(1)); @@ -4777,7 +4819,8 @@ /*referring_visit=*/kInvalidVisitID, kLink, /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/false, - /*opener_visit=*/kInvalidVisitID) + /*opener_visit=*/kInvalidVisitID, + /*consider_for_ntp_most_visited=*/true) .second; task_environment_.FastForwardBy(base::Seconds(1)); @@ -4789,7 +4832,8 @@ /*referring_visit=*/kInvalidVisitID, kLink, /*hidden=*/false, SOURCE_BROWSED, /*should_increment_typed_count=*/false, - /*opener_visit=*/kInvalidVisitID) + /*opener_visit=*/kInvalidVisitID, + /*consider_for_ntp_most_visited=*/true) .second; backend_->MarkVisitAsKnownToSync(local_visit_id2);
diff --git a/components/history/core/browser/history_database.cc b/components/history/core/browser/history_database.cc index 4bb98bf7..726227bd 100644 --- a/components/history/core/browser/history_database.cc +++ b/components/history/core/browser/history_database.cc
@@ -39,7 +39,7 @@ // Current version number. We write databases at the "current" version number, // but any previous version that can read the "compatible" one can make do with // our database without *too* many bad effects. -const int kCurrentVersionNumber = 62; +const int kCurrentVersionNumber = 63; const int kCompatibleVersionNumber = 16; const char kEarlyExpirationThresholdKey[] = "early_expiration_threshold"; @@ -929,6 +929,15 @@ std::ignore = meta_table_.SetVersionNumber(cur_version); } + if (cur_version == 62) { + if (!MigrateVisitsAddConsiderForNewTabPageMostVisitedColumn()) { + return LogMigrationFailure(62); + } + cur_version++; + // TODO(crbug.com/1414092): Handle failure instead of ignoring it. + std::ignore = meta_table_.SetVersionNumber(cur_version); + } + // ========================= ^^ new migration code goes here ^^ // ADDING NEW MIGRATION CODE // =========================
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index e20d7db9..67f1ec3 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -26,6 +26,7 @@ #include "base/location.h" #include "base/logging.h" #include "base/memory/ref_counted.h" +#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/observer_list.h" #include "base/sequence_checker.h" @@ -63,6 +64,17 @@ namespace history { +// These values are logged to UMA. Entries should not be renumbered and +// numeric values should never be reused. Please keep in sync with +// "PageTransitionForVisitedLinks" in tools/metrics/histograms/enums.xml. +enum class PageTransitionForVisitedLinks { + kOther = 0, // the catch-all bucket for other transitions. + kLink = 1, // corresponds to PAGE_TRANSITION_LINK. + kTyped = 2, // corresponds to PAGE_TRANSITION_TYPED. + kManualSubframe = 3, // corresponds to PAGE_TRANSITION_MANUAL_SUBFRAME. + kMaxValue = kManualSubframe, +}; + // Sends messages from the backend to us on the main thread. This must be a // separate class from the history service so that it can hold a reference to // the history service (otherwise we would have to manually AddRef and @@ -564,6 +576,7 @@ } else { visit_delegate_->AddURL(add_page_args.url); } + LogTransitionMetricsForVisit(add_page_args.transition); } // In extremely rare cases an in-flight clear history task posted to the UI @@ -723,8 +736,12 @@ return; // Inform VisitDelegate of the URL. - if (visit_delegate_) + if (visit_delegate_) { visit_delegate_->AddURL(url); + // This visit will always be a LINK PageTransition type. See function + // comment for more info. + LogTransitionMetricsForVisit(ui::PageTransition::PAGE_TRANSITION_LINK); + } URLRow row(url); row.set_title(title); @@ -754,6 +771,9 @@ for (const auto& row : info) urls.push_back(row.url()); visit_delegate_->AddURLs(urls); + // This visit will always be a LINK PageTransition type. See function + // comment for more info. + LogTransitionMetricsForVisit(ui::PageTransition::PAGE_TRANSITION_LINK); } ScheduleTask(PRIORITY_NORMAL, @@ -1674,4 +1694,36 @@ return history_client_->GetThreadSafeCanAddURLCallback().Run(url); } +void HistoryService::LogTransitionMetricsForVisit( + ui::PageTransition transition) { + // A generic measure of whether the visits are coming from the main frame or a + // subframe. + base::UmaHistogramBoolean("History.VisitedLinks.VisitLoggedFromMainFrame", + ui::PageTransitionIsMainFrame(transition)); + // A metric which records whether a visit matches one of the + // ui::PageTransition types of interest: link, typed, or manual subframe. + // Otherwise, it is recorded as "other". + switch (ui::PageTransitionStripQualifier(transition)) { + case ui::PageTransition::PAGE_TRANSITION_LINK: + base::UmaHistogramEnumeration( + "History.VisitedLinks.VisitLoggedFromTransition", + PageTransitionForVisitedLinks::kLink); + break; + case ui::PageTransition::PAGE_TRANSITION_TYPED: + base::UmaHistogramEnumeration( + "History.VisitedLinks.VisitLoggedFromTransition", + PageTransitionForVisitedLinks::kTyped); + break; + case ui::PageTransition::PAGE_TRANSITION_MANUAL_SUBFRAME: + base::UmaHistogramEnumeration( + "History.VisitedLinks.VisitLoggedFromTransition", + PageTransitionForVisitedLinks::kManualSubframe); + break; + default: + base::UmaHistogramEnumeration( + "History.VisitedLinks.VisitLoggedFromTransition", + PageTransitionForVisitedLinks::kOther); + } +} + } // namespace history
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index 0166790..1b23da1 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -1059,6 +1059,10 @@ // HistoryClient::GetCanAddURLCallback(). bool CanAddURL(const GURL& url); + // A helper function that records UMA metrics on the PageTransition type of + // each visit added to the VisitedLinks hashtable. + void LogTransitionMetricsForVisit(ui::PageTransition transition); + SEQUENCE_CHECKER(sequence_checker_); // The TaskRunner to which HistoryBackend tasks are posted. Nullptr once
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index caa97b54..8ca5631 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -134,6 +134,12 @@ // same tab. VisitID opener_visit = kInvalidVisitID; + // Specifies whether a navigation should contribute to the Most Visited tiles + // in the New Tab Page. Note that setting this to true (most common case) + // doesn't guarantee it's relevant for Most Visited, since other requirements + // exist (e.g. certain page transition types). + bool consider_for_ntp_most_visited = true; + // These are set only for synced visits originating from a different machine. // `originator_cache_guid` is the originator machine's unique client ID. It's // called a "cache" just to match Chrome Sync's terminology.
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 9cdd157e..3dc581b 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -88,9 +88,19 @@ return bounds; } +// Transition IDs are from possibly-corrupt databases or incorrect IDs due to +// version skew. Where `transition` isn't valid we fall back on +// PAGE_TRANSITION_LINK. +ui::PageTransition PageTransitionFromIntWithFallback(int32_t transition) { + return ui::IsValidPageTransitionType(transition) + ? ui::PageTransitionFromInt(transition) + : ui::PAGE_TRANSITION_LINK; +} + // Is the transition user-visible. bool TransitionIsVisible(int32_t transition) { - ui::PageTransition page_transition = ui::PageTransitionFromInt(transition); + const ui ::PageTransition page_transition = + PageTransitionFromIntWithFallback(transition); return (ui::PAGE_TRANSITION_CHAIN_END & transition) != 0 && ui::PageTransitionIsMainFrame(page_transition) && !ui::PageTransitionCoreTypeIs(page_transition, @@ -173,8 +183,15 @@ // Set to true for visits known to Chrome Sync, which can be: // 1. Remote visits that have been synced to the local machine. // 2. Local visits that have been sent to Sync. - "is_known_to_sync BOOLEAN DEFAULT FALSE NOT NULL)")) + "is_known_to_sync BOOLEAN DEFAULT FALSE NOT NULL," + // Specifies whether a navigation should contribute to the Most + // Visited tiles in the New Tab Page. Note that setting this to true + // (most common case) doesn't guarantee it's relevant for Most + // Visited, since other requirements exist (e.g. certain page + // transition types). + "consider_for_ntp_most_visited BOOLEAN DEFAULT FALSE NOT NULL)")) { return false; + } } // Visit source table contains the source information for all the visits. To @@ -233,7 +250,7 @@ visit->url_id = statement.ColumnInt64(1); visit->visit_time = statement.ColumnTime(2); visit->referring_visit = statement.ColumnInt64(3); - visit->transition = ui::PageTransitionFromInt(statement.ColumnInt(4)); + visit->transition = PageTransitionFromIntWithFallback(statement.ColumnInt(4)); visit->segment_id = statement.ColumnInt64(5); visit->visit_duration = statement.ColumnTimeDelta(6); visit->incremented_omnibox_typed_score = statement.ColumnBool(7); @@ -243,6 +260,7 @@ visit->originator_referring_visit = statement.ColumnInt64(11); visit->originator_opener_visit = statement.ColumnInt64(12); visit->is_known_to_sync = statement.ColumnBool(13); + visit->consider_for_ntp_most_visited = statement.ColumnBool(14); } // static @@ -304,8 +322,8 @@ "(url, visit_time, from_visit, transition, segment_id, " "visit_duration, incremented_omnibox_typed_score, opener_visit," "originator_cache_guid,originator_visit_id,originator_from_visit," - "originator_opener_visit,is_known_to_sync) " - "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")); + "originator_opener_visit,is_known_to_sync,consider_for_ntp_most_visited) " + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)")); // Although some columns are NULLable, we never write NULL. We write 0 or "" // instead for simplicity. See the CREATE TABLE comments for details. statement.BindInt64(0, visit->url_id); @@ -321,6 +339,7 @@ statement.BindInt64(10, visit->originator_referring_visit); statement.BindInt64(11, visit->originator_opener_visit); statement.BindBool(12, visit->is_known_to_sync); + statement.BindBool(13, visit->consider_for_ntp_most_visited); if (!statement.Run()) { DVLOG(0) << "Failed to execute visit insert statement: " @@ -445,7 +464,8 @@ "UPDATE visits SET " "url=?,visit_time=?,from_visit=?,transition=?,segment_id=?," "visit_duration=?,incremented_omnibox_typed_score=?,opener_visit=?," - "originator_cache_guid=?,originator_visit_id=?,is_known_to_sync=? " + "originator_cache_guid=?,originator_visit_id=?,is_known_to_sync=?," + "consider_for_ntp_most_visited=? " "WHERE id=?")); // Although some columns are NULLable, we never write NULL. We write 0 or "" // instead for simplicity. See the CREATE TABLE comments for details. @@ -460,7 +480,8 @@ statement.BindString(8, visit.originator_cache_guid); statement.BindInt64(9, visit.originator_visit_id); statement.BindInt64(10, visit.is_known_to_sync); - statement.BindInt64(11, visit.visit_id); + statement.BindInt64(11, visit.consider_for_ntp_most_visited); + statement.BindInt64(12, visit.visit_id); return statement.Run(); } @@ -836,7 +857,7 @@ while (statement.Step()) { if (ui::PageTransitionIsMainFrame( - ui::PageTransitionFromInt(statement.ColumnInt(1)))) { + PageTransitionFromIntWithFallback(statement.ColumnInt(1)))) { *last_visit = statement.ColumnTime(0); return true; } @@ -1119,7 +1140,7 @@ row.url_id = read.ColumnInt64(1); row.visit_time = read.ColumnTime(2); row.referring_visit = read.ColumnInt64(3); - row.transition = ui::PageTransitionFromInt(read.ColumnInt(4)); + row.transition = PageTransitionFromIntWithFallback(read.ColumnInt(4)); row.segment_id = read.ColumnInt64(5); row.visit_duration = read.ColumnTimeDelta(6); // Check if the visit row is in an invalid state and if it is then @@ -1340,4 +1361,21 @@ return true; } +bool VisitDatabase::MigrateVisitsAddConsiderForNewTabPageMostVisitedColumn() { + if (!GetDB().DoesTableExist("visits")) { + NOTREACHED() << " Visits table should exist before migration"; + return false; + } + + if (!GetDB().DoesColumnExist("visits", "consider_for_ntp_most_visited")) { + if (!GetDB().Execute("ALTER TABLE visits " + "ADD COLUMN consider_for_ntp_most_visited " + "BOOLEAN DEFAULT FALSE NOT NULL")) { + return false; + } + } + + return true; +} + } // namespace history
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h index 5ea0d8a..8e51ef7 100644 --- a/components/history/core/browser/visit_database.h +++ b/components/history/core/browser/visit_database.h
@@ -334,6 +334,10 @@ // Called by the derived classes to migrate the older visits table which // doesn't have the `is_known_to_sync` column. bool MigrateVisitsAddIsKnownToSyncColumn(); + + // Called by the derived classes to migrate the older visits table which + // doesn't have the `consider_for_ntp_most_visited` column. + bool MigrateVisitsAddConsiderForNewTabPageMostVisitedColumn(); }; // Columns, in order, of the visit table. @@ -341,7 +345,7 @@ " id,url,visit_time,from_visit,transition,segment_id,visit_duration," \ "incremented_omnibox_typed_score,opener_visit,originator_cache_guid," \ "originator_visit_id,originator_from_visit,originator_opener_visit," \ - "is_known_to_sync " + "is_known_to_sync,consider_for_ntp_most_visited " } // namespace history
diff --git a/components/history/core/browser/visit_database_unittest.cc b/components/history/core/browser/visit_database_unittest.cc index f028f1c..9b17b32 100644 --- a/components/history/core/browser/visit_database_unittest.cc +++ b/components/history/core/browser/visit_database_unittest.cc
@@ -35,7 +35,8 @@ b.transition) && a.originator_cache_guid == b.originator_cache_guid && a.originator_visit_id == b.originator_visit_id && - a.is_known_to_sync == b.is_known_to_sync; + a.is_known_to_sync == b.is_known_to_sync && + a.consider_for_ntp_most_visited == b.consider_for_ntp_most_visited; } } // namespace
diff --git a/components/metrics/metrics_switches.cc b/components/metrics/metrics_switches.cc index 6cdfcf47..e3f1f266 100644 --- a/components/metrics/metrics_switches.cc +++ b/components/metrics/metrics_switches.cc
@@ -21,6 +21,11 @@ // will send data to servers. const char kForceEnableMetricsReporting[] = "force-enable-metrics-reporting"; +// Forces MSBB setting to be on for UKM recording. Should only be used in +// automated testing browser sessions in which it is infeasible or impractical +// to toggle the setting manually. +const char kForceMsbbSettingOnForUkm[] = "force-msbb-setting-on-for-ukm"; + // Enables the recording of metrics reports but disables reporting. In contrast // to kForceEnableMetricsReporting, this executes all the code that a normal // client would use for reporting, except the report is dropped rather than sent @@ -62,6 +67,11 @@ switches::kForceEnableMetricsReporting); } +bool IsMsbbSettingForcedOnForUkm() { + return base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kForceMsbbSettingOnForUkm); +} + void EnableMetricsRecordingOnlyForTesting(base::CommandLine* command_line) { DCHECK(command_line != nullptr); if (!command_line->HasSwitch(switches::kMetricsRecordingOnly))
diff --git a/components/metrics/metrics_switches.h b/components/metrics/metrics_switches.h index 79d84e2..80b9187c 100644 --- a/components/metrics/metrics_switches.h +++ b/components/metrics/metrics_switches.h
@@ -32,6 +32,10 @@ // current process. bool IsMetricsReportingForceEnabled(); +// Returns true if kForceMsbbSettingOnForUkm is on the command line for the +// current process. +bool IsMsbbSettingForcedOnForUkm(); + // Adds kMetricsRecordingOnly to |command_line| if not already present. void EnableMetricsRecordingOnlyForTesting( base::CommandLine* command_line = base::CommandLine::ForCurrentProcess());
diff --git a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc index 12b514b3..f6e17fd 100644 --- a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc +++ b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
@@ -593,12 +593,6 @@ 0); } -// This test is disabled since it's lacking the ability of mocking store failure -// in store_test_utils. https://crbug.com/781023 -// TODO(romax): reenable the test once the above issue is resolved. -TEST_F(OfflinePageModelTaskifiedTest, - DISABLED_SavePageOfflineCreationStoreWriteFailure) {} - TEST_F(OfflinePageModelTaskifiedTest, SavePageLocalFileFailed) { SavePageWithExpectedResult(GURL("file:///foo"), kTestClientId1, GURL("http://other.page.com"), kEmptyRequestOrigin, @@ -791,29 +785,6 @@ 0, 1); } -// TODO(romax): remove these 'indicators for newly added tests' when migration -// is done. -// This test case is covered by DeletePageTaskTest::DeletePagesBy*. -TEST_F(OfflinePageModelTaskifiedTest, DISABLED_DeletePageSuccessful) {} - -// This test case is covered by DeletePageTaskTest::DeletePagesByUrlPredicate. -TEST_F(OfflinePageModelTaskifiedTest, - DISABLED_DeleteCachedPageByPredicateUserRequested) {} - -// This test case is renamed to DeletePagesByUrlPredicate. -TEST_F(OfflinePageModelTaskifiedTest, DISABLED_DeleteCachedPageByPredicate) {} - -// This test case is covered by DeletePageTaskTest::DeletePagesBy*NotFound. -TEST_F(OfflinePageModelTaskifiedTest, DISABLED_DeletePageNotFound) {} - -// This test case is covered by -// DeletePageTaskTest::DeletePagesStoreFailureOnRemove. -TEST_F(OfflinePageModelTaskifiedTest, DISABLED_DeletePageStoreFailureOnRemove) { -} - -// This test case is covered by DeletePageTaskTest::DeletePagesBy*. -TEST_F(OfflinePageModelTaskifiedTest, DISABLED_DeleteMultiplePages) {} - // These newly added tests are testing the API instead of results, which // should be covered in DeletePagesTaskTest.
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc index 70fb925..ad0c565 100644 --- a/components/performance_manager/features.cc +++ b/components/performance_manager/features.cc
@@ -27,33 +27,10 @@ "BackgroundTabLoadingFromPerformanceManager", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kHighEfficiencyModeAvailable, - "HighEfficiencyModeAvailable", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kBatterySaverModeAvailable, "BatterySaverModeAvailable", base::FEATURE_ENABLED_BY_DEFAULT); -const base::FeatureParam<base::TimeDelta> kHighEfficiencyModeTimeBeforeDiscard{ - &kHighEfficiencyModeAvailable, "time_before_discard", base::Hours(2)}; - -const base::FeatureParam<bool> kHighEfficiencyModeDefaultState{ - &kHighEfficiencyModeAvailable, "default_state", false}; - -// 10 tabs is the 70th percentile of tab counts based on UMA data. -const base::FeatureParam<int> kHighEfficiencyModePromoTabCountThreshold{ - &kHighEfficiencyModeAvailable, - "tab_count_threshold", - 10, -}; - -const base::FeatureParam<int> kHighEfficiencyModePromoMemoryPercentThreshold{ - &kHighEfficiencyModeAvailable, - "memory_percent_threshold", - 70, -}; - BASE_FEATURE(kPerformanceControlsPerformanceSurvey, "PerformanceControlsPerformanceSurvey", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h index ca0f17c..17fdee1 100644 --- a/components/performance_manager/public/features.h +++ b/components/performance_manager/public/features.h
@@ -38,30 +38,11 @@ // directly from Performance Manager rather than via TabLoader. BASE_DECLARE_FEATURE(kBackgroundTabLoadingFromPerformanceManager); -// Make the High-Efficiency or Battery Saver Modes available to users. If this -// is enabled, it doesn't mean the specific Mode is enabled, just that the user -// has the option of toggling it. -BASE_DECLARE_FEATURE(kHighEfficiencyModeAvailable); +// Make the Battery Saver Modes available to users. If this is enabled, it +// doesn't mean the mode is enabled, just that the user has the option of +// toggling it. BASE_DECLARE_FEATURE(kBatterySaverModeAvailable); -// Defines the time in seconds before a background tab is discarded for -// High-Efficiency Mode. -extern const base::FeatureParam<base::TimeDelta> - kHighEfficiencyModeTimeBeforeDiscard; - -// The default state of the high-efficiency mode pref -extern const base::FeatureParam<bool> kHighEfficiencyModeDefaultState; - -// The number of tabs at which the user may be prompted to enable high -// efficiency mode. -extern const base::FeatureParam<int> kHighEfficiencyModePromoTabCountThreshold; - -// The percentage of used memory at which the user may be prompted to enable -// high efficiency mode. For instance, if this parameter is set to 70, the promo -// would be triggered when memory use exceeds 70% of available memory. -extern const base::FeatureParam<int> - kHighEfficiencyModePromoMemoryPercentThreshold; - // Flag to control a baseline HaTS survey for Chrome performance. BASE_DECLARE_FEATURE(kPerformanceControlsPerformanceSurvey); BASE_DECLARE_FEATURE(kPerformanceControlsBatteryPerformanceSurvey);
diff --git a/components/permissions/PERMISSIONS_OWNERS b/components/permissions/PERMISSIONS_OWNERS index 00b50df8..88af11b 100644 --- a/components/permissions/PERMISSIONS_OWNERS +++ b/components/permissions/PERMISSIONS_OWNERS
@@ -1,3 +1,4 @@ +# Use `chromium-permissions-reviews@google.com` for review load balancing. andypaicu@chromium.org dominickn@chromium.org elklm@chromium.org
diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc index b366f3a..48c8b9b 100644 --- a/components/plugins/renderer/webview_plugin.cc +++ b/components/plugins/renderer/webview_plugin.cc
@@ -264,7 +264,7 @@ : plugin_(plugin), agent_group_scheduler_( blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()) { + .CreateWebAgentGroupScheduler()) { web_view_ = WebView::Create( /*client=*/this, /*is_hidden=*/false,
diff --git a/components/policy/BUILD.gn b/components/policy/BUILD.gn index 8b478f9..0d0b5630 100644 --- a/components/policy/BUILD.gn +++ b/components/policy/BUILD.gn
@@ -9,6 +9,7 @@ import("//build/timestamp.gni") import("//build/toolchain/toolchain.gni") import("//components/policy/resources/policy_templates.gni") +import("//components/policy/tools/generate_policy_source.gni") import("//third_party/libprotobuf-mutator/fuzzable_proto_library.gni") import("//third_party/protobuf/proto_library.gni") import("//tools/grit/grit_args.gni") @@ -78,56 +79,14 @@ constants_header_path = "$target_gen_dir/policy_constants.h" constants_source_path = "$target_gen_dir/policy_constants.cc" -app_restrictions_path = "$target_gen_dir/app_restrictions.xml" risk_tag_header_path = "$target_gen_dir/risk_tag.h" policy_templates_deps_file = "$policy_templates_base_dir/policy_templates.d" policy_templates_generated_json_path = "$policy_templates_base_dir/policy_templates.json" -action("policy_code_generate") { - script = "tools/generate_policy_source.py" - chrome_version_abspath = "//chrome/VERSION" - chrome_version_path = rebase_path(chrome_version_abspath, root_build_dir) - - deps = [ ":generate_policy_templates" ] - inputs = [ - chrome_version_abspath, - policy_templates_generated_json_path, - ] - outputs = [ - constants_header_path, - constants_source_path, - chrome_settings_proto_path, - cloud_policy_proto_path, - app_restrictions_path, - risk_tag_header_path, - ] - - if (target_os != "android") { - outputs -= [ app_restrictions_path ] - } - - args = [ - # Input information - "--chrome-version-file=" + chrome_version_path, - "--policy-templates-file=" + - rebase_path(policy_templates_generated_json_path, root_build_dir), - "--target-platform=" + target_os, - - # Output files to be generated - "--policy-constants-header=" + - rebase_path(constants_header_path, root_build_dir), - "--policy-constants-source=" + - rebase_path(constants_source_path, root_build_dir), - "--chrome-settings-protobuf=" + - rebase_path(chrome_settings_proto_path, root_build_dir), - "--cloud-policy-protobuf=" + - rebase_path(cloud_policy_proto_path, root_build_dir), - "--app-restrictions-definition=" + - rebase_path(app_restrictions_path, root_build_dir), - "--risk-tag-header=" + rebase_path(risk_tag_header_path, root_build_dir), - ] +generate_policy_source("policy_code_generate") { + chunking = true } policy_templates_grd_file = "resources/policy_templates.build.grd" @@ -343,7 +302,7 @@ _generated_resources_dir = "$root_gen_dir/chrome/app/policy/android" copy("app_restrictions_resources_copy") { - sources = [ app_restrictions_path ] + sources = [ "$target_gen_dir/app_restrictions.xml" ] outputs = [ "$_generated_resources_dir/xml-v21/app_restrictions.xml" ] deps = [ ":policy_code_generate",
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index c8f78d6..6c14413 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -1167,6 +1167,13 @@ Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, ist die Definition über die Funktion „Schnellinfo“ aktiviert. Wenn die Richtlinie deaktiviert ist, ist die Definition über „Schnellinfo“ deaktiviert.</translation> +<translation id="2095778449451007308">Mit dieser Richtlinie wird festgelegt, ob Nutzer den Nur-HTTPS-Modus („Immer sichere Verbindungen verwenden“) in den Einstellungen aktivieren können. Über den Nur-HTTPS-Modus werden alle Aufrufe von Websites auf HTTPS umgestellt. + Wenn diese Einstellung nicht konfiguriert oder auf „Zugelassen“ festgelegt ist, dürfen Nutzer den Nur-HTTPS-Modus aktivieren. + Ist sie auf „Nicht zugelassen“ festgelegt, dürfen Nutzer den Nur-HTTPS-Modus nicht aktivieren. + Wenn diese Einstellung auf „force_enabled“ gesetzt ist, wird der Nur-HTTPS-Modus aktiviert und Nutzer können ihn nicht deaktivieren. + Die erzwungene Aktivierung des Nur-HTTPS-Modus wird ab M112 unterstützt. + +Die separate Richtlinie „<ph name="HTTP_ALLOWLIST_POLICY_NAME" />“ kann verwendet werden, um bestimmte Hostnamen oder Hostnamenmuster von der Aktualisierung auf HTTPS durch diese Funktion auszuschließen.</translation> <translation id="209586405398070749">Stabiler Kanal</translation> <translation id="2096932573113293941">Nutzer um Erlaubnis zum Ausführen von Plug-ins bitten, die eine Autorisierung erfordern</translation> <translation id="2098658257603918882">Berichte mit Nutzungs- und Absturzdaten erstellen</translation> @@ -7702,11 +7709,6 @@ Weitere Informationen zu Safe Browsing findest du unter https://developers.google.com/safe-browsing.</translation> <translation id="8199823751103472868">Ist diese Richtlinie festgelegt, wird das InScript-Layout für Hindi unter <ph name="PRODUCT_OS_NAME" /> aktiviert. Ist sie auf „false“ gesetzt oder nicht festgelegt, ist das Layout nicht verfügbar.</translation> <translation id="8202834945144737726">Attestierungsablauf <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> für eine Liste von URLs auf dem Anmeldebildschirm aktivieren</translation> -<translation id="8212900161626657849">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, folgt <ph name="PRODUCT_NAME" /> dem standardmäßigen Einführungsprozess für CECPQ2. Das ist ein Post-Quanten-Algorithmus für Schlüsselvereinbarungen in TLS. - - CECPQ2 führt zu größeren TLS-Mitteilungen, wodurch in äußerst seltenen Fällen Fehler in der Netzwerkhardware auftreten können. Während die Netzwerkprobleme behoben werden, kann diese Richtlinie auf „False“ gestellt werden, um CECPQ2 zu deaktivieren. - - Die Richtlinie ist eine vorübergehende Maßnahme. Sie wird aus künftigen Versionen von <ph name="PRODUCT_NAME" /> entfernt.</translation> <translation id="8213770777756919897">Diese Richtlinie ist veraltet und wird in Version 85 von <ph name="PRODUCT_OS_NAME" /> entfernt. Bitte verwende stattdessen die Richtlinie "<ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />". Ist diese Richtlinie konfiguriert, wird damit festgelegt, was <ph name="PRODUCT_OS_NAME" /> tun soll, wenn der Nutzer für die Dauer der Inaktivitätsverzögerung inaktiv bleibt. Diese kann gesondert konfiguriert werden.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 2254ea48..b511f3c 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -7911,11 +7911,6 @@ Obtén más información sobre la Navegación segura ( https://developers.google.com/safe-browsing ).</translation> <translation id="8199823751103472868">Si estableces la política, se habilitará el diseño InScript Hindi para <ph name="PRODUCT_OS_NAME" />. Si la estableces como falsa o no la estableces, el diseño no estará disponible.</translation> <translation id="8202834945144737726">Habilitar el flujo de certificación de <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para ver una lista de las URLs en la pantalla de acceso</translation> -<translation id="8212900161626657849">Si habilitas esta política o no la estableces, <ph name="PRODUCT_NAME" /> seguirá el proceso de lanzamiento predeterminado para CECPQ2, un algoritmo de establecimiento de claves poscuántico de TLS. - - CECPQ2 genera mensajes de TLS más grandes que, en casos muy específicos, pueden producir errores en ciertos hardware de redes. Puedes establecer esta política como falsa para inhabilitar CECPQ2 mientras se resuelven los problemas de redes. - - Esta política es una medida temporal y se quitará en las futuras versiones de <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Ten en cuenta que esta política es obsoleta y se quitará en la versión 85 de <ph name="PRODUCT_OS_NAME" />. En su lugar, utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Cuando se configura esta política, se especifica la acción que realizará<ph name="PRODUCT_OS_NAME" /> si no hay intervención del usuario durante el período de la demora de inactividad, que se puede configurar de forma independiente.
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 1dd08c0a..9527c1f5 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -1172,6 +1172,13 @@ Si se habilita esta política o no se establece, se activará la definición de Respuestas rápidas. Si se inhabilita esta política, se desactivará la definición de Respuestas rápidas.</translation> +<translation id="2095778449451007308">Esta política controla si los usuarios pueden habilitar el modo Solo HTTPS (Usar siempre conexiones seguras) en Configuración. El modo Solo HTTPS cambia todos los accesos a páginas al protocolo HTTPS. + Si esta opción no se establece o se le asigna el valor allowed, los usuarios podrán habilitar el modo Solo HTTPS. + Si se le asigna el valor disallowed, los usuarios no podrán habilitar el modo Solo HTTPS. + Si se le asigna el valor force_enabled, se habilitará el modo Solo HTTPS y los usuarios no podrán inhabilitarlo. + Se puede forzar la habilitación del modo Solo HTTPS a partir de la versión M112. + +La política independiente <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> puede usarse para impedir que esta función cambie a HTTPS algunos nombres de host o patrones de nombre de host concretos.</translation> <translation id="209586405398070749">Canal estable</translation> <translation id="2096932573113293941">Pedir permiso al usuario para ejecutar complementos que requieran autorización</translation> <translation id="2098658257603918882">Habilitar informes de uso y de datos sobre fallos</translation> @@ -7802,11 +7809,6 @@ Consulta más información sobre Navegación segura en https://developers.google.com/safe-browsing.</translation> <translation id="8199823751103472868">Si se establece esta política, se habilitará el diseño InScript para hindi en <ph name="PRODUCT_OS_NAME" />. Si se le asigna el valor false o no se establece, este diseño no estará disponible.</translation> <translation id="8202834945144737726">Habilitar el flujo de atestación de <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para una lista de URLs en la pantalla de inicio de sesión</translation> -<translation id="8212900161626657849">Si esta política no se configura o se habilita, <ph name="PRODUCT_NAME" /> seguirá el proceso de lanzamiento predeterminado para CECPQ2, un algoritmo de acuerdo de claves poscuántico en TLS. - - CECPQ2 genera mensajes de TLS más grandes que, en muy raras ocasiones, pueden producir errores en algún hardware de redes. A esta política se le puede asignar el valor False para inhabilitar CECPQ2 mientras se resuelven los problemas de redes. - - La política es una medida temporal y se quitará en futuras versiones de <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Ten en cuenta que esta política está obsoleta y se eliminará de la versión 85 de <ph name="PRODUCT_OS_NAME" />. Utiliza <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> en su lugar. Cuando se configura esta política, se especifica la acción que realiza <ph name="PRODUCT_OS_NAME" /> cuando el usuario permanece inactivo durante el periodo de tiempo indicado por el retraso de inactividad, que puede configurarse por separado.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 92a879c..3fef6d2 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -7736,11 +7736,6 @@ Pour en savoir plus sur la navigation sécurisée, consultez la page https://developers.google.com/safe-browsing.</translation> <translation id="8199823751103472868">Cette règle permet d'activer la disposition de clavier Hindi Inscript sur <ph name="PRODUCT_OS_NAME" />. Si elle est définie sur "false" ou si elle n'est pas configurée, cette disposition de clavier n'est pas disponible.</translation> <translation id="8202834945144737726">Activer le flux d'attestation <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> pour une liste d'URL sur l'écran de connexion</translation> -<translation id="8212900161626657849">Si cette règle est activée ou si elle n'est pas configurée, <ph name="PRODUCT_NAME" /> suivra le processus de déploiement par défaut pour CECPQ2, un algorithme de clé-contrat post-quantique dans TLS. - - CECPQ2 entraîne une augmentation de la taille des messages TLS, ce qui peut déclencher (dans des cas très rares) des bugs dans certains matériels de mise en réseau. Vous pouvez définir cette règle sur "False" pour désactiver CECPQ2 jusqu'à ce que les problèmes de réseau soient résolus. - - Cette règle est une mesure temporaire qui sera supprimée dans les futures versions de <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Cette règle étant obsolète, elle sera supprimée dans la version 85 de <ph name="PRODUCT_OS_NAME" />. (Veuillez utiliser la règle <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />.) Si cette règle est configurée, <ph name="PRODUCT_OS_NAME" /> met en œuvre l'action à effectuer en cas d'inactivité de l'utilisateur (laquelle peut être définie séparément) au terme du délai d'inactivité de l'utilisateur.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index fdfa66e..a571ecc 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -1187,6 +1187,15 @@ Jika kebijakan ini disetel ke aktif atau tidak disetel, Definisi Jawaban Instan akan diaktifkan. Jika kebijakan ini disetel ke nonaktif, Definisi Jawaban Instan akan dinonaktifkan.</translation> +<translation id="2095778449451007308">Kebijakan ini mengontrol apakah pengguna dapat mengaktifkan Mode Khusus HTTPS (Selalu Gunakan Koneksi Aman) di Setelan. Mode Khusus HTTPS mengupgrade semua navigasi ke HTTPS. + Jika setelan ini tidak disetel atau disetel ke diizinkan, pengguna akan diizinkan mengaktifkan Mode Khusus HTTPS. + Jika setelan ini disetel ke tidak diizinkan, pengguna tidak akan diizinkan mengaktifkan Mode Khusus HTTPS. + Jika setelan ini disetel ke force_enabled, Mode Khusus HTTPS akan diaktifkan dan pengguna tidak akan dapat menonaktifkannya. + Mengaktifkan paksa Mode Khusus HTTPS didukung mulai dari M112 dan seterusnya. + +Kebijakan <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> terpisah +dapat digunakan untuk mengecualikan nama host atau pola nama host tertentu agar tidak +diupgrade ke HTTPS oleh fitur ini.</translation> <translation id="209586405398070749">Saluran stabil</translation> <translation id="2096932573113293941">Minta izin pengguna untuk menjalankan plugin yang memerlukan otorisasi</translation> <translation id="2098658257603918882">Aktifkan laporan data penggunaan dan yang terkait error</translation> @@ -7914,11 +7923,6 @@ Baca selengkapnya tentang Safe Browsing ( https://developers.google.com/safe-browsing ).</translation> <translation id="8199823751103472868">Menyetel kebijakan ini akan mengaktifkan Tata Letak Inscript Hindi di <ph name="PRODUCT_OS_NAME" />. Jika kebijakan ini disetel ke salah (false) atau tidak disetel, tata letak tidak akan tersedia.</translation> <translation id="8202834945144737726">Mengaktifkan alur pengesahan <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> untuk daftar URL di layar login</translation> -<translation id="8212900161626657849">Jika kebijakan ini tidak dikonfigurasi, atau disetel ke aktif, <ph name="PRODUCT_NAME" /> akan mengikuti proses peluncuran default untuk CECPQ2, algoritme perjanjian kunci pasca-kuantum di TLS. - - CECPQ2 menghasilkan pesan TLS yang lebih besar yang, sangat jarang terjadi, dapat memicu bug di beberapa hardware jaringan. Kebijakan ini dapat disetel ke Salah (False) untuk menonaktifkan CECPQ2 saat masalah jaringan diselesaikan. - - Kebijakan ini adalah tindakan sementara dan akan dihapus di <ph name="PRODUCT_NAME" /> versi mendatang.</translation> <translation id="8213770777756919897">Perhatikan bahwa kebijakan ini sudah tidak digunakan lagi dan akan dihapus di <ph name="PRODUCT_OS_NAME" /> versi 85. Sebagai gantinya, gunakan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Jika ditetapkan, kebijakan ini akan menentukan tindakan yang diambil <ph name="PRODUCT_OS_NAME" /> saat pengguna tetap tidak beraktivitas selama durasi waktu yang ditentukan oleh penundaan waktu tidak ada aktivitas, yang dapat dikonfigurasi secara terpisah.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 89032b635..05c14c1 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -1174,6 +1174,13 @@ Se il criterio è attivato o non impostato, la funzionalità di definizione di Risposte rapide sarà attiva. Se il criterio è disattivato, la funzionalità di definizione di Risposte rapide sarà disattivata.</translation> +<translation id="2095778449451007308">Questo criterio consente di stabilire se gli utenti possono attivare o meno la modalità solo HTTPS (Utilizza sempre connessioni sicure) nelle Impostazioni. La modalità solo HTTPS esegue l'upgrade di tutte le navigazioni ad HTTPS. + Se questa impostazione non viene configurata o se viene impostata su allowed, gli utenti potranno attivare la modalità solo HTTPS. + Se viene impostata su disallowed, gli utenti non potranno attivare la modalità solo HTTPS. + Se viene impostata su force_enabled, la modalità solo HTTPS verrà attivata e gli utenti non potranno disattivarla. + L'attivazione forzata della modalità solo HTTPS è supportata a partire dalla versione M112. + +Il criterio <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> separato può essere utilizzato per escludere determinati nomi host o pattern dei nomi host dall'upgrade ad HTTPS da parte di questa funzionalità.</translation> <translation id="209586405398070749">Canale stabile</translation> <translation id="2096932573113293941">Chiedi all'utente l'autorizzazione a eseguire plug-in che la richiedono</translation> <translation id="2098658257603918882">Attiva rapporti sull'utilizzo e sui dati relativi agli arresti anomali</translation> @@ -7737,11 +7744,6 @@ Ulteriori informazioni su Navigazione sicura (https://developers.google.com/safe-browsing).</translation> <translation id="8199823751103472868">Se il criterio viene impostato, viene attivato il layout Hindi Inscript su <ph name="PRODUCT_OS_NAME" />. Se viene impostato su False o se non viene configurato, il layout non è disponibile.</translation> <translation id="8202834945144737726">Attiva il flusso di attestazione <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> per un elenco di URL nella schermata di accesso</translation> -<translation id="8212900161626657849">Se questo criterio non viene configurato o se viene impostato su Attivato, <ph name="PRODUCT_NAME" /> seguirà la procedura di lancio predefinita di CECPQ2, un algoritmo di scambio di chiavi post-quantistico di TLS. - - CECPQ2 comporta la generazione di messaggi TLS di dimensioni maggiori che, in rarissimi casi, potrebbero attivare bug in alcuni componenti hardware di rete. Questo criterio può essere impostato su Falso per disattivare ECPQ2 durante la risoluzione dei problemi di rete. - - Questo criterio è una misura temporanea e verrà rimosso nelle future versioni di <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Tieni presente che questo criterio è obsoleto e verrà rimosso nella versione 85 di <ph name="PRODUCT_OS_NAME" />. Usa il criterio <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Se viene impostato, questo criterio specifica l'azione compiuta da <ph name="PRODUCT_OS_NAME" /> quando l'utente rimane inattivo per il periodo di tempo indicato dal ritardo di inattività, che può essere configurato separatamente.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 891b7b9..497893c 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -1143,6 +1143,13 @@ このポリシーを有効にした場合、または設定しない場合、クイック アンサーの定義が有効になります。 このポリシーを無効にした場合、クイック アンサーの定義が無効になります。</translation> +<translation id="2095778449451007308">このポリシーでは、ユーザーが [設定] で HTTPS 専用モード(常に安全な接続を使用する)を有効にできるかどうかを管理します。HTTPS 専用モードでは、移動先がすべて HTTPS にアップグレードされます。 + 未設定のままにした場合や [allowed(許可する)] に設定した場合、ユーザーは HTTPS 専用モードを有効にできます。 + [disallowed(許可しない)] に設定した場合、ユーザーは HTTPS 専用モードを有効にできません。 + [force_enabled(強制的に有効にする)] に設定した場合、HTTPS 専用モードが有効になり、ユーザーはこのモードを無効にできません。 + HTTPS 専用モードの強制的な有効化は、M112 以降でサポートされます。 + +<ph name="HTTP_ALLOWLIST_POLICY_NAME" /> ポリシーを別途設定して、この機能による HTTPS へのアップグレードを特定のホスト名またはホスト名のパターンに適用しないよう指定できます。</translation> <translation id="209586405398070749">Stable チャンネル</translation> <translation id="2096932573113293941">承認を必要とするプラグインの実行許可をユーザーに求める</translation> <translation id="2098658257603918882">使用状況とクラッシュ関連データのレポートを有効にする</translation> @@ -7345,11 +7352,6 @@ セーフ ブラウジングについて詳しくは、https://developers.google.com/safe-browsing をご覧ください。</translation> <translation id="8199823751103472868">このポリシーを設定した場合、<ph name="PRODUCT_OS_NAME" /> でヒンディー語(字母)レイアウトが有効になります。false に設定するか未設定のままにした場合、このレイアウトは使用できません。</translation> <translation id="8202834945144737726">ログイン画面で <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> の認証フローを有効にする URL のリストを指定する</translation> -<translation id="8212900161626657849">このポリシーを設定しない場合または有効に設定した場合、<ph name="PRODUCT_NAME" /> ではデフォルトのプロセスで CECPQ2(TLS のポスト量子鍵交換アルゴリズム)が導入されます。 - - 大きい TLS メッセージの場合はまれに、CECPQ2 により一部のネットワーキング ハードウェアに問題が生じる場合があります。ネットワーキングの問題を解決している間、このポリシーを False に設定して、CECPQ2 を無効にできます。 - - このポリシーは一時的なもので、今後リリースされるバージョン <ph name="PRODUCT_NAME" /> で削除される予定です。</translation> <translation id="8213770777756919897">このポリシーはサポートが終了しており、<ph name="PRODUCT_OS_NAME" /> バージョン 85 で削除されます。代わりに <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> を使用してください。 このポリシーを設定した場合は、アイドル状態になってから一定の時間(アイドル待ちとして指定された時間)が経過すると、<ph name="PRODUCT_OS_NAME" /> で指定の操作が行われます。アイドル待ちの時間は別途設定できます。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 281a10ae..a2e3da14 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -1173,6 +1173,13 @@ 정책을 사용 설정하거나 설정하지 않으면 빠른 답변 정의가 사용 설정됩니다. 정책을 사용 중지하면 빠른 답변 정의가 사용 중지됩니다.</translation> +<translation id="2095778449451007308">이 정책은 사용자가 설정에서 HTTPS 우선 모드(항상 보안 연결 사용)를 사용 설정할 수 있는지 제어합니다. HTTPS 우선 모드는 모든 탐색을 HTTPS로 업그레이드합니다. + 이 설정을 설정하지 않거나 허용됨으로 설정할 경우 사용자는 HTTPS 우선 모드를 사용 설정할 수 있습니다. + 이 설정을 허용되지 않음으로 설정할 경우 사용자는 HTTPS 우선 모드를 사용 설정할 수 없습니다. + 이 설정이 force_enabled로 설정된 경우 HTTPS 우선 모드가 사용 설정되고 사용자가 사용 중지할 수 없습니다. + HTTPS 우선 모드 강제 사용 설정은 M112부터 지원됩니다. + +별도의 <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> 정책을 사용하여 이 기능을 통해 특정 호스트 이름 또는 호스트 이름 패턴이 HTTPS로 업그레이드되지 않도록 제외할 수 있습니다.</translation> <translation id="209586405398070749">정식 채널</translation> <translation id="2096932573113293941">사용자에게 승인이 필요한 플러그인의 실행 허가 요청</translation> <translation id="2098658257603918882">사용 및 비정상 종료 관련 데이터 보고 사용</translation> @@ -7759,11 +7766,6 @@ 세이프 브라우징에 관해 자세히 알아보세요(https://developers.google.com/safe-browsing).</translation> <translation id="8199823751103472868">정책을 설정하면 <ph name="PRODUCT_OS_NAME" />에서 힌디어 인스크립트 레이아웃이 사용 설정됩니다. False로 설정하거나 설정하지 않으면 레이아웃을 사용할 수 없습니다.</translation> <translation id="8202834945144737726">로그인 화면의 URL 목록에 <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> 증명 흐름 사용 설정</translation> -<translation id="8212900161626657849">정책을 구성하지 않거나 사용 설정한 경우 <ph name="PRODUCT_NAME" />은 TLS의 포스트 퀀텀 키 협약 알고리즘인 CECPQ2에 관한 기본 롤아웃 프로세스를 따릅니다. - - CECPQ2를 사용하면 TLS 메시지가 더 커지기 때문에 드물게 일부 네트워킹 하드웨어에서 버그를 유발할 수 있습니다. 정책을 False로 설정하면 네트워킹 문제를 해결하는 중에 CECPQ2를 사용 중지할 수 있습니다. - - 정책은 일시적인 조치로, 향후 <ph name="PRODUCT_NAME" /> 버전에서 삭제될 예정입니다.</translation> <translation id="8213770777756919897">이 정책은 지원이 중단되었으며 <ph name="PRODUCT_OS_NAME" /> 버전 85에서 삭제될 예정입니다. 대신 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> 정책을 사용하세요. 이 정책이 설정되어 있으면 사용자가 유휴 지연 시간으로 지정된 시간 동안 유휴 상태에 있을 때 <ph name="PRODUCT_OS_NAME" />에서 실행할 작업을 지정하며, 유휴 지연 시간은 별도로 설정할 수 있습니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index 7727cc9f..dbd42e5 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -1173,6 +1173,13 @@ Als je het beleid toepast of niet instelt, wordt Definitie van Snelle antwoorden aangezet. Als je het beleid niet toepast, wordt Definitie van Snelle antwoorden uitgezet.</translation> +<translation id="2095778449451007308">Met dit beleid wordt bepaald of gebruikers de modus Alleen HTTPS (Altijd beveiligde verbindingen gebruiken) kunnen aanzetten in de instellingen. Met de modus Alleen HTTPS worden alle navigaties geüpgraded naar HTTPS. + Als deze instelling niet is ingesteld of is ingesteld op Toegestaan, kunnen gebruikers de modus Alleen HTTPS aanzetten. + Als deze instelling is ingesteld op Niet toegestaan, kunnen gebruikers de modus Alleen HTTPS niet aanzetten. + Als deze instelling is ingesteld op force_enabled, wordt de modus Alleen HTTPS aangezet en kunnen gebruikers deze niet uitzetten. + Afdwingen dat de modus Alleen HTTPS wordt aangezet, wordt ondersteund vanaf M112. + +Het afzonderlijke beleid <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> kan worden gebruikt om te voorkomen dat specifieke hostnamen of hostnaampatronen door deze functie worden geüpgraded naar HTTPS.</translation> <translation id="209586405398070749">Stabiel kanaal</translation> <translation id="2096932573113293941">De gebruiker om toestemming vragen om plug-ins uit te voeren waarvoor machtiging is vereist</translation> <translation id="2098658257603918882">Rapportage van gebruiks- en crashgegevens aanzetten</translation> @@ -7701,11 +7708,6 @@ Meer informatie over Safe Browsing ( https://developers.google.com/safe-browsing ).</translation> <translation id="8199823751103472868">Als je het beleid instelt, wordt Hindi InScript-indeling aangezet voor <ph name="PRODUCT_OS_NAME" />. Als het beleid is ingesteld op False of niet is ingesteld, is de indeling niet beschikbaar.</translation> <translation id="8202834945144737726">Het attestproces <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> aanzetten voor een lijst met URL's op het inlogscherm</translation> -<translation id="8212900161626657849">Als je dit beleid toepast of niet instelt, volgt <ph name="PRODUCT_NAME" /> het standaard uitrolproces voor CECPQ2, een algoritme voor post-quantum sleutelovereenkomst in TLS. - - CECPQ2 resulteert in grotere TLS-berichten die in zeer zeldzame gevallen bugs kunnen veroorzaken in bepaalde netwerkhardware. Je kunt dit beleid instellen op False om CECPQ2 uit te zetten terwijl de netwerkproblemen worden opgelost. - - Dit beleid is een tijdelijke maatregel en wordt verwijderd in toekomstige versies van <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Dit beleid is beëindigd en wordt verwijderd in <ph name="PRODUCT_OS_NAME" />-versie 85. Gebruik in plaats daarvan <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Als dit beleid is ingesteld, specificeert het de actie die worden ondernomen door <ph name="PRODUCT_OS_NAME" /> als de gebruiker inactief is gedurende de tijdsduur die is opgegeven door de inactieve vertraging. Dit kan afzonderlijk worden geconfigureerd.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 411364f..2e20307a 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -7905,11 +7905,6 @@ Leia mais sobre o "Navegação segura" (https://developers.google.com/safe-browsing).</translation> <translation id="8199823751103472868">Se a política for definida, o layout de teclado Inscript hindi vai ser ativado no <ph name="PRODUCT_OS_NAME" />. Se ela for "false" ou não for definida, o layout não estará disponível.</translation> <translation id="8202834945144737726">Ativar o fluxo de atestado <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> para uma lista de URLs na tela de login</translation> -<translation id="8212900161626657849">Se esta política não for configurada ou for ativada, o <ph name="PRODUCT_NAME" /> seguirá o processo de lançamento padrão para o CECPQ2, um algoritmo de acordo de chave pós-quântico em TLS. - - O CECPQ2 resulta em mensagens TLS maiores, que, em casos muito raros, podem causar bugs em alguns hardwares de rede. Esta política pode ser definida como "falsa" para desativar o CECPQ2 enquanto problemas de rede são solucionados. - - Ela é uma medida temporária e será removida em versões futuras do <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Esta política está obsoleta e será removida na versão 85 do <ph name="PRODUCT_OS_NAME" />. Por isso, passe a usar <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Quando esta política é definida, ela especifica a ação que o <ph name="PRODUCT_OS_NAME" /> executa quando o usuário permanece inativo pelo período definido pelo tempo de inatividade, que pode ser configurado separadamente.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 25ac3fd..defb0511 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -7751,11 +7751,6 @@ Подробные сведения о Безопасном просмотре можно найти здесь: https://developers.google.com/safe-browsing.</translation> <translation id="8199823751103472868">Если правило настроено, раскладка InScript для хинди в <ph name="PRODUCT_OS_NAME" /> включена. Если правило не настроено или для него задано значение False, раскладка недоступна.</translation> <translation id="8202834945144737726">Включить проверку <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списка URL на экране входа</translation> -<translation id="8212900161626657849">Если правило включено или не настроено, при выпуске CECPQ2 (постквантового алгоритма согласования ключей в TLS) <ph name="PRODUCT_NAME" /> будет следовать процессу по умолчанию. - - Применение CECPQ2 приводит к увеличению размера сообщений TLS. В очень редких случаях это может стать причиной возникновения ошибок в работе некоторого сетевого оборудования. Для правила можно задать значение False, чтобы отключить CECPQ2, пока неполадки в сети не будут устранены. - - Это временное правило, которое будет удалено в одной из следующих версий <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Правило больше не поддерживается и будет удалено из <ph name="PRODUCT_OS_NAME" /> 85. Вместо него используйте следующее: <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Если правило настроено, оно определяет, какое действие выполняет <ph name="PRODUCT_OS_NAME" /> по окончании заданного периода бездействия, значение которого указывается отдельно.
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index 746d4ae..577b89f 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -7713,11 +7713,6 @@ ดูเพิ่มเติมเกี่ยวกับ Google Safe Browsing (https://developers.google.com/safe-browsing)</translation> <translation id="8199823751103472868">การตั้งค่านโยบายจะเปิดใช้เลย์เอาต์แป้นพิมพ์ภาษาฮินดีใน "<ph name="PRODUCT_OS_NAME" />" หากตั้งค่าเป็น "เท็จ" หรือไม่ได้ตั้งค่า เลย์เอาต์จะใช้งานไม่ได้</translation> <translation id="8202834945144737726">เปิดใช้โฟลว์เอกสารรับรองของ <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> สำหรับรายการ URL ในหน้าจอการเข้าสู่ระบบ</translation> -<translation id="8212900161626657849">หากไม่ได้กำหนดค่านโยบายนี้หรือตั้งค่าเป็นเปิดใช้ <ph name="PRODUCT_NAME" /> จะทำตามกระบวนการเปิดตัวเริ่มต้นของ CECPQ2 ซึ่งเป็นอัลกอริทึมข้อตกลงเกี่ยวกับคีย์หลังยุคควอนตัมใน TLS - - CECPQ2 ส่งผลให้ข้อความ TLS มีขนาดใหญ่ขึ้น ในบางกรณีซึ่งพบได้ไม่บ่อยนักอาจกระตุ้นให้เกิดข้อบกพร่องในฮาร์ดแวร์เครือข่ายบางอย่าง คุณตั้งค่านโยบายนี้เป็น "เท็จ" เพื่อปิดใช้ CECPQ2 ได้ในระหว่างแก้ไขปัญหาเครือข่าย - - นโยบายนี้เป็นมาตรการชั่วคราวและจะถูกนำออกใน<ph name="PRODUCT_NAME" /> เวอร์ชันต่อๆ ไป</translation> <translation id="8213770777756919897">โปรดทราบว่าจะมีการเลิกใช้งานและนำนโยบายนี้ออกใน <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 85 โปรดใช้ <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> แทน เมื่อตั้งค่านโยบายนี้ จะมีการระบุการทำงานของ <ph name="PRODUCT_OS_NAME" /> เมื่อผู้ใช้ไม่มีความเคลื่อนไหวนานประมาณหนึ่งตามระยะหน่วงเวลาของการไม่ใช้งาน ซึ่งกำหนดค่าแยกต่างหากได้
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 2dd382d..c04e4798 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -1179,6 +1179,13 @@ Politika etkinleştirilirse veya ayarlanmadan bırakılırsa Bil bakalım tanımı etkinleştirilir. Politika devre dışı bırakılırsa Bil bakalım tanımı devre dışı bırakılır.</translation> +<translation id="2095778449451007308">Bu politika, kullanıcıların Yalnızca HTTPS Modu'nu (Her Zaman Güvenli Bağlantılar Kullan) Ayarlar'da etkinleştirip etkinleştiremeyeceğini kontrol eder. Yalnızca HTTPS Modu, tüm gezinmeleri HTTPS'ye yükseltir. + Bu ayar belirtilmezse veya izin verildi olarak seçilirse kullanıcılar Yalnızca HTTPS Modunu etkinleştirebilir. + Bu ayar izin verilmedi olarak seçilirse kullanıcılar Yalnızca HTTPS Modunu etkinleştiremez. + Bu ayar, force_enabled değerine ayarlanırsa "yalnızca HTTPS modu" etkinleştirilir ve kullanıcılar bu modu devre dışı bırakamaz. + Yalnızca HTTPS modunu etkinleştirmeye zorla seçeneği, M112 ve sonraki sürümlerde desteklenir. + +Belirli ana makine adlarının veya ana makine adı kalıplarının bu özellik tarafından HTTPS'ye yükseltilmesini engellemek için ayrı <ph name="HTTP_ALLOWLIST_POLICY_NAME" /> politikası kullanılabilir.</translation> <translation id="209586405398070749">Mevcut ürün kanalı</translation> <translation id="2096932573113293941">Yetkilendirme gerektiren eklentileri çalıştırmak için kullanıcıdan izin iste</translation> <translation id="2098658257603918882">Kullanım ve kilitlenme ile ilgili verilerin raporlanmasını etkinleştir</translation> @@ -7801,11 +7808,6 @@ Güvenli tarama hakkında daha fazla bilgi edinin (https://developers.google.com/safe-browsing).</translation> <translation id="8199823751103472868">Politika ayarlanırsa <ph name="PRODUCT_OS_NAME" /> işletim sisteminde Hintçe Alfabetik Düzen etkinleştirilir. Politika, yanlış değerine ayarlanır veya ayarlanmadan bırakılırsa bu düzen kullanılamaz.</translation> <translation id="8202834945144737726">Giriş ekranında URL listesi için <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> onay akışını etkinleştir</translation> -<translation id="8212900161626657849">Bu politika yapılandırılmaz veya etkin değerine ayarlanırsa <ph name="PRODUCT_NAME" />, TLS'deki kuantum sonrası anahtar anlaşması algoritması CECPQ2 için varsayılan kullanıma sunma işlemini uygular. - - CECPQ2, çok nadir durumlarda bazı ağ donanımlarında hata oluşmasını tetikleyebilen daha büyük TLS mesajlarına yol açar. Ağ sorunları çözülürken CECPQ2'yi devre dışı bırakmak için bu politika Yanlış değerine ayarlanabilir. - - Bu politika geçici bir çözüm olup gelecekteki <ph name="PRODUCT_NAME" /> sürümlerinden kaldırılacaktır.</translation> <translation id="8213770777756919897">Bu politikanın artık kullanılmadığını ve <ph name="PRODUCT_OS_NAME" /> sürüm 85'te kaldırılacağını unutmayın. Lütfen bunun yerine <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" /> politikasını kullanın. Bu politika ayarlandığında, kullanıcı boşta kalma gecikmesiyle belirtilen süre (ayrı olarak yapılandırılabilir) boyunca boşta kaldığında, <ph name="PRODUCT_OS_NAME" /> tarafından uygulanacak işlemi belirtir.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 4b6b538..78eb3902 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1172,6 +1172,13 @@ Якщо правило ввімкнути або не налаштувати, визначення у швидких відповідях буде ввімкнено. Якщо його вимкнути, цю функцію буде вимкнено.</translation> +<translation id="2095778449451007308">Це правило дає змогу вибрати, чи можуть користувачі вмикати режим HTTPS-Only (Завжди використовувати надійні з’єднання) у налаштуваннях. У цьому режимі весь трафік переходить на HTTPS. + Якщо це правило не налаштувати або ввімкнути, користувачі зможуть вмикати режим HTTPS-Only. + Якщо правило вимкнути, користувачі не зможуть цього робити. + Якщо для цього правила вказати значення force_enabled, режим HTTPS-Only буде ввімкнено за умовчанням, і користувачі не зможуть його вимкнути. + Примусове ввімкнення режиму HTTPS-Only підтримується, починаючи з версії M112. + +Щоб указати список імен хостів або їх шаблонів, для яких не потрібно застосовувати перехід на HTTPS, використовуйте окреме правило <ph name="HTTP_ALLOWLIST_POLICY_NAME" />.</translation> <translation id="209586405398070749">Стабільна версія</translation> <translation id="2096932573113293941">Запитувати в користувача дозвіл на запуск плагінів, які потребують авторизації</translation> <translation id="2098658257603918882">Увімкнути звіти про використання та дані, пов’язані з аварійним завершенням роботи</translation> @@ -7750,11 +7757,6 @@ Докладніше про Безпечний перегляд читайте на сторінці https://developers.google.com/safe-browsing.</translation> <translation id="8199823751103472868">За допомогою цього правила можна ввімкнути розкладку InScript для гінді в <ph name="PRODUCT_OS_NAME" />. Якщо вибрати для правила значення False або не налаштувати його, розкладка буде недоступною.</translation> <translation id="8202834945144737726">Увімкнути засвідчення <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> для списку URL-адрес на екрані входу</translation> -<translation id="8212900161626657849">Якщо це правило не налаштовано або ввімкнено, <ph name="PRODUCT_NAME" /> використовуватиме для CECPQ2 (постквантового алгоритму узгодження ключів у TLS) процес випуску за умовчанням. - - CECPQ2 робить повідомлення TLS більшими. Це інколи може спричиняти помилки в деякому мережевому обладнанні. Щоб вимкнути CECPQ2, доки проблеми з мережею не зникнуть, для цього правила можна вибрати значення False. - - Це правило тимчасове. Його буде вилучено в майбутніх версіях <ph name="PRODUCT_NAME" />.</translation> <translation id="8213770777756919897">Зауважте, що це правило більше не підтримується та буде вилучене в <ph name="PRODUCT_OS_NAME" /> версії 85. Натомість використовуйте правило <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Якщо це правило налаштовано, воно вказує, яку дію виконує <ph name="PRODUCT_OS_NAME" />, коли виникає затримка через неактивність, час якої можна вибрати окремо.
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index d19bdc71..43af88a3 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -7830,11 +7830,6 @@ Xem thêm về dịch vụ Duyệt web an toàn (https://developers.google.com/safe-browsing).</translation> <translation id="8199823751103472868">Nếu bạn đặt chính sách này thì hệ thống sẽ bật bố cục Hindi Inscript trên <ph name="PRODUCT_OS_NAME" />. Nếu bạn đặt chính sách này thành sai hoặc không đặt thì bố cục này sẽ không được áp dụng.</translation> <translation id="8202834945144737726">Bật quy trình chứng thực <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> cho một danh sách URL trên màn hình đăng nhập</translation> -<translation id="8212900161626657849">Nếu bạn không định cấu hình chính sách này hoặc đặt chính sách này thành bật, thì <ph name="PRODUCT_NAME" /> sẽ tuân theo quy trình phát hành mặc định dành cho CECPQ2 (đây là một thuật toán của thỏa thuận về khóa hậu lượng tử trong TLS). - - CECPQ2 sẽ tạo ra các thông báo TLS (Bảo mật tầng truyền tải) ở phạm vi lớn hơn. Trong một số ít trường hợp, thuật toán này có thể gây ra lỗi cho phần cứng kết nối mạng nào đó. Bạn có thể đặt chính sách này thành tắt để vô hiệu hóa thuật toán CECPQ2 trong lúc khắc phục các sự cố kết nối mạng. - - Chính sách này chỉ là biện pháp tạm thời và sẽ bị xóa trong phiên bản <ph name="PRODUCT_NAME" /> trong tương lai.</translation> <translation id="8213770777756919897">Lưu ý rằng chúng tôi không dùng chính sách này nữa và sẽ xóa khỏi <ph name="PRODUCT_OS_NAME" /> phiên bản 85. Thay vào đó, vui lòng sử dụng <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />. Khi bạn đặt, chính sách này sẽ chỉ định hành động mà <ph name="PRODUCT_OS_NAME" /> thực hiện khi người dùng tạm vắng trong khoảng thời gian cho trước theo thời gian chờ khi tạm vắng. Bạn có thể định cấu hình riêng biệt khoảng thời gian này.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index ab48045..ae42a98 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -7684,11 +7684,6 @@ 详细了解“安全浏览”功能 (https://developers.google.com/safe-browsing)。</translation> <translation id="8199823751103472868">通过设置此政策,您可为 <ph name="PRODUCT_OS_NAME" /> 启用印地语 Inscript 布局。如果此政策设为 false 或未设置,布局将不可用。</translation> <translation id="8202834945144737726">为登录界面上的一系列网址启用 <ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" /> 认证流程</translation> -<translation id="8212900161626657849">如果您未配置或已启用此政策,<ph name="PRODUCT_NAME" /> 将会遵循 CECPQ2(TLS 中的一种后量子密钥协议算法)的默认发布流程。 - - CECPQ2 会引发更长的 TLS 消息;在极少数情况下,这种消息可能会致使某些网络硬件出错。您也可将此政策设为 False,以便在解决网络问题期间停用 CECPQ2。 - - 此政策只是一项暂时性措施,会从 <ph name="PRODUCT_NAME" /> 的未来版本中移除。</translation> <translation id="8213770777756919897">请注意,此政策已被弃用,并将在 <ph name="PRODUCT_OS_NAME" />版本 85 中移除。请改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。 如果您设置了此政策,即是指定了当设备闲置时长超过所设的闲置延迟时间后 <ph name="PRODUCT_OS_NAME" />会执行的操作;闲置延迟时长可单独配置。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index e035114..9a81b9d 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -7618,11 +7618,6 @@ 如要進一步瞭解「安全瀏覽」功能,請前往 https://developers.google.com/safe-browsing。</translation> <translation id="8199823751103472868">設定這項政策會在 <ph name="PRODUCT_OS_NAME" /> 上啟用北印度文 InScript 版面配置。如果設為 False 或未設定,該版面配置將無法使用。</translation> <translation id="8202834945144737726">在登入畫面上針對清單中的網址啟用「<ph name="CHROME_ENTERPRISE_DEVICE_TRUST_CONNECTOR" />」認證流程</translation> -<translation id="8212900161626657849">如果將這項政策設為啟用或不設定,<ph name="PRODUCT_NAME" /> 會遵循預設的 CECPQ2 推出程序;CECPQ2 是傳輸層安全標準 (TLS) 中的後量子金鑰協議演算法。 - - CECPQ2 會產生更大量的傳輸層安全標準 (TLS) 訊息,在極少數情況下可能觸發某些網路硬體的錯誤。網路問題解決後,你可以將這項政策設為 False 以停用 CECPQ2。 - - 這項政策僅是暫時性措施,我們會在日後的 <ph name="PRODUCT_NAME" /> 版本中予以移除。</translation> <translation id="8213770777756919897">請注意,這項政策已遭淘汰,並將在 <ph name="PRODUCT_OS_NAME" />第 85 版中移除。請改用 <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME" />。 如果設定這項政策,當使用者的閒置時間已達閒置延遲時間指定的長度 (可另行設定),<ph name="PRODUCT_OS_NAME" />會採取這項政策指定的動作。
diff --git a/components/policy/tools/generate_policy_source.gni b/components/policy/tools/generate_policy_source.gni new file mode 100644 index 0000000..2cd44b48 --- /dev/null +++ b/components/policy/tools/generate_policy_source.gni
@@ -0,0 +1,109 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//components/policy/resources/policy_templates.gni") + +# Generate .proto files and constants based on policy_templates.json. +# +# Parameters: +# +# chunking (required, boolean) +# Split excess policies into `subProto1`, `subProto2`, etc. +# +# generate_cc (optional, default true) +# Generate C++ source/header files. +# +# generate_app_restrictions (optional, default true) +# Generate app_restrictions.xml (only on Android). +template("generate_policy_source") { + assert(defined(invoker.chunking)) + chunking = invoker.chunking + + if (defined(invoker.generate_cc)) { + generate_cc = invoker.generate_cc + } else { + generate_cc = true + } + + if (defined(invoker.generate_app_restrictions)) { + generate_app_restrictions = invoker.generate_app_restrictions + } else { + generate_app_restrictions = true + } + + action(target_name) { + # This protobuf is equivalent to chrome_settings.proto but shares messages + # for policies of the same type, so that less classes have to be generated + # and compiled. + cloud_policy_proto_path = "$target_gen_dir/proto/cloud_policy.proto" + + # This is the "full" protobuf, which defines one protobuf message per + # policy. It is also the format currently used by the server. + chrome_settings_proto_path = "$target_gen_dir/proto/chrome_settings.proto" + + policy_templates_generated_json_path = + "$policy_templates_base_dir/policy_templates.json" + + script = "//components/policy/tools/generate_policy_source.py" + chrome_version_abspath = "//chrome/VERSION" + chrome_version_path = rebase_path(chrome_version_abspath, root_build_dir) + + deps = [ "//components/policy:generate_policy_templates" ] + inputs = [ + chrome_version_abspath, + policy_templates_generated_json_path, + ] + outputs = [ + chrome_settings_proto_path, + cloud_policy_proto_path, + ] + args = [ + # Input information. + "--chrome-version-file=" + chrome_version_path, + "--policy-templates-file=" + + rebase_path(policy_templates_generated_json_path, root_build_dir), + "--target-platform=" + target_os, + ] + if (!chunking) { + args += [ "--no-chunking" ] + } + args += [ + # Output .proto files to be generated. + "--chrome-settings-protobuf=" + + rebase_path(chrome_settings_proto_path, root_build_dir), + "--cloud-policy-protobuf=" + + rebase_path(cloud_policy_proto_path, root_build_dir), + ] + + if (generate_cc) { + # Generate C++ headers/sources. + constants_header_path = "$target_gen_dir/policy_constants.h" + constants_source_path = "$target_gen_dir/policy_constants.cc" + risk_tag_header_path = "$target_gen_dir/risk_tag.h" + + outputs += [ + constants_header_path, + constants_source_path, + risk_tag_header_path, + ] + args += [ + "--policy-constants-header=" + + rebase_path(constants_header_path, root_build_dir), + "--policy-constants-source=" + + rebase_path(constants_source_path, root_build_dir), + "--risk-tag-header=" + + rebase_path(risk_tag_header_path, root_build_dir), + ] + } + + if (generate_app_restrictions && target_os == "android") { + # Generate app_restrictions.xml. + app_restrictions_path = "$target_gen_dir/app_restrictions.xml" + + outputs += [ app_restrictions_path ] + args += [ "--app-restrictions-definition=" + + rebase_path(app_restrictions_path, root_build_dir) ] + } + } +}
diff --git a/components/policy/tools/generate_policy_source.py b/components/policy/tools/generate_policy_source.py index b1c2ae9..30355d01 100755 --- a/components/policy/tools/generate_policy_source.py +++ b/components/policy/tools/generate_policy_source.py
@@ -322,6 +322,12 @@ help='Number of major versions before a code for a policy stops being ' 'generated', default=3) # Temporary fix for tree closure. crbug.com/1383391 + parser.add_argument( + '--no-chunking', + action='store_false', + dest='chunking', # A variable called `no_chunking` would be confusing. + default=True, + help='do not split policies into subProto1, subProto2, etc.') args = parser.parse_args() has_arg_error = False @@ -388,7 +394,7 @@ _OutputGeneratedWarningHeader(f, template_file_name, xml) writer(sorted and sorted_policy_details or policy_details, sorted and sorted_policy_atomic_groups or policy_atomic_groups, - target_platform, f, risk_tags) + target_platform, f, risk_tags, args.chunking) if args.header_path: GenerateFile(args.header_path, _WritePolicyConstantHeader, sorted=True) @@ -498,7 +504,7 @@ def _WritePolicyConstantHeader(all_policies, policy_atomic_groups, - target_platform, f, risk_tags): + target_platform, f, risk_tags, chunking): policies = _GetSupportedPolicies(all_policies, target_platform) f.write('''#ifndef COMPONENTS_POLICY_POLICY_CONSTANTS_H_ #define COMPONENTS_POLICY_POLICY_CONSTANTS_H_ @@ -1088,7 +1094,7 @@ def _WritePolicyConstantSource(all_policies, policy_atomic_groups, - target_platform, f, risk_tags): + target_platform, f, risk_tags, chunking): policies = _GetSupportedPolicies(all_policies, target_platform) policy_names = [policy.name for policy in policies] f.write('''#include "components/policy/policy_constants.h" @@ -1334,7 +1340,7 @@ protobuf_types = _GetProtobufTypes() for protobuf_type in protobuf_types: - _WriteChromePolicyAccessSource(policies, f, protobuf_type) + _WriteChromePolicyAccessSource(policies, f, protobuf_type, chunking) f.write('\n} // namespace policy\n') @@ -1352,7 +1358,7 @@ # Writes an array that contains the pointers to the proto field for each policy # in |policies| of the given |protobuf_type|. -def _WriteChromePolicyAccessSource(policies, f, protobuf_type): +def _WriteChromePolicyAccessSource(policies, f, protobuf_type, chunking): supported_user_policies = _GetSupportedChromeUserPolicies( policies, protobuf_type) f.write('const std::array<%sPolicyAccess, %d> k%sPolicyAccess {{\n' % @@ -1366,7 +1372,7 @@ else: extra_args = '' - chunk_number = _ChunkNumber(policy.id) + chunk_number = _ChunkNumber(policy.id, chunking) if chunk_number == 0: has_proto = 'policy.has_%s()' % lowercase_name get_proto = 'policy.%s()' % lowercase_name @@ -1452,7 +1458,7 @@ def _WritePolicyRiskTagHeader(policies, policy_atomic_groups, target_platform, - f, risk_tags): + f, risk_tags, chunking): f.write('''#ifndef CHROME_COMMON_POLICY_RISK_TAG_H_ #define CHROME_COMMON_POLICY_RISK_TAG_H_ @@ -1545,10 +1551,10 @@ f.write('}\n\n') -def _ChunkNumber(policy_id): +def _ChunkNumber(policy_id, chunking): # Compute which chunk the policy should go to. Chunk 0 contains the legacy # policies, whereas subsequent chunks contain nested policies. - if policy_id <= _LAST_TOP_LEVEL_POLICY_ID: + if not chunking or policy_id <= _LAST_TOP_LEVEL_POLICY_ID: return 0 else: return (policy_id - _LAST_TOP_LEVEL_POLICY_ID - 1) // _CHUNK_SIZE + 1 @@ -1567,7 +1573,7 @@ def _WriteChromeSettingsProtobuf(policies, policy_atomic_groups, - target_platform, f, risk_tags): + target_platform, f, risk_tags, chunking): f.write(CHROME_SETTINGS_PROTO_HEAD) fields = defaultdict(list) f.write('// PBs for individual settings.\n\n') @@ -1578,7 +1584,7 @@ # Write the individual policy proto into the file _WritePolicyProto(f, policy) - chunk_number = _ChunkNumber(policy.id) + chunk_number = _ChunkNumber(policy.id, chunking) field_number = _FieldNumber(policy.id, chunk_number) # Add to |fields| in order to eventually add to ChromeSettingsProto. @@ -1614,7 +1620,7 @@ def _WriteCloudPolicyProtobuf(policies, policy_atomic_groups, target_platform, - f, risk_tags): + f, risk_tags, chunking): f.write(CLOUD_POLICY_PROTO_HEAD) fields = defaultdict(list) @@ -1623,7 +1629,7 @@ if not policy.is_supported or policy.is_device_only: continue - chunk_number = _ChunkNumber(policy.id) + chunk_number = _ChunkNumber(policy.id, chunking) field_number = _FieldNumber(policy.id, chunk_number) # Add to |fields| in order to eventually add to CloudPolicyProto. @@ -1717,7 +1723,8 @@ # Writes policy_constants.h for use in Chrome OS. def _WriteChromeOSPolicyConstantsHeader(policies, policy_atomic_groups, - target_platform, f, risk_tags): + target_platform, f, risk_tags, + chunking): f.write('#ifndef __BINDINGS_POLICY_CONSTANTS_H_\n' '#define __BINDINGS_POLICY_CONSTANTS_H_\n\n' '#include <array>\n\n') @@ -1759,14 +1766,15 @@ # Writes an array that contains the pointers to the mutable proto field for each # policy in |policies| of the given |protobuf_type|. -def _WriteChromeOSPolicyAccessSource(supported_policies, f, protobuf_type): +def _WriteChromeOSPolicyAccessSource(supported_policies, f, protobuf_type, + chunking): f.write('const std::array<%sPolicyAccess, %d> k%sPolicyAccess {{\n' % (protobuf_type, len(supported_policies), protobuf_type)) for policy in supported_policies: name = policy.name lowercase_name = name.lower() - chunk_number = _ChunkNumber(policy.id) + chunk_number = _ChunkNumber(policy.id, chunking) if chunk_number == 0: mutable_proto_ptr = 'policy->mutable_%s()' % lowercase_name else: @@ -1786,7 +1794,8 @@ # Writes policy_constants.cc for use in Chrome OS. def _WriteChromeOSPolicyConstantsSource(policies, policy_atomic_groups, - target_platform, f, risk_tags): + target_platform, f, risk_tags, + chunking): f.write('#include "bindings/cloud_policy.pb.h"\n' '#include "bindings/policy_constants.h"\n\n' 'namespace em = enterprise_management;\n\n' @@ -1811,7 +1820,8 @@ for protobuf_type in protobuf_types: supported_user_policies = _GetSupportedChromeOSPoliciesForProtobufType( policies, 'user', protobuf_type) - _WriteChromeOSPolicyAccessSource(supported_user_policies, f, protobuf_type) + _WriteChromeOSPolicyAccessSource(supported_user_policies, f, protobuf_type, + chunking) f.write('} // namespace policy\n') @@ -1823,7 +1833,7 @@ def _WriteAppRestrictions(policies, policy_atomic_groups, target_platform, f, - risk_tags): + risk_tags, chunking): def WriteRestrictionCommon(key): f.write(' <restriction\n' ' android:key="%s"\n' % key)
diff --git a/components/policy/tools/generate_policy_source_test.py b/components/policy/tools/generate_policy_source_test.py index eaf483e..a1a5725 100755 --- a/components/policy/tools/generate_policy_source_test.py +++ b/components/policy/tools/generate_policy_source_test.py
@@ -309,28 +309,73 @@ with patch('codecs.open', mock_open()) as mocked_file: with codecs.open(output_path, 'w', encoding='utf-8') as f: generate_policy_source._WriteCloudPolicyProtobuf( - self.policies, self.policy_atomic_groups, self.target_platform, f, - self.risk_tags) + self.policies, + self.policy_atomic_groups, + self.target_platform, + f, + self.risk_tags, + chunking=True) mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') self._assertCallsEqual(test_data.EXPECTED_CLOUD_POLICY_PROTOBUF, mocked_file().write.call_args_list) + def testWriteCloudPolicyProtobufNoChunking(self): + output_path = 'mock_cloud_policy_proto' + + with patch('codecs.open', mock_open()) as mocked_file: + with codecs.open(output_path, 'w', encoding='utf-8') as f: + generate_policy_source._WriteCloudPolicyProtobuf( + self.policies, + self.policy_atomic_groups, + self.target_platform, + f, + self.risk_tags, + chunking=False) + + mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') + + self._assertCallsEqual(test_data.EXPECTED_CLOUD_POLICY_PROTOBUF_NO_CHUNKING, + mocked_file().write.call_args_list) + def testWriteChromeSettingsProtobuf(self): output_path = 'mock_chrome_settings_proto' with patch('codecs.open', mock_open()) as mocked_file: with codecs.open(output_path, 'w', encoding='utf-8') as f: generate_policy_source._WriteChromeSettingsProtobuf( - self.policies, self.policy_atomic_groups, self.target_platform, f, - self.risk_tags) + self.policies, + self.policy_atomic_groups, + self.target_platform, + f, + self.risk_tags, + chunking=True) mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') self._assertCallsEqual(test_data.EXPECTED_CHROME_SETTINGS_PROTOBUF, mocked_file().write.call_args_list) + def testWriteChromeSettingsProtobufNoChunking(self): + output_path = 'mock_chrome_settings_proto' + + with patch('codecs.open', mock_open()) as mocked_file: + with codecs.open(output_path, 'w', encoding='utf-8') as f: + generate_policy_source._WriteChromeSettingsProtobuf( + self.policies, + self.policy_atomic_groups, + self.target_platform, + f, + self.risk_tags, + chunking=False) + + mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') + + self._assertCallsEqual( + test_data.EXPECTED_CHROME_SETTINGS_PROTOBUF_NO_CHUNKING, + mocked_file().write.call_args_list) + def testWritePolicyProto(self): output_path = 'mock_write_policy_proto' @@ -370,6 +415,7 @@ target_platform, f, self.risk_tags, + chunking=True, ) with self.subTest(target_platform=target_platform): mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') @@ -398,6 +444,7 @@ target_platform, f, self.risk_tags, + chunking=True, ) with self.subTest(target_platform=target_platform): mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') @@ -423,6 +470,7 @@ self.target_platform, f, self.risk_tags, + chunking=True, ) mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') self._assertCallsEqual(test_data.EXPECTED_CROS_POLICY_CONSTANTS_HEADER, @@ -438,6 +486,7 @@ self.target_platform, f, self.risk_tags, + chunking=True, ) mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') self._assertCallsEqual(test_data.EXPECTED_CROS_POLICY_CONSTANTS_SOURCE, @@ -454,6 +503,7 @@ self.target_platform, f, self.risk_tags, + chunking=True, ) mocked_file.assert_called_once_with(output_path, 'w', encoding='utf-8') self._assertCallsEqual(test_data.EXPECTED_APP_RESTRICTIONS_XML, @@ -491,14 +541,24 @@ ] for policy_data in test_data: + # With chunking: self.assertEqual( - generate_policy_source._ChunkNumber(policy_data.policy_id), + generate_policy_source._ChunkNumber(policy_data.policy_id, + chunking=True), policy_data.chunk_number) self.assertEqual( generate_policy_source._FieldNumber(policy_data.policy_id, policy_data.chunk_number), policy_data.field_number) + # Without chunking: + self.assertEqual( + generate_policy_source._ChunkNumber(policy_data.policy_id, + chunking=False), 0) + self.assertEqual( + generate_policy_source._FieldNumber(policy_data.policy_id, 0), + policy_data.policy_id + 2) + if __name__ == '__main__': unittest.main()
diff --git a/components/policy/tools/generate_policy_source_test_data.py b/components/policy/tools/generate_policy_source_test_data.py index 0c8562c..cc90ea5d 100644 --- a/components/policy/tools/generate_policy_source_test_data.py +++ b/components/policy/tools/generate_policy_source_test_data.py
@@ -42,6 +42,33 @@ } ''' +EXPECTED_CLOUD_POLICY_PROTOBUF_NO_CHUNKING = ''' +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package enterprise_management; + +option go_package="chromium/policy/enterprise_management_proto"; + +import "policy_common_definitions.proto"; + +message CloudPolicySettings { + optional StringPolicyProto ExampleStringPolicy = 3; + optional BooleanPolicyProto ExampleBoolPolicy = 4; + optional BooleanPolicyProto ExampleBoolMergeMetapolicy = 5; + optional BooleanPolicyProto ExampleBoolPrecedenceMetapolicy = 6; + optional BooleanPolicyProto CloudOnlyPolicy = 7; + optional StringPolicyProto CloudManagementEnrollmentToken = 8; + optional StringPolicyProto DeprecatedButGenerated = 9; + optional BooleanPolicyProto ChunkZeroLastFieldBooleanPolicy = 1042; + optional BooleanPolicyProto ChunkOneFirstFieldBooleanPolicy = 1043; + optional BooleanPolicyProto ChunkOneLastFieldBooleanPolicy = 1842; + optional StringPolicyProto ChunkTwoFirstFieldStringPolicy = 1843; + optional StringPolicyProto ChunkTwoLastFieldStringPolicy = 2642; +} +''' + EXPECTED_CHROME_SETTINGS_PROTOBUF = """ syntax = "proto2"; @@ -228,6 +255,181 @@ } """ +EXPECTED_CHROME_SETTINGS_PROTOBUF_NO_CHUNKING = """ +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package enterprise_management; + +option go_package="chromium/policy/enterprise_management_proto"; + +// For StringList and PolicyOptions. +import "policy_common_definitions.proto"; + +// PBs for individual settings. + +// ExampleStringPolicy caption +// +// ExampleStringPolicy desc +// +// Supported on: chrome_os, linux, mac, win +message ExampleStringPolicyProto { + optional PolicyOptions policy_options = 1; + optional string ExampleStringPolicy = 2; +} + +// ExampleBoolPolicy caption +// +// ExampleBoolPolicy desc +// +// Supported on: chrome_os, linux, mac, win +message ExampleBoolPolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ExampleBoolPolicy = 2; +} + +// ExampleBoolMergeMetapolicy caption +// +// ExampleBoolMergeMetapolicy desc +// +// Supported on: android, chrome_os, fuchsia, ios, linux, mac, win +message ExampleBoolMergeMetapolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ExampleBoolMergeMetapolicy = 2; +} + +// ExampleBoolPrecedenceMetapolicy caption +// +// ExampleBoolPrecedenceMetapolicy desc +// +// Supported on: android, chrome_os, ios, linux, mac, win +message ExampleBoolPrecedenceMetapolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ExampleBoolPrecedenceMetapolicy = 2; +} + +// CloudOnlyPolicy caption +// +// CloudOnlyPolicy desc +// +// Supported on: android, chrome_os, linux, mac, win +message CloudOnlyPolicyProto { + optional PolicyOptions policy_options = 1; + optional bool CloudOnlyPolicy = 2; +} + +// CloudManagementEnrollmentToken caption +// +// CloudManagementEnrollmentToken desc +// +// Supported on: android, chrome_os, linux, mac, win +message CloudManagementEnrollmentTokenProto { + optional PolicyOptions policy_options = 1; + optional string CloudManagementEnrollmentToken = 2; +} + +// DeprecatedButGenerated caption +// +// DeprecatedButGenerated desc +// +// Supported on: android, chrome_os, linux, mac, win +message DeprecatedButGeneratedProto { + optional PolicyOptions policy_options = 1; + optional string DeprecatedButGenerated = 2; +} + +// DeprecatedNotGenerated caption +// +// DeprecatedNotGenerated desc +// +// Supported on: +message DeprecatedNotGeneratedProto { + optional PolicyOptions policy_options = 1; + optional string DeprecatedNotGenerated = 2; +} + +// UnsupportedPolicy caption +// +// UnsupportedPolicy desc +// +// Supported on: +message UnsupportedPolicyProto { + optional PolicyOptions policy_options = 1; + optional string UnsupportedPolicy = 2; +} + +// ChunkZeroLastFieldBooleanPolicy caption +// +// ChunkZeroLastFieldBooleanPolicy desc. +// +// Supported on: chrome_os, linux, mac, win +message ChunkZeroLastFieldBooleanPolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ChunkZeroLastFieldBooleanPolicy = 2; +} + +// ChunkOneFirstFieldBooleanPolicy caption +// +// ChunkOneFirstFieldBooleanPolicy desc. +// +// Supported on: chrome_os, linux, mac, win +message ChunkOneFirstFieldBooleanPolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ChunkOneFirstFieldBooleanPolicy = 2; +} + +// ChunkOneLastFieldBooleanPolicy caption +// +// ChunkOneLastFieldBooleanPolicy desc. +// +// Supported on: chrome_os, linux, mac, win +message ChunkOneLastFieldBooleanPolicyProto { + optional PolicyOptions policy_options = 1; + optional bool ChunkOneLastFieldBooleanPolicy = 2; +} + +// ChunkTwoFirstFieldStringPolicy caption +// +// ChunkTwoFirstFieldStringPolicy desc +// +// Supported on: chrome_os, linux, mac, win +message ChunkTwoFirstFieldStringPolicyProto { + optional PolicyOptions policy_options = 1; + optional string ChunkTwoFirstFieldStringPolicy = 2; +} + +// ChunkTwoLastFieldStringPolicy caption +// +// ChunkTwoLastFieldStringPolicy desc +// +// Supported on: chrome_os, linux, mac, win +message ChunkTwoLastFieldStringPolicyProto { + optional PolicyOptions policy_options = 1; + optional string ChunkTwoLastFieldStringPolicy = 2; +} + +// -------------------------------------------------- +// Big wrapper PB containing the above groups. + +message ChromeSettingsProto { + optional ExampleStringPolicyProto ExampleStringPolicy = 3; + optional ExampleBoolPolicyProto ExampleBoolPolicy = 4; + optional ExampleBoolMergeMetapolicyProto ExampleBoolMergeMetapolicy = 5; + optional ExampleBoolPrecedenceMetapolicyProto ExampleBoolPrecedenceMetapolicy = 6; + optional CloudOnlyPolicyProto CloudOnlyPolicy = 7; + optional CloudManagementEnrollmentTokenProto CloudManagementEnrollmentToken = 8; + optional DeprecatedButGeneratedProto DeprecatedButGenerated = 9; + optional DeprecatedNotGeneratedProto DeprecatedNotGenerated = 10; + optional UnsupportedPolicyProto UnsupportedPolicy = 11; + optional ChunkZeroLastFieldBooleanPolicyProto ChunkZeroLastFieldBooleanPolicy = 1042; + optional ChunkOneFirstFieldBooleanPolicyProto ChunkOneFirstFieldBooleanPolicy = 1043; + optional ChunkOneLastFieldBooleanPolicyProto ChunkOneLastFieldBooleanPolicy = 1842; + optional ChunkTwoFirstFieldStringPolicyProto ChunkTwoFirstFieldStringPolicy = 1843; + optional ChunkTwoLastFieldStringPolicyProto ChunkTwoLastFieldStringPolicy = 2642; +} +""" + EXPECTED_POLICY_PROTO = '''\ // ExampleStringPolicy caption //
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc index f53ebe0..f0172d7 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.cc +++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -12,6 +12,7 @@ const char kPrivacySandboxSettings4ConsentRequiredName[] = "consent-required"; const char kPrivacySandboxSettings4NoticeRequiredName[] = "notice-required"; +const char kPrivacySandboxSettings4RestrictedNoticeName[] = "restricted-notice"; const char kPrivacySandboxSettings4ForceShowConsentForTestingName[] = "force-show-consent-for-testing"; const char kPrivacySandboxSettings4ForceShowNoticeRowForTestingName[] = @@ -20,6 +21,8 @@ "force-show-notice-eea-for-testing"; const char kPrivacySandboxSettings4ForceShowNoticeRestrictedForTestingName[] = "force-show-notice-restricted-for-testing"; +const char kPrivacySandboxSettings4ForceRestrictedUserForTestingName[] = + "force-restricted-user"; const char kPrivacySandboxSettings4ShowSampleDataForTestingName[] = "show-sample-data"; @@ -29,6 +32,9 @@ const base::FeatureParam<bool> kPrivacySandboxSettings4NoticeRequired{ &kPrivacySandboxSettings4, kPrivacySandboxSettings4NoticeRequiredName, false}; +const base::FeatureParam<bool> kPrivacySandboxSettings4RestrictedNotice{ + &kPrivacySandboxSettings4, kPrivacySandboxSettings4RestrictedNoticeName, + false}; const base::FeatureParam<bool> kPrivacySandboxSettings4ForceShowConsentForTesting{ @@ -46,6 +52,10 @@ kPrivacySandboxSettings4ForceShowNoticeRestrictedForTesting{ &kPrivacySandboxSettings4, kPrivacySandboxSettings4ForceShowNoticeRestrictedForTestingName, false}; +const base::FeatureParam<bool> + kPrivacySandboxSettings4ForceRestrictedUserForTesting{ + &kPrivacySandboxSettings4, + kPrivacySandboxSettings4ForceRestrictedUserForTestingName, false}; const base::FeatureParam<bool> kPrivacySandboxSettings4ShowSampleDataForTesting{ &kPrivacySandboxSettings4, kPrivacySandboxSettings4ShowSampleDataForTestingName, false};
diff --git a/components/privacy_sandbox/privacy_sandbox_features.h b/components/privacy_sandbox/privacy_sandbox_features.h index 6e3d457..c992b0ba 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.h +++ b/components/privacy_sandbox/privacy_sandbox_features.h
@@ -24,6 +24,8 @@ COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const char kPrivacySandboxSettings4NoticeRequiredName[]; COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) +extern const char kPrivacySandboxSettings4RestrictedNoticeName[]; +COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const char kPrivacySandboxSettings4ForceShowConsentForTestingName[]; COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const char kPrivacySandboxSettings4ForceShowNoticeRowForTestingName[]; @@ -33,6 +35,8 @@ extern const char kPrivacySandboxSettings4ForceShowNoticeRestrictedForTestingName[]; COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) +extern const char kPrivacySandboxSettings4ForceRestrictedUserForTestingName[]; +COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const char kPrivacySandboxSettings4ShowSampleDataForTestingName[]; // When true, the user will be shown a consent to enable the Privacy Sandbox @@ -46,6 +50,10 @@ COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const base::FeatureParam<bool> kPrivacySandboxSettings4NoticeRequired; +// When true, the user could be shown a Privacy Sandbox restricted notice. +COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) +extern const base::FeatureParam<bool> kPrivacySandboxSettings4RestrictedNotice; + // Feature parameters which should exclusively be used for testing purposes. // Enabling any of these parameters may result in the Privacy Sandbox prefs // (unsynced) entering an unexpected state, requiring profile deletion to @@ -64,6 +72,9 @@ kPrivacySandboxSettings4ForceShowNoticeRestrictedForTesting; COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) extern const base::FeatureParam<bool> + kPrivacySandboxSettings4ForceRestrictedUserForTesting; +COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) +extern const base::FeatureParam<bool> kPrivacySandboxSettings4ShowSampleDataForTesting; // Enables the third release of the Privacy Sandbox settings.
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.cc b/components/safe_browsing/content/browser/client_side_detection_service.cc index a2c276a..89abbe4 100644 --- a/components/safe_browsing/content/browser/client_side_detection_service.cc +++ b/components/safe_browsing/content/browser/client_side_detection_service.cc
@@ -270,10 +270,8 @@ "you and your device from dangerous sites' in Chrome settings " "under Privacy. This feature is enabled by default." chrome_policy { - subProto1 { - ClientSidePhishingProtectionAllowed { - ClientSidePhishingProtectionAllowed: false - } + ClientSidePhishingProtectionAllowed { + ClientSidePhishingProtectionAllowed: false } } chrome_policy {
diff --git a/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc b/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc index 5739abc6..524644f 100644 --- a/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc +++ b/components/safe_browsing/core/browser/db/v4_get_hash_protocol_manager.cc
@@ -921,6 +921,18 @@ std::vector<FullHashInfo> full_hash_infos; Time negative_cache_expire; + + if (net_error == net::ERR_INTERNET_DISCONNECTED) { + base::UmaHistogramSparse( + "SafeBrowsing.V4GetHash.Network.HttpResponseCode.InternetDisconnected", + response_code); + } + if (net_error == net::ERR_NETWORK_CHANGED) { + base::UmaHistogramSparse( + "SafeBrowsing.V4GetHash.Network.HttpResponseCode.NetworkChanged", + response_code); + } + if (net_error == net::OK && response_code == net::HTTP_OK) { RecordGetHashResult(V4OperationResult::STATUS_200); if (gethash_error_count_)
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.cc index eebb31d..66e8c8d 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.cc
@@ -28,17 +28,21 @@ HashRealTimeCache::FullHashesAndDetails::~FullHashesAndDetails() = default; std::unordered_map<std::string, std::vector<V5::FullHash>> -HashRealTimeCache::SearchCache( - const std::set<std::string>& hash_prefixes) const { +HashRealTimeCache::SearchCache(const std::set<std::string>& hash_prefixes, + bool skip_logging) const { std::unordered_map<std::string, std::vector<V5::FullHash>> results; for (const auto& hash_prefix : hash_prefixes) { auto cached_result_it = cache_.find(hash_prefix); if (cached_result_it != cache_.end() && cached_result_it->second.expiration_time > base::Time::Now()) { results[hash_prefix] = cached_result_it->second.full_hash_and_details; - LogCacheHitOrMiss(/*is_hit=*/true); + if (!skip_logging) { + LogCacheHitOrMiss(/*is_hit=*/true); + } } else { - LogCacheHitOrMiss(/*is_hit=*/false); + if (!skip_logging) { + LogCacheHitOrMiss(/*is_hit=*/false); + } } } return results;
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.h b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.h index 45bddfe4..ff8a3a4 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.h +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache.h
@@ -33,9 +33,14 @@ // Returns a map, where the key is a requested hash prefix and the value is // the matching result in the cache. If a requested hash prefix was not in the - // cache (or has expired), then it is not in the returned map. + // cache (or has expired), then it is not in the returned map. |skip_logging| + // specifies whether metric logging should be skipped when this function is + // called. + // TODO(crbug.com/1432308): [Also TODO(thefrog)] Remove |skip_logging| + // parameter after investigation is complete. std::unordered_map<std::string, std::vector<V5::FullHash>> SearchCache( - const std::set<std::string>& hash_prefixes) const; + const std::set<std::string>& hash_prefixes, + bool skip_logging) const; // Adds the responses to the cache. void CacheSearchHashesResponse(
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache_unittest.cc index be7c3508..239afd5 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache_unittest.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_cache_unittest.cc
@@ -83,14 +83,21 @@ TEST_F(HashRealTimeCacheTest, TestCacheMatching_EmptyCache) { auto cache = std::make_unique<HashRealTimeCache>(); - EXPECT_TRUE(cache->SearchCache({}).empty()); + EXPECT_TRUE(cache->SearchCache({}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/0); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_TRUE(cache->SearchCache({"aaaa", "bbbb"}).empty()); + EXPECT_TRUE( + cache->SearchCache({"aaaa", "bbbb"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/2); } +TEST_F(HashRealTimeCacheTest, TestCacheMatching_SkipLogging) { + auto cache = std::make_unique<HashRealTimeCache>(); + cache->SearchCache({"aaaa"}, /*skip_logging=*/true); + CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/0); +} + TEST_F(HashRealTimeCacheTest, TestCacheMatching_BasicFunctionality) { base::HistogramTester histogram_tester; auto cache = std::make_unique<HashRealTimeCache>(); @@ -123,16 +130,18 @@ // Searching for no prefix or for prefixes not in the request should yield // empty cache results. - EXPECT_TRUE(cache->SearchCache({}).empty()); + EXPECT_TRUE(cache->SearchCache({}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/0); - EXPECT_TRUE(cache->SearchCache({"eeee"}).empty()); + EXPECT_TRUE(cache->SearchCache({"eeee"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_TRUE(cache->SearchCache({"eeee", "ffff"}).empty()); + EXPECT_TRUE( + cache->SearchCache({"eeee", "ffff"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/2); std::set<std::string> hash_prefixes_to_search = {"aaaa", "bbbb", "cccc", "dddd", "eeee", "ffff"}; - auto cache_results = cache->SearchCache(hash_prefixes_to_search); + auto cache_results = + cache->SearchCache(hash_prefixes_to_search, /*skip_logging=*/false); CheckAndResetCacheHitsAndMisses(/*num_hits=*/4, /*num_misses=*/2); // Don't expect cache results for eeee and ffff, since they are not in the @@ -207,35 +216,39 @@ // aaaa expires at 300 seconds. cccc expires at 599 seconds. // Current time = 299 seconds. aaaa and cccc have not expired. - EXPECT_FALSE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_FALSE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); - EXPECT_FALSE(cache->SearchCache({"cccc"}).empty()); + EXPECT_FALSE(cache->SearchCache({"cccc"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); - EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}).size(), 2u); + EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}, /*skip_logging=*/false).size(), + 2u); CheckAndResetCacheHitsAndMisses(/*num_hits=*/2, /*num_misses=*/0); // Current time = 300 seconds. aaaa has expired. cccc has not expired. task_environment_.FastForwardBy(base::Seconds(1)); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_FALSE(cache->SearchCache({"cccc"}).empty()); + EXPECT_FALSE(cache->SearchCache({"cccc"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); - EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}).size(), 1u); + EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}, /*skip_logging=*/false).size(), + 1u); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/1); // Current time = 598 seconds. aaaa has expired. cccc has not expired. task_environment_.FastForwardBy(base::Seconds(298)); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_FALSE(cache->SearchCache({"cccc"}).empty()); + EXPECT_FALSE(cache->SearchCache({"cccc"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); - EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}).size(), 1u); + EXPECT_EQ(cache->SearchCache({"aaaa", "cccc"}, /*skip_logging=*/false).size(), + 1u); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/1); // Current time = 599 seconds. aaaa and cccc have expired. task_environment_.FastForwardBy(base::Seconds(1)); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_TRUE(cache->SearchCache({"cccc"}).empty()); + EXPECT_TRUE(cache->SearchCache({"cccc"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); - EXPECT_TRUE(cache->SearchCache({"aaaa", "cccc"}).empty()); + EXPECT_TRUE( + cache->SearchCache({"aaaa", "cccc"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/2); } @@ -259,11 +272,11 @@ // aaaa expires at 300.5 seconds. // Current time = 300.0 seconds. aaaa has not expired. - EXPECT_FALSE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_FALSE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); // Current time = 300.5 seconds. aaaa has expired. task_environment_.FastForwardBy(base::Nanoseconds(500000000)); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); } @@ -294,7 +307,8 @@ } std::set<std::string> hash_prefixes_to_search = {"aaaa", "bbbb"}; - auto cache_results = cache->SearchCache(hash_prefixes_to_search); + auto cache_results = + cache->SearchCache(hash_prefixes_to_search, /*skip_logging=*/false); CheckAndResetCacheHitsAndMisses(/*num_hits=*/2, /*num_misses=*/0); // Sanity check that adding attributes for aaaa hashes does not change the @@ -348,7 +362,7 @@ CreateCacheDuration(300, 0)); } // Confirm the cache has the expected results. - auto cache_results_1 = cache->SearchCache({"aaaa"}); + auto cache_results_1 = cache->SearchCache({"aaaa"}, /*skip_logging=*/false); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); EXPECT_EQ(cache_results_1.size(), 1u); EXPECT_EQ(cache_results_1["aaaa"].size(), 1u); @@ -372,7 +386,7 @@ // requests for the same prefix, the later-responding result replaces the // earlier-responding result. In practice, the two results are expected to be // the same almost always, but if they are not, this is how the cache behaves. - auto cache_results_2 = cache->SearchCache({"aaaa"}); + auto cache_results_2 = cache->SearchCache({"aaaa"}, /*skip_logging=*/false); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); EXPECT_EQ(cache_results_2.size(), 1u); EXPECT_EQ(cache_results_2["aaaa"].size(), 1u); @@ -398,15 +412,15 @@ // Confirm caching Request #3 overwrote the cache duration. If it didn't, then // the results of Request #2 would already have expired. task_environment_.FastForwardBy(base::Seconds(150)); - EXPECT_FALSE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_FALSE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); // Confirm Request #3's cache duration is respected. task_environment_.FastForwardBy(base::Seconds(149)); - EXPECT_FALSE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_FALSE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/1, /*num_misses=*/0); task_environment_.FastForwardBy(base::Seconds(1)); - EXPECT_TRUE(cache->SearchCache({"aaaa"}).empty()); + EXPECT_TRUE(cache->SearchCache({"aaaa"}, /*skip_logging=*/false).empty()); CheckAndResetCacheHitsAndMisses(/*num_hits=*/0, /*num_misses=*/1); } @@ -423,12 +437,16 @@ CacheEntry(cache, "cccc1111111111111111111111111111", 500); EXPECT_EQ(GetNumCacheEntries(cache), 2); - EXPECT_TRUE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_TRUE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); cache->ClearExpiredResults(); EXPECT_EQ(GetNumCacheEntries(cache), 2); - EXPECT_TRUE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_TRUE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); } TEST_F(HashRealTimeCacheTest, TestClearExpiredResults_OneExpiredResult) { @@ -439,12 +457,16 @@ // After 400 seconds, aaaa is expired but not cccc. task_environment_.FastForwardBy(base::Seconds(400)); EXPECT_EQ(GetNumCacheEntries(cache), 2); - EXPECT_FALSE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_TRUE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); cache->ClearExpiredResults(); EXPECT_EQ(GetNumCacheEntries(cache), 1); - EXPECT_FALSE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_TRUE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_TRUE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); } TEST_F(HashRealTimeCacheTest, TestClearExpiredResults_SomeExpiredResults) { @@ -462,14 +484,22 @@ auto validate_cache_contents = [](std::unique_ptr<HashRealTimeCache>& cache_internal) { - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"aaaa"}), "aaaa")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"bbbb"}), "bbbb")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"cccc"}), "cccc")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"dddd"}), "dddd")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"eeee"}), "eeee")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"ffff"}), "ffff")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"gggg"}), "gggg")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"hhhh"}), "hhhh")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"bbbb"}, /*skip_logging=*/false), "bbbb")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"dddd"}, /*skip_logging=*/false), "dddd")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"eeee"}, /*skip_logging=*/false), "eeee")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"ffff"}, /*skip_logging=*/false), "ffff")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"gggg"}, /*skip_logging=*/false), "gggg")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"hhhh"}, /*skip_logging=*/false), "hhhh")); }; // After 400 seconds, all of the "soon" prefixes have expired, and none of the @@ -502,14 +532,22 @@ auto validate_cache_contents = [](std::unique_ptr<HashRealTimeCache>& cache_internal) { - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"aaaa"}), "aaaa")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"bbbb"}), "bbbb")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"cccc"}), "cccc")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"dddd"}), "dddd")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"eeee"}), "eeee")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"ffff"}), "ffff")); - EXPECT_FALSE(base::Contains(cache_internal->SearchCache({"gggg"}), "gggg")); - EXPECT_TRUE(base::Contains(cache_internal->SearchCache({"hhhh"}), "hhhh")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"bbbb"}, /*skip_logging=*/false), "bbbb")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"dddd"}, /*skip_logging=*/false), "dddd")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"eeee"}, /*skip_logging=*/false), "eeee")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"ffff"}, /*skip_logging=*/false), "ffff")); + EXPECT_FALSE(base::Contains( + cache_internal->SearchCache({"gggg"}, /*skip_logging=*/false), "gggg")); + EXPECT_TRUE(base::Contains( + cache_internal->SearchCache({"hhhh"}, /*skip_logging=*/false), "hhhh")); }; // After 400 seconds, all of the "soon" prefixes have expired, and none of the @@ -530,12 +568,16 @@ // After 500 seconds, both have expired. task_environment_.FastForwardBy(base::Seconds(500)); EXPECT_EQ(GetNumCacheEntries(cache), 2); - EXPECT_FALSE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_FALSE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); cache->ClearExpiredResults(); EXPECT_EQ(GetNumCacheEntries(cache), 0); - EXPECT_FALSE(base::Contains(cache->SearchCache({"aaaa"}), "aaaa")); - EXPECT_FALSE(base::Contains(cache->SearchCache({"cccc"}), "cccc")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"aaaa"}, /*skip_logging=*/false), "aaaa")); + EXPECT_FALSE(base::Contains( + cache->SearchCache({"cccc"}, /*skip_logging=*/false), "cccc")); } TEST_F(HashRealTimeCacheTest, TestClearExpiredResults_Logging) {
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc index be569cc..ee933d5 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc
@@ -21,6 +21,7 @@ #include "components/safe_browsing/core/common/utils.h" #include "google_apis/google_api_keys.h" #include "net/base/load_flags.h" +#include "net/http/http_request_headers.h" #include "net/http/http_status_code.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/resource_request.h" @@ -73,7 +74,10 @@ class ObliviousHttpClient : public network::mojom::ObliviousHttpClient { public: using OnCompletedCallback = - base::OnceCallback<void(const absl::optional<std::string>&, int, int)>; + base::OnceCallback<void(const absl::optional<std::string>&, + int, + int, + scoped_refptr<net::HttpResponseHeaders>)>; explicit ObliviousHttpClient(OnCompletedCallback callback) : callback_(std::move(callback)) {} @@ -81,7 +85,7 @@ ~ObliviousHttpClient() override { if (!called_) { std::move(callback_).Run(absl::nullopt, net::ERR_FAILED, - /*response_code=*/0); + /*response_code=*/0, /*headers=*/nullptr); } } @@ -94,20 +98,22 @@ called_ = true; if (status->is_net_error()) { std::move(callback_).Run(absl::nullopt, status->get_net_error(), - /*response_code=*/0); + /*response_code=*/0, /*headers=*/nullptr); } else if (status->is_outer_response_error_code()) { - std::move(callback_).Run(absl::nullopt, - net::ERR_HTTP_RESPONSE_CODE_FAILURE, - status->get_outer_response_error_code()); + std::move(callback_).Run( + absl::nullopt, net::ERR_HTTP_RESPONSE_CODE_FAILURE, + status->get_outer_response_error_code(), /*headers=*/nullptr); } else { DCHECK(status->is_inner_response()); if (status->get_inner_response()->response_code != net::HTTP_OK) { - std::move(callback_).Run(absl::nullopt, - net::ERR_HTTP_RESPONSE_CODE_FAILURE, - status->get_inner_response()->response_code); + std::move(callback_).Run( + absl::nullopt, net::ERR_HTTP_RESPONSE_CODE_FAILURE, + status->get_inner_response()->response_code, + std::move(status->get_inner_response()->headers)); } else { - std::move(callback_).Run(status->get_inner_response()->response_body, - net::OK, net::HTTP_OK); + std::move(callback_).Run( + status->get_inner_response()->response_body, net::OK, net::HTTP_OK, + std::move(status->get_inner_response()->headers)); } } } @@ -219,13 +225,16 @@ void HashRealTimeService::SearchCache( std::set<std::string> hash_prefixes, + bool skip_logging, std::vector<std::string>* out_missing_hash_prefixes, std::vector<V5::FullHash>* out_cached_full_hashes) const { - SCOPED_UMA_HISTOGRAM_TIMER("SafeBrowsing.HPRT.GetCache.Time"); + if (!skip_logging) { + SCOPED_UMA_HISTOGRAM_TIMER("SafeBrowsing.HPRT.GetCache.Time"); + } auto cached_results = cache_manager_ ? cache_manager_->GetCachedHashPrefixRealTimeLookupResults( - hash_prefixes) + hash_prefixes, skip_logging) : std::unordered_map<std::string, std::vector<V5::FullHash>>(); for (const auto& hash_prefix : hash_prefixes) { auto cached_result_it = cached_results.find(hash_prefix); @@ -242,6 +251,22 @@ } } +void HashRealTimeService::LogSearchCacheWithNoQueryParamsMetric( + const GURL& url) const { + GURL::Replacements replacements; + replacements.ClearQuery(); + GURL url_without_query_params = url.ReplaceComponents(replacements); + std::vector<std::string> hash_prefixes_that_would_be_requested; + std::vector<V5::FullHash> + full_hashes_that_would_be_cached; // this out parameter is not used + SearchCache(GetHashPrefixesSet(url_without_query_params), + /*skip_logging=*/true, &hash_prefixes_that_would_be_requested, + &full_hashes_that_would_be_cached); + base::UmaHistogramBoolean( + "SafeBrowsing.HPRT.CacheHitAllPrefixesIfNoQueryParams", + hash_prefixes_that_would_be_requested.empty()); +} + void HashRealTimeService::StartLookup( const GURL& url, HPRTLookupResponseCallback response_callback, @@ -257,10 +282,11 @@ // Search local cache. std::vector<std::string> hash_prefixes_to_request; std::vector<V5::FullHash> cached_full_hashes; - SearchCache(GetHashPrefixesSet(url), &hash_prefixes_to_request, - &cached_full_hashes); + SearchCache(GetHashPrefixesSet(url), /*skip_logging=*/false, + &hash_prefixes_to_request, &cached_full_hashes); base::UmaHistogramBoolean("SafeBrowsing.HPRT.CacheHitAllPrefixes", hash_prefixes_to_request.empty()); + LogSearchCacheWithNoQueryParamsMetric(url); // If all the prefixes are in the cache, no need to send a request. Return // early with the cached results. if (hash_prefixes_to_request.empty()) { @@ -357,6 +383,8 @@ ohttp_request->key_config = key.value(); ohttp_request->resource_url = GURL(GetResourceUrl(std::move(request))); ohttp_request->method = net::HttpRequestHeaders::kGetMethod; + ohttp_request->timeout_duration = + base::Seconds(kLookupTimeoutDurationInSeconds); mojo::PendingReceiver<network::mojom::ObliviousHttpClient> pending_receiver; get_network_context_.Run()->GetViaObliviousHttp( @@ -368,7 +396,8 @@ url, std::move(hash_prefixes_in_request), std::move(result_full_hashes), request_start_time, std::move(response_callback_task_runner), - std::move(response_callback), locally_cached_results_threat_type)), + std::move(response_callback), locally_cached_results_threat_type, + key.value())), std::move(pending_receiver)); } @@ -380,11 +409,15 @@ scoped_refptr<base::SequencedTaskRunner> response_callback_task_runner, HPRTLookupResponseCallback response_callback, SBThreatType locally_cached_results_threat_type, + std::string ohttp_key, const absl::optional<std::string>& response_body, int net_error, - int response_code) { - // TODO(crbug.com/1407283): Notify ohttp_key_service_ if the error is key - // related. + int response_code, + scoped_refptr<net::HttpResponseHeaders> headers) { + if (headers) { + ohttp_key_service_->NotifyLookupResponse(ohttp_key, response_code, headers); + } + auto response_body_ptr = std::make_unique<std::string>(response_body.value_or("")); OnURLLoaderComplete(
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.h b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.h index e5bbdde..7427e44 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.h +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.h
@@ -23,6 +23,7 @@ namespace net { struct NetworkTrafficAnnotationTag; +class HttpResponseHeaders; } namespace network { @@ -106,6 +107,8 @@ TestBackoffModeRespected_FullyCached); FRIEND_TEST_ALL_PREFIXES(HashRealTimeServiceTest, TestBackoffModeRespected_NotCached); + FRIEND_TEST_ALL_PREFIXES(HashRealTimeServiceTest, + TestLogSearchCacheWithNoQueryParamsMetric); constexpr static int kLeastSeverity = std::numeric_limits<int>::max(); using PendingHPRTLookupRequests = @@ -163,8 +166,8 @@ // Callback for requests sent via OHTTP. Most parameters are used by // |OnURLLoaderComplete|, see the description above |OnURLLoaderComplete| for - // details. |response_body|, |net_error| and |response_code| are returned from - // the OHTTP client. + // details. |response_body|, |net_error|, |response_code| and |headers| are + // returned from the OHTTP client. |ohttp_key| is sent to the key service. void OnOhttpComplete( const GURL& url, const std::vector<std::string>& hash_prefixes_in_request, @@ -173,9 +176,11 @@ scoped_refptr<base::SequencedTaskRunner> response_callback_task_runner, HPRTLookupResponseCallback response_callback, SBThreatType locally_cached_results_threat_type, + std::string ohttp_key, const absl::optional<std::string>& response_body, int net_error, - int response_code); + int response_code, + scoped_refptr<net::HttpResponseHeaders> headers); // Callback for requests sent directly to the Safe Browsing server. Most // parameters are used by |OnURLLoaderComplete|, see the description above @@ -293,14 +298,25 @@ std::set<std::string> GetHashPrefixesSet(const GURL& url) const; // Searches the local cache for the input |hash_prefixes|. + // - |skip_logging| specifies whether metric logging should be skipped when + // this function is called. // - |out_missing_hash_prefixes| is an output parameter with a list of which // hash prefixes were not found in the cache and need to be requested. // - |out_cached_full_hashes| is an output parameter with a list of unsafe // full hashes that were found in the cache for any of the |hash_prefixes|. + // TODO(crbug.com/1432308): [Also TODO(thefrog)] Remove |skip_logging| + // parameter after investigation is complete. void SearchCache(std::set<std::string> hash_prefixes, + bool skip_logging, std::vector<std::string>* out_missing_hash_prefixes, std::vector<V5::FullHash>* out_cached_full_hashes) const; + // Used for logging only. Records whether there would be a cache hit for all + // requested prefixes if the URL's query parameters were excluded. + // TODO(crbug.com/1432308): [Also TODO(thefrog)] Remove function after + // investigation is complete. + void LogSearchCacheWithNoQueryParamsMetric(const GURL& url) const; + SEQUENCE_CHECKER(sequence_checker_); // The URLLoaderFactory we use to issue network requests.
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc index 3b71d2f..67568625 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service_unittest.cc
@@ -22,6 +22,7 @@ #include "components/safe_browsing/core/common/proto/safebrowsingv5_alpha1.pb.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "google_apis/google_api_keys.h" +#include "net/http/http_response_headers.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "services/network/test/test_network_context.h" @@ -71,6 +72,8 @@ } else { auto response = network::mojom::ObliviousHttpResponse::New(); response->response_body = std::move(responses_[resource_url].body); + response->headers = + net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n"); if (responses_[resource_url].inner_response_code.has_value()) { response->response_code = responses_[resource_url].inner_response_code.value(); @@ -134,8 +137,18 @@ ohttp_key_ = ohttp_key; } + void NotifyLookupResponse( + const std::string& key, + int response_code, + scoped_refptr<net::HttpResponseHeaders> headers) override { + lookup_response_notified_ = true; + } + + bool lookup_response_notified() { return lookup_response_notified_; } + private: absl::optional<std::string> ohttp_key_; + bool lookup_response_notified_ = false; }; } // namespace @@ -268,6 +281,10 @@ /*name=*/"SafeBrowsing.HPRT.CacheHitAllPrefixes", /*sample=*/expect_cache_hit_all_prefixes, /*expected_bucket_count=*/1); + histogram_tester_->ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.CacheHitAllPrefixesIfNoQueryParams", + /*sample=*/expect_cache_hit_all_prefixes, + /*expected_bucket_count=*/1); if (expect_cache_hit_all_prefixes) { histogram_tester_->ExpectTotalCount( /*name=*/"SafeBrowsing.HPRT.BackoffState", /*expected_count=*/0); @@ -365,6 +382,7 @@ EXPECT_EQ(ohttp_request->relay_url, GURL(kTestRelayUrl)); EXPECT_EQ(ohttp_request->resource_url, GURL(expected_url)); EXPECT_EQ(ohttp_request->key_config, kOhttpKey); + EXPECT_EQ(ohttp_request->timeout_duration, base::Seconds(3)); })); // Set up request response. @@ -417,6 +435,7 @@ ResetMetrics(); EXPECT_EQ(network_context_.total_requests(), num_requests + 1u); + EXPECT_TRUE(ohttp_key_service_->lookup_response_notified()); } // Starts a lookup on |url| that is expected to fail. The simulated server // response body can be specified either by |response_full_hashes| or by @@ -432,7 +451,8 @@ absl::optional<int> inner_response_code, int expected_prefix_count, int expected_network_result, - HashRealTimeService::OperationResult expected_operation_result) { + HashRealTimeService::OperationResult expected_operation_result, + bool expected_lookup_response_called) { auto num_requests = network_context_.total_requests(); // Set up request and response. @@ -474,6 +494,8 @@ ResetMetrics(); EXPECT_EQ(network_context_.total_requests(), num_requests + 1u); + EXPECT_EQ(ohttp_key_service_->lookup_response_notified(), + expected_lookup_response_called); } // Starts a lookup on |url| that should already be found entirely in the cache // and therefore not require a request to be sent. Confirms that the lookup's @@ -969,7 +991,8 @@ /*expected_prefix_count=*/1, /*expected_network_result=*/net::ERR_FAILED, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kNetworkError); + HashRealTimeService::OperationResult::kNetworkError, + /*expected_lookup_response_called=*/false); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_NetErrorHttpCodeFailure) { GURL url = GURL("https://example.test"); @@ -982,7 +1005,8 @@ /*expected_prefix_count=*/1, /*expected_network_result=*/0, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kHttpError); + HashRealTimeService::OperationResult::kHttpError, + /*expected_lookup_response_called=*/false); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_OuterResponseCodeError) { GURL url = GURL("https://example.test"); @@ -995,7 +1019,8 @@ /*expected_prefix_count=*/1, /*expected_network_result=*/net::HTTP_NOT_FOUND, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kHttpError); + HashRealTimeService::OperationResult::kHttpError, + /*expected_lookup_response_called=*/false); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_InnerResponseCodeError) { GURL url = GURL("https://example.test"); @@ -1007,7 +1032,8 @@ /*expected_prefix_count=*/1, /*expected_network_result=*/net::HTTP_UNAUTHORIZED, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kHttpError); + HashRealTimeService::OperationResult::kHttpError, + /*expected_lookup_response_called=*/true); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_ParseResponse) { GURL url = GURL("https://example.test"); @@ -1018,7 +1044,8 @@ /*inner_response_code=*/absl::nullopt, /*expected_prefix_count=*/1, /*expected_network_result=*/net::HTTP_OK, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kParseError); + HashRealTimeService::OperationResult::kParseError, + /*expected_lookup_response_called=*/true); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_IncorrectFullHashLength) { GURL url = GURL("https://example.test"); @@ -1032,7 +1059,8 @@ /*inner_response_code=*/absl::nullopt, /*expected_prefix_count=*/1, /*expected_network_result=*/net::HTTP_OK, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kIncorrectFullHashLengthError); + HashRealTimeService::OperationResult::kIncorrectFullHashLengthError, + /*expected_lookup_response_called=*/true); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_MissingCacheDuration) { GURL url = GURL("https://example.test"); @@ -1048,7 +1076,8 @@ /*expected_prefix_count=*/1, /*expected_network_result=*/net::HTTP_OK, /*expected_operation_result=*/ - HashRealTimeService::OperationResult::kNoCacheDurationError); + HashRealTimeService::OperationResult::kNoCacheDurationError, + /*expected_lookup_response_called=*/true); } TEST_F(HashRealTimeServiceTest, TestLookupFailure_MissingOhttpKey) { GURL url = GURL("https://example.test"); @@ -1388,6 +1417,36 @@ RunBackoffRequestTest(url); } +TEST_F(HashRealTimeServiceTest, TestLogSearchCacheWithNoQueryParamsMetric) { + auto check_metrics = [this](bool expect_cache_hit_if_no_query_params_log, + bool expect_cache_hit_log) { + histogram_tester_->ExpectUniqueSample( + /*name=*/"SafeBrowsing.HPRT.CacheHitAllPrefixesIfNoQueryParams", + /*sample=*/expect_cache_hit_if_no_query_params_log, + /*expected_bucket_count=*/1); + histogram_tester_->ExpectTotalCount("SafeBrowsing.HPRT.CacheHit", + expect_cache_hit_log ? 1 : 0); + histogram_tester_->ExpectTotalCount("SafeBrowsing.HPRT.GetCache.Time", + expect_cache_hit_log ? 1 : 0); + ResetMetrics(); + }; + GURL url = GURL("https://example.test"); + RunSimpleRequest( + /*url=*/url, /*response_full_hashes=*/{}); + check_metrics(/*expect_cache_hit_if_no_query_params_log=*/false, + /*expect_cache_hit_log=*/true); + + GURL url2 = GURL("https://example.test?run=true"); + service_->LogSearchCacheWithNoQueryParamsMetric(url2); + check_metrics(/*expect_cache_hit_if_no_query_params_log=*/true, + /*expect_cache_hit_log=*/false); + + GURL url3 = GURL("https://foo.example.test?run=true"); + service_->LogSearchCacheWithNoQueryParamsMetric(url3); + check_metrics(/*expect_cache_hit_if_no_query_params_log=*/false, + /*expect_cache_hit_log=*/false); +} + TEST_F(HashRealTimeServiceTest, TestIsThreatTypeMoreSevere) { struct TestCase { V5::ThreatType candidate_threat_type;
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc index e1500d1..8937da8 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc
@@ -4,9 +4,11 @@ #include "components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h" +#include "base/rand_util.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "net/base/net_errors.h" +#include "net/http/http_request_headers.h" #include "net/http/http_status_code.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -28,6 +30,20 @@ // The interval that async workflow checks the status of the key. constexpr base::TimeDelta kAsyncFetchCheckInterval = base::Hours(1); +// The error code represents that the server cannot successfully decrypt the +// request. Defined in +// https://www.ietf.org/archive/id/draft-ietf-ohai-ohttp-02.html#name-server-responsibilities +constexpr net::HttpStatusCode kKeyRelatedHttpErrorCode = + net::HTTP_UNPROCESSABLE_CONTENT; + +// The header that the server sets if the server is able to decrypt the request, +// but the key is outdated. +constexpr char kKeyRotatedHeader[] = "X-OhttpPublickey-Rotated"; + +// The maximum delayed time to fetch a new key if the key fetch is triggered +// by the server. +constexpr int kServerTriggeredFetchMaxDelayTimeSec = 60; + constexpr net::NetworkTrafficAnnotationTag kOhttpKeyTrafficAnnotation = net::DefineNetworkTrafficAnnotation("safe_browsing_ohttp_key_fetch", R"( @@ -140,8 +156,54 @@ StartFetch(std::move(callback)); } +void OhttpKeyService::NotifyLookupResponse( + const std::string& key, + int response_code, + scoped_refptr<net::HttpResponseHeaders> headers) { + // Skip server triggered fetch if: + // * The service is disabled. OR + // * The fetch is already scheduled. OR + // * |ohttp_key_| is already cleared up (this can happen if multiple + // requests are kicked off around the same time). OR + // * |ohttp_key_| and |key| are different, which means the notification is + // stale, since the key has changed since the lookup started. + if (!enabled_ || server_triggered_fetch_scheduled_ || !ohttp_key_ || + ohttp_key_->key != key) { + return; + } + + if (response_code == kKeyRelatedHttpErrorCode) { + // The failure is caused by unrecognized key. This is a hard failure, so + // clear the key immediately. + ohttp_key_ = absl::nullopt; + server_triggered_fetch_scheduled_ = true; + // Introduce an artificial delay so the server cannot correlate the key + // fetch request with the original lookup request. + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&OhttpKeyService::MaybeStartServerTriggeredFetch, + weak_factory_.GetWeakPtr(), key), + base::Seconds(base::RandInt(0, kServerTriggeredFetchMaxDelayTimeSec))); + return; + } + + if (response_code == net::HTTP_OK && headers->HasHeader(kKeyRotatedHeader)) { + server_triggered_fetch_scheduled_ = true; + // The key is still valid, but it is close to expiration. It is a soft + // failure, so do not clear the key immediately. + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&OhttpKeyService::MaybeStartServerTriggeredFetch, + weak_factory_.GetWeakPtr(), key), + base::Seconds(base::RandInt(0, kServerTriggeredFetchMaxDelayTimeSec))); + return; + } +} + void OhttpKeyService::StartFetch(Callback callback) { - pending_callbacks_.AddUnsafe(std::move(callback)); + if (callback) { + pending_callbacks_.AddUnsafe(std::move(callback)); + } // If url_loader_ is not null, that means a request is already in progress. // Will notify the callback when it is completed. if (url_loader_) { @@ -211,6 +273,16 @@ base::Time::Now() + kKeyCloseToExpirationThreshold; } +void OhttpKeyService::MaybeStartServerTriggeredFetch(std::string previous_key) { + server_triggered_fetch_scheduled_ = false; + if (ohttp_key_ && ohttp_key_->key != previous_key) { + // The key has already been updated, no action needed. + return; + } + + StartFetch(base::NullCallback()); +} + void OhttpKeyService::PopulateKeyFromPref() { std::string key = pref_service_->GetString(prefs::kSafeBrowsingHashRealTimeOhttpKey);
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h index c494df0..7bc1b02 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h +++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.h
@@ -16,6 +16,10 @@ class PrefService; +namespace net { +class HttpResponseHeaders; +} // namespace net + namespace network { class SharedURLLoaderFactory; class SimpleURLLoader; @@ -55,6 +59,15 @@ // overridden in tests. virtual void GetOhttpKey(Callback callback); + // Notifies the key service with the response from the lookup request. |key| + // is used for the lookup request, |response_code| and |headers| are returned + // from the lookup server. It may trigger a key fetch if the response contains + // key related error or header. This function is overridden in tests. + virtual void NotifyLookupResponse( + const std::string& key, + int response_code, + scoped_refptr<net::HttpResponseHeaders> headers); + // KeyedService: // Called before the actual deletion of the object. void Shutdown() override; @@ -91,6 +104,11 @@ // |ohttp_key_| is unpopulated, is expired, or will soon expire. bool ShouldStartAsyncFetch(); + // Server triggered workflow: + // Starts a key fetch if the |previous_key| is different from |ohttp_key_| or + // the |ohttp_key_| is empty. + void MaybeStartServerTriggeredFetch(std::string previous_key); + // Pref functions: // Gets the key and expiration time from pref. If there is an unexpired key, // populate it into |ohttp_key_|. @@ -126,6 +144,10 @@ // Used to schedule async key fetch. base::OneShotTimer async_fetch_timer_; + // Set to true when a server-triggered fetch is scheduled. Set to false on + // |StartServerTriggeredFetch| called. + bool server_triggered_fetch_scheduled_ = false; + base::WeakPtrFactory<OhttpKeyService> weak_factory_{this}; };
diff --git a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc index 3ee20e5c..f042510 100644 --- a/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc +++ b/components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service_unittest.cc
@@ -24,8 +24,21 @@ namespace { constexpr char kTestOhttpKey[] = "TestOhttpKey"; +constexpr char kTestOldOhttpKey[] = "OldOhttpKey"; +constexpr char kTestNewOhttpKey[] = "NewOhttpKey"; constexpr char kExpectedKeyFetchServerUrl[] = "https://safebrowsingohttpgateway.googleapis.com/key"; + +scoped_refptr<net::HttpResponseHeaders> CreateSuccessHeaders() { + return net::HttpResponseHeaders::TryToCreate("HTTP/1.1 200 OK\r\n"); +} + +scoped_refptr<net::HttpResponseHeaders> CreateKeyRotatedHeaders() { + return net::HttpResponseHeaders::TryToCreate( + "HTTP/1.1 200 OK\r\n" + "X-OhttpPublickey-Rotated: yes\r\n"); +} + } // namespace class OhttpKeyServiceTest : public ::testing::Test { @@ -55,6 +68,26 @@ kTestOhttpKey); } + // Set the current old key in memory, and a pending new key in url_loader. So + // the next time the key is fetched, a new key will be returned. + void SetupOldKeyAndPendingNewKey() { + // Set the expiration time a little longer so the async workflow doesn't + // update the key. + ohttp_key_service_->set_ohttp_key_for_testing( + {kTestOldOhttpKey, base::Time::Now() + base::Days(6)}); + test_url_loader_factory_->AddResponse(kExpectedKeyFetchServerUrl, + kTestNewOhttpKey); + } + + void FastForwardAndVerifyKeyValue(const std::string& expected_key_value) { + // Key fetch triggered by server has a random delay up to 1 minute. + // Wait for 1 minute to make sure the key fetch is completed. + task_environment_.FastForwardBy(base::Minutes(1)); + task_environment_.RunUntilIdle(); + EXPECT_EQ(ohttp_key_service_->get_ohttp_key_for_testing()->key, + expected_key_value); + } + base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; std::unique_ptr<OhttpKeyService> ohttp_key_service_; @@ -125,11 +158,11 @@ TEST_F(OhttpKeyServiceTest, GetOhttpKey_WithValidCache) { SetupSuccessResponse(); ohttp_key_service_->set_ohttp_key_for_testing( - {"OldOhttpKey", base::Time::Now() + base::Hours(1)}); + {kTestOldOhttpKey, base::Time::Now() + base::Hours(1)}); base::MockCallback<OhttpKeyService::Callback> response_callback; // Should return the old key because it has not expired. - EXPECT_CALL(response_callback, Run(Optional(std::string("OldOhttpKey")))) + EXPECT_CALL(response_callback, Run(Optional(std::string(kTestOldOhttpKey)))) .Times(1); ohttp_key_service_->GetOhttpKey(response_callback.Get()); task_environment_.RunUntilIdle(); @@ -138,7 +171,7 @@ TEST_F(OhttpKeyServiceTest, GetOhttpKey_WithExpiredCache) { SetupSuccessResponse(); ohttp_key_service_->set_ohttp_key_for_testing( - {"OldOhttpKey", base::Time::Now() - base::Hours(1)}); + {kTestOldOhttpKey, base::Time::Now() - base::Hours(1)}); base::MockCallback<OhttpKeyService::Callback> response_callback1; // The new key should be fetched because the old key has expired. @@ -148,7 +181,7 @@ task_environment_.RunUntilIdle(); test_url_loader_factory_->AddResponse(kExpectedKeyFetchServerUrl, - "NewOhttpKey"); + kTestNewOhttpKey); task_environment_.FastForwardBy(base::Days(5)); base::MockCallback<OhttpKeyService::Callback> response_callback2; // The new key should not be fetched because the old key has not expired. @@ -252,6 +285,54 @@ base::Time::Now() + base::Days(7)); } +TEST_F(OhttpKeyServiceTest, NotifyLookupResponse_SuccessFetch) { + SetupOldKeyAndPendingNewKey(); + ohttp_key_service_->NotifyLookupResponse(kTestOldOhttpKey, net::HTTP_OK, + CreateSuccessHeaders()); + FastForwardAndVerifyKeyValue(kTestOldOhttpKey); +} + +TEST_F(OhttpKeyServiceTest, NotifyLookupResponse_HeaderHint) { + SetupOldKeyAndPendingNewKey(); + ohttp_key_service_->NotifyLookupResponse(kTestOldOhttpKey, net::HTTP_OK, + CreateKeyRotatedHeaders()); + // Header hint is soft failure, the key is not immediately cleared. + EXPECT_EQ(ohttp_key_service_->get_ohttp_key_for_testing()->key, + kTestOldOhttpKey); + + FastForwardAndVerifyKeyValue(kTestNewOhttpKey); +} + +TEST_F(OhttpKeyServiceTest, NotifyLookupResponse_HeaderHintOnDifferentKey) { + SetupOldKeyAndPendingNewKey(); + ohttp_key_service_->NotifyLookupResponse(kTestOhttpKey, net::HTTP_OK, + CreateKeyRotatedHeaders()); + + // The key is not updated because the server hint is on a different key. + FastForwardAndVerifyKeyValue(kTestOldOhttpKey); +} + +TEST_F(OhttpKeyServiceTest, NotifyLookupResponse_HeaderHintWithError) { + SetupOldKeyAndPendingNewKey(); + + ohttp_key_service_->NotifyLookupResponse( + kTestOldOhttpKey, net::HTTP_FORBIDDEN, CreateKeyRotatedHeaders()); + // Header hint should only take effect when the response code is 200. + FastForwardAndVerifyKeyValue(kTestOldOhttpKey); +} + +TEST_F(OhttpKeyServiceTest, NotifyLookupResponse_KeyRelatedHttpFailure) { + SetupOldKeyAndPendingNewKey(); + + ohttp_key_service_->NotifyLookupResponse(kTestOldOhttpKey, + net::HTTP_UNPROCESSABLE_CONTENT, + CreateSuccessHeaders()); + // HTTP status error is a hard failure, the key should be cleared immediately. + EXPECT_FALSE(ohttp_key_service_->get_ohttp_key_for_testing().has_value()); + + FastForwardAndVerifyKeyValue(kTestNewOhttpKey); +} + TEST_F(OhttpKeyServiceTest, Shutdown) { base::MockCallback<OhttpKeyService::Callback> response_callback; // Pending callbacks should be run during shutdown.
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc index 86e1accc..38754e6 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.cc
@@ -441,11 +441,9 @@ bool is_enabled = is_tailored_security_enabled_; base::Time previous_update = last_updated_; if (success) { - base::Value response_value = ReadResponse(request); - is_enabled = response_value.is_none() - ? false - : response_value.FindBoolKey("history_recording_enabled") - .value_or(false); + base::Value::Dict response_value = ReadResponse(request); + is_enabled = + response_value.FindBool("history_recording_enabled").value_or(false); } std::move(callback).Run(is_enabled, previous_update); @@ -478,13 +476,13 @@ } // static -base::Value TailoredSecurityService::ReadResponse(Request* request) { - base::Value result = base::Value(); +base::Value::Dict TailoredSecurityService::ReadResponse(Request* request) { + base::Value::Dict result; if (request->GetResponseCode() == net::HTTP_OK) { absl::optional<base::Value> json_value = base::JSONReader::Read(request->GetResponseBody()); if (json_value && json_value.value().is_dict()) - result = std::move(*json_value); + result = std::move(json_value->GetDict()); else DLOG(WARNING) << "Non-JSON response received from server."; }
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h index bab8e04..f2dd6ca 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service.h
@@ -19,15 +19,12 @@ #include "base/observer_list.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "base/values.h" #include "components/keyed_service/core/keyed_service.h" #include "components/prefs/pref_change_registrar.h" #include "net/traffic_annotation/network_traffic_annotation.h" #include "url/gurl.h" -namespace base { -class Value; -} - namespace signin { class IdentityManager; } @@ -125,7 +122,7 @@ size_t GetNumberOfPendingTailoredSecurityServiceRequests(); // Extracts a JSON-encoded HTTP response into a dictionary. - static base::Value ReadResponse(Request* request); + static base::Value::Dict ReadResponse(Request* request); // Unpacks the response and calls `callback`. Called by a `Request` when a // tailored security service query sequence has completed. When `success` is
diff --git a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc index 5291988..9714ac2 100644 --- a/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc +++ b/components/safe_browsing/core/browser/tailored_security_service/tailored_security_service_unittest.cc
@@ -57,7 +57,7 @@ // This is sorta an override but override and static don't mix. // This function just calls TailoredSecurityService::ReadResponse. - static base::Value ReadResponse(Request* request); + static base::Value::Dict ReadResponse(Request* request); const std::string& GetExpectedPostData( TailoredSecurityService::Request* request); @@ -205,7 +205,8 @@ return request; } -base::Value TestingTailoredSecurityService::ReadResponse(Request* request) { +base::Value::Dict TestingTailoredSecurityService::ReadResponse( + Request* request) { return TailoredSecurityService::ReadResponse(request); } @@ -396,12 +397,10 @@ " \"history_recording_enabled\": true\n" "}")); // ReadResponse deletes the request - base::Value response_value = + base::Value::Dict response_value = TestingTailoredSecurityService::ReadResponse(request.get()); - ASSERT_TRUE(response_value.is_dict()); - EXPECT_TRUE(response_value.GetDict() - .FindBool("history_recording_enabled") - .value_or(false)); + EXPECT_TRUE( + response_value.FindBool("history_recording_enabled").value_or(false)); // Test that properly formatted response with good response code returns false // as expected. std::unique_ptr<TailoredSecurityService::Request> request2(new TestRequest( @@ -410,12 +409,10 @@ " \"history_recording_enabled\": false\n" "}")); // ReadResponse deletes the request - base::Value response_value2 = + base::Value::Dict response_value2 = TestingTailoredSecurityService::ReadResponse(request2.get()); - ASSERT_TRUE(response_value2.is_dict()); - EXPECT_FALSE(response_value2.GetDict() - .FindBool("history_recording_enabled") - .value_or(false)); + EXPECT_FALSE( + response_value2.FindBool("history_recording_enabled").value_or(false)); // Test that a bad response code returns false. std::unique_ptr<TailoredSecurityService::Request> request3( @@ -425,9 +422,9 @@ " \"history_recording_enabled\": true\n" "}")); // ReadResponse deletes the request - base::Value response_value3 = + base::Value::Dict response_value3 = TestingTailoredSecurityService::ReadResponse(request3.get()); - EXPECT_TRUE(response_value3.is_none()); + EXPECT_TRUE(response_value3.empty()); // Test that improperly formatted response returns false. // Note: we expect to see a warning when running this test similar to @@ -439,9 +436,9 @@ " \"history_recording_enabled\": not true\n" "}")); // ReadResponse deletes the request - base::Value response_value4 = + base::Value::Dict response_value4 = TestingTailoredSecurityService::ReadResponse(request4.get()); - EXPECT_TRUE(response_value4.is_none()); + EXPECT_TRUE(response_value4.empty()); // Test that improperly formatted response (different key) returns false. std::unique_ptr<TailoredSecurityService::Request> request5(new TestRequest( @@ -450,12 +447,10 @@ " \"history_recording\": true\n" "}")); // ReadResponse deletes the request - base::Value response_value5 = + base::Value::Dict response_value5 = TestingTailoredSecurityService::ReadResponse(request5.get()); - ASSERT_TRUE(response_value5.is_dict()); - EXPECT_FALSE(response_value2.GetDict() - .FindBool("history_recording_enabled") - .value_or(false)); + EXPECT_FALSE( + response_value2.FindBool("history_recording_enabled").value_or(false)); } TEST_F(TailoredSecurityServiceTest, TestShutdown) {
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager.cc b/components/safe_browsing/core/browser/verdict_cache_manager.cc index 8458bc0..9a98b62 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager.cc
@@ -767,8 +767,9 @@ std::unordered_map<std::string, std::vector<V5::FullHash>> VerdictCacheManager::GetCachedHashPrefixRealTimeLookupResults( - const std::set<std::string>& hash_prefixes) { - return hash_realtime_cache_->SearchCache(hash_prefixes); + const std::set<std::string>& hash_prefixes, + bool skip_logging) { + return hash_realtime_cache_->SearchCache(hash_prefixes, skip_logging); } void VerdictCacheManager::ScheduleNextCleanUpAfterInterval(
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager.h b/components/safe_browsing/core/browser/verdict_cache_manager.h index 4cf04ad..6fa1b83 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager.h +++ b/components/safe_browsing/core/browser/verdict_cache_manager.h
@@ -109,10 +109,14 @@ const V5::Duration& cache_duration); // Searches the hash-prefix real-time cache object for the requested - // |hash_prefixes|. + // |hash_prefixes|. |skip_logging| specifies whether metric logging should be + // skipped when this function is called. + // TODO(crbug.com/1432308): [Also TODO(thefrog)] Remove |skip_logging| + // parameter after investigation is complete. std::unordered_map<std::string, std::vector<V5::FullHash>> GetCachedHashPrefixRealTimeLookupResults( - const std::set<std::string>& hash_prefixes); + const std::set<std::string>& hash_prefixes, + bool skip_logging); // Overridden from history::HistoryServiceObserver. void OnURLsDeleted(history::HistoryService* history_service,
diff --git a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc index 71c0de7a..85e9f701 100644 --- a/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc +++ b/components/safe_browsing/core/browser/verdict_cache_manager_unittest.cc
@@ -977,13 +977,14 @@ TEST_F(VerdictCacheManagerTest, TestHashPrefixRealTimeLookupCaching) { // Basic test ensuring that the cache manager calls are propagating as // expected to the HashRealTimeCache. - EXPECT_TRUE( - cache_manager_->GetCachedHashPrefixRealTimeLookupResults({"aaaa", "bbbb"}) - .empty()); + EXPECT_TRUE(cache_manager_ + ->GetCachedHashPrefixRealTimeLookupResults( + {"aaaa", "bbbb"}, /*skip_logging=*/false) + .empty()); CacheHashPrefixRealTimeLookupResult(/*cache_duration_seconds=*/300, "aaaa"); CacheHashPrefixRealTimeLookupResult(/*cache_duration_seconds=*/300, "bbbb"); auto cache_results = cache_manager_->GetCachedHashPrefixRealTimeLookupResults( - {"aaaa", "bbbb", "cccc"}); + {"aaaa", "bbbb", "cccc"}, /*skip_logging=*/false); EXPECT_EQ(cache_results.size(), 2u); EXPECT_TRUE(base::Contains(cache_results, "aaaa")); EXPECT_TRUE(base::Contains(cache_results, "bbbb"));
diff --git a/components/segmentation_platform/internal/post_processor/post_processor.cc b/components/segmentation_platform/internal/post_processor/post_processor.cc index 5637bb9..0b553b0d 100644 --- a/components/segmentation_platform/internal/post_processor/post_processor.cc +++ b/components/segmentation_platform/internal/post_processor/post_processor.cc
@@ -181,6 +181,9 @@ auto default_ttl = predicted_result_ttl.default_ttl(); auto time_unit = predicted_result_ttl.time_unit(); + if (ordered_labels.empty()) { + return default_ttl * metadata_utils::ConvertToTimeDelta(time_unit); + } const auto iter = top_label_to_ttl_map.find(ordered_labels[0]); int64_t ttl_to_use = iter == top_label_to_ttl_map.end() ? default_ttl : iter->second;
diff --git a/components/segmentation_platform/internal/post_processor/post_processor_unittest.cc b/components/segmentation_platform/internal/post_processor/post_processor_unittest.cc index 4623c85..698046e 100644 --- a/components/segmentation_platform/internal/post_processor/post_processor_unittest.cc +++ b/components/segmentation_platform/internal/post_processor/post_processor_unittest.cc
@@ -28,6 +28,12 @@ const char kShoppingUser[] = "Shopping"; const char kVoiceUser[] = "Voice"; +// TTL for MultiClassClassifier labels. +const int kNewTabUserTTL = 1; +const int kShareUserTTL = 2; +const int kShoppingUserTTL = 3; +const int kVoiceUserTTL = 4; + // Labels for BinnedClassifier. const char kLowUsed[] = "Low"; const char kMediumUsed[] = "Medium"; @@ -56,8 +62,16 @@ std::array<const char*, 4> labels{kShareUser, kNewTabUser, kVoiceUser, kShoppingUser}; + std::vector<std::pair<std::string, int64_t>> ttl_for_labels{ + {kShareUser, kShareUserTTL}, + {kNewTabUser, kNewTabUserTTL}, + {kVoiceUser, kVoiceUserTTL}, + {kShoppingUser, kShoppingUserTTL}, + }; writer.AddOutputConfigForMultiClassClassifier(labels.begin(), labels.size(), top_k_outputs, threshold); + writer.AddPredictedResultTTLInOutputConfig(ttl_for_labels, kDefaultTTL, + proto::TimeUnit::DAY); return model_metadata.output_config(); } @@ -278,4 +292,15 @@ post_processor.GetTTLForPredictedResult(pred_result)); } +TEST(PostProcessorTest, GetTTLForMultiClassWithNoLabels) { + PostProcessor post_processor; + proto::PredictionResult pred_result = metadata_utils::CreatePredictionResult( + /*model_scores=*/{0, 0, 0, 0}, + GetTestOutputConfigForMultiClassClassifier(/*top_k-outputs=*/2, + /*threshold=*/0.5), + /*timestamp=*/base::Time::Now()); + EXPECT_EQ(base::Days(1) * kDefaultTTL, + post_processor.GetTTLForPredictedResult(pred_result)); +} + } // namespace segmentation_platform
diff --git a/components/signin/public/android/java/res/drawable/account_circle.xml b/components/signin/public/android/java/res/drawable/account_circle.xml index fcc9f027..3b254c93 100644 --- a/components/signin/public/android/java/res/drawable/account_circle.xml +++ b/components/signin/public/android/java/res/drawable/account_circle.xml
@@ -11,6 +11,6 @@ android:viewportWidth="26" android:width="22dp"> <path - android:fillColor="@color/signed_out_avatar_color" + android:fillColor="@color/adaptive_toolbar_preference_header_line" android:pathData="M6.067,18.931C7.204,18.155 8.328,17.559 9.439,17.144C10.549,16.729 11.736,16.521 13,16.521C14.282,16.521 15.483,16.733 16.602,17.157C17.722,17.582 18.841,18.173 19.961,18.931C20.737,17.938 21.283,16.968 21.599,16.02C21.915,15.072 22.073,14.065 22.073,13C22.073,10.436 21.202,8.283 19.459,6.541C17.717,4.798 15.564,3.927 13,3.927C10.436,3.927 8.283,4.798 6.541,6.541C4.798,8.283 3.927,10.436 3.927,13C3.927,14.065 4.09,15.072 4.415,16.02C4.74,16.968 5.29,17.938 6.067,18.931ZM13,13.921C11.917,13.921 11.014,13.555 10.292,12.824C9.57,12.093 9.208,11.194 9.208,10.129C9.208,9.046 9.574,8.139 10.305,7.407C11.037,6.676 11.935,6.31 13,6.31C14.083,6.31 14.986,6.681 15.708,7.421C16.431,8.161 16.792,9.064 16.792,10.129C16.792,11.194 16.426,12.093 15.695,12.824C14.964,13.555 14.065,13.921 13,13.921ZM13,24.212C11.465,24.212 10.016,23.919 8.653,23.332C7.29,22.746 6.098,21.942 5.078,20.922C4.058,19.902 3.255,18.71 2.668,17.347C2.081,15.984 1.788,14.535 1.788,13C1.788,11.465 2.081,10.016 2.668,8.653C3.255,7.29 4.058,6.098 5.078,5.078C6.098,4.058 7.29,3.25 8.653,2.654C10.016,2.058 11.465,1.76 13,1.76C14.535,1.76 15.984,2.058 17.347,2.654C18.71,3.25 19.902,4.058 20.922,5.078C21.942,6.098 22.75,7.29 23.346,8.653C23.942,10.016 24.24,11.465 24.24,13C24.24,14.535 23.942,15.984 23.346,17.347C22.75,18.71 21.942,19.902 20.922,20.922C19.902,21.942 18.71,22.746 17.347,23.332C15.984,23.919 14.535,24.212 13,24.212ZM13,22.073C13.957,22.073 14.887,21.938 15.79,21.667C16.692,21.396 17.604,20.917 18.525,20.231C17.586,19.581 16.67,19.098 15.776,18.782C14.882,18.466 13.957,18.308 13,18.308C12.043,18.308 11.118,18.466 10.224,18.782C9.33,19.098 8.423,19.581 7.502,20.231C8.423,20.917 9.33,21.396 10.224,21.667C11.118,21.938 12.043,22.073 13,22.073ZM13,12.106C13.578,12.106 14.056,11.921 14.436,11.551C14.815,11.181 15.004,10.707 15.004,10.129C15.004,9.533 14.815,9.05 14.436,8.68C14.056,8.31 13.578,8.125 13,8.125C12.422,8.125 11.944,8.31 11.565,8.68C11.186,9.05 10.996,9.533 10.996,10.129C10.996,10.707 11.186,11.181 11.565,11.551C11.944,11.921 12.422,12.106 13,12.106Z"/> </vector>
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 275eb88..73dc182 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Jy het jou wagwoord ingevoer op 'n werf wat nie deur jou organisasie bestuur word nie. Om jou rekening te beskerm, moet jy nie jou wagwoord op ander programme en werwe hergebruik nie.</translation> <translation id="1257553931232494454">zoemvlakke</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk Tab en dan Enter om jou Chrome-instellings te bestuur</translation> -<translation id="1263231323834454256">Leeslys</translation> <translation id="1264309058268477500">Afwisselend</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Toestelontsluiting</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Laai 8</translation> <translation id="1530707389502320859">Die werf wat jy so pas probeer besoek het, lyk vals. Aanvallers boots soms werwe na deur klein veranderinge wat moeilik sigbaar is aan die URL te maak.</translation> <translation id="1532118530259321453">Hierdie bladsy sê</translation> -<translation id="153384715582417236">Dis al vir nou</translation> <translation id="1536390784834419204">Vertaal bladsy</translation> <translation id="1539840569003678498">Verslag is gestuur:</translation> <translation id="1549470594296187301">JavaScript moet geaktiveer wees om hierdie kenmerk te gebruik.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Jou blaaier word bestuur</translation> <translation id="1746113442205726301">Skuif prent langs Y-as</translation> <translation id="1746531169546376413">0 grade</translation> -<translation id="17513872634828108">Oop oortjies</translation> <translation id="1752021286346845558">Posbus 8</translation> <translation id="1753068535428855445">Afsprake en persoonlike advertensies</translation> <translation id="1753706481035618306">Bladsynommer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Probeer Windows Network Diagnostics uitvoer<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Kom meer te wete oor Incognito in Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Jou oop oortjies verskyn hier</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk Tab en dan Enter om jou inligting, privaatheid en sekuriteit in jou Google-rekening te bestuur</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, veelvuldige handelinge is beskikbaar; druk Tab om deur hulle te beweeg</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Groep</translation> <translation id="2576880857912732701">Knoppie om sekuriteitinstellings te bestuur; druk Enter om jou Veiligblaai en meer in Chrome-instellings te bestuur</translation> <translation id="2586657967955657006">Knipbord</translation> -<translation id="2587730715158995865">Deur <ph name="ARTICLE_PUBLISHER" />. Lees dit en <ph name="OTHER_ARTICLE_COUNT" /> ander stories.</translation> <translation id="2587841377698384444">Gids-API-ID:</translation> <translation id="2594318783181750337">Vinnige webaansig:</translation> <translation id="2595719060046994702">Hierdie toestel en rekening word nie deur 'n maatskappy of ander organisasie bestuur nie.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Verkeerde wagwoord</translation> <translation id="5051305769747448211">Regstreekse komedie</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Maak spasie (<ph name="DISK_SPACE_SIZE" />) op jou toestel beskikbaar as jy hierdie lêer met Nabydeling wil stuur}other{Maak spasie (<ph name="DISK_SPACE_SIZE" />) op jou toestel beskikbaar as jy hierdie lêers met Nabydeling wil stuur}}</translation> -<translation id="5056549851600133418">Artikels vir jou</translation> <translation id="5060483733937416656">Jy het gekies om met Windows Hello te verifieer op webwerwe wat <ph name="PROVIDER_ORIGIN" /> gebruik. Hierdie verskaffer het dalk inligting oor jou betaalmetode geberg, wat jy kan <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Het jy bedoel <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Drukgeskiedenis</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Verwerp</translation> <translation id="5239623327352565343">Ligging toegelaat</translation> <translation id="5242889659037569123">Bagasie en reisbykomstighede</translation> +<translation id="5244732203286792411">Laai tans … + Dit kan ’n rukkie neem.</translation> <translation id="5250209940322997802">"Koppel aan netwerk"</translation> <translation id="52517543715119994">Leer meer oor Chrome-kenmerke</translation> <translation id="5251803541071282808">Wolk</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Posbus 7</translation> <translation id="5541546772353173584">Voeg e-posadres by</translation> <translation id="5543722831081909240">180 grade</translation> -<translation id="5545756402275714221">Artikels vir jou</translation> <translation id="5551890439174915351">100x200 mm</translation> <translation id="5552137475244467770">Chrome vergelyk jou wagwoorde van tyd tot tyd met lyste wat aanlyn gepubliseer is. Wanneer dit gedoen word, word jou wagwoorde en gebruikername geënkripteer sodat niemand, insluitend Google, hulle kan lees nie.</translation> <translation id="5556459405103347317">Herlaai</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Liggroenblou</translation> <translation id="6272088941196661550">Hervat jou reis om relevante aktiwiteit in jou Chrome-geskiedenis te sien</translation> <translation id="6272383483618007430">Google-opdatering</translation> -<translation id="6276112860590028508">Bladsye uit jou leeslys verskyn hier</translation> <translation id="627746635834430766">Stoor jou kaart en faktureringadres in jou Google-rekening om volgende keer vinniger te betaal.</translation> <translation id="6279183038361895380">Druk |<ph name="ACCELERATOR" />| om jou merker te wys</translation> <translation id="6280223929691119688">Kan nie by hierdie adres aflewer nie. Kies 'n ander adres.</translation> <translation id="6284292079994426700">26x38 dm.</translation> <translation id="6285507000506177184">Knoppie om aflaaie in Chrome te bestuur; druk Enter om lêers wat jy in Chrome afgelaai het, te bestuur</translation> <translation id="6289939620939689042">Bladsykleur</translation> -<translation id="6290238015253830360">Jou voorgestelde artikels verskyn hier</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Stoor tans …</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Klassieke rock en goue oues</translation> <translation id="769721561045429135">Jy het op die oomblik kaarte wat net op hierdie toestel gebruik kan word Klik Gaan Voort om kaarte na te gaan.</translation> <translation id="7698864304447945242">Wil jy Google Play Dienste vir AR opdateer?</translation> -<translation id="7699293099605015246">Artikels is nie op die oomblik beskikbaar nie</translation> <translation id="7701040980221191251">Geen</translation> <translation id="7701544340847569275">Opdatering afgehandel met foute</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Gaan voort na <ph name="SITE" /> (onveilig)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb index a9fb667..b9b1987f 100644 --- a/components/strings/components_strings_am.xtb +++ b/components/strings/components_strings_am.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">የእርስዎን የይለፍ ቃል በድርጅትዎ በማይተዳደር ጣቢያ ላይ አስገብተዋል። የእርስዎን መለያ ለመጠበቅ ሲባል የእርስዎን የይለፍ ቃል በሌሎች መተግበሪያዎች እና ጣቢያዎች ላይ አይጠቀሙበት።</translation> <translation id="1257553931232494454">የማጉላት ደረጃዎች</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ የChrome ቅንብሮችን ለማቀናበር ትርን ከዚያ አስገባን ይጫኑ</translation> -<translation id="1263231323834454256">የንባብ ዝርዝር</translation> <translation id="1264309058268477500">ተለዋጭ</translation> <translation id="1264974993859112054">ሰፖርቶች</translation> <translation id="1266469291454105242">የመሣሪያ መክፈቻ</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">መሳቢያ 8</translation> <translation id="1530707389502320859">አሁን ለመጎብኘት የሞከሩት ጣቢያ የሐስት ይመስላል። አጥቂዎች አንዳንድ ግ ጊዜ በዩአርኤሉ ላይ ለመታየት የሚያስቸግሩ አነስተኛ ለውጦችን በማድረግ ጥኣቢያዎችን ያስመስላሉ።</translation> <translation id="1532118530259321453">ይህ ገጽ እንዲህ ይላል፦</translation> -<translation id="153384715582417236">ለአሁን ያለው ይኸው ነው</translation> <translation id="1536390784834419204">ገጽ ተርጉም</translation> <translation id="1539840569003678498">ሪፖርት ተልኳል፦</translation> <translation id="1549470594296187301">ይህን ባህሪ ለመጠቀም ጃቫስክሪፕት መንቃት አለበት።</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">የእርስዎ አሳሽ ይተዳደራል</translation> <translation id="1746113442205726301">የምስል Y ፈረቃ</translation> <translation id="1746531169546376413">0 ዲግሪ</translation> -<translation id="17513872634828108">ትሮችን ክፈት</translation> <translation id="1752021286346845558">የመልዕክት ሳጥን 8</translation> <translation id="1753068535428855445">ለፍቅር መገናኘት እና ራስን ማስተዋወቅ</translation> <translation id="1753706481035618306">የገጽ ቁጥር</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />የWindows አውታረ መረብ መመርመሪያውን ለማሄድ ይሞክሩ<ph name="END_LINK" />።</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />በChromium ውስጥ ስላለ ማንነት የማያሳውቅ ተጨማሪ ይወቁ<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">የእርስዎ ክፍት ትሮች እዚህ ይመጣሉ</translation> <translation id="1791429645902722292">Google ዘመናዊ ቁልፍ</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ በGoogle መለያዎ ውስጥ የእርስዎን መረጃ፣ ግላዊነት እና ደህንነት ለማስተዳደር ትር ከዚያ አስገባን ይጫኑ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />፣ ርካታ እርምጃዎች ይገኛሉ፣ በእነሱ ውስጥ ለማሰስ ትርን ይጫኑ</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">ቡድን</translation> <translation id="2576880857912732701">የደህንነት ቅንብሮችን ያቀናብሩ፣ በChrome ቅንብሮች ውስጥ የጥንቃቄ አሰሳዎን እና ተጨማሪ ነገሮችን ለማቀናበር አስገባን ይጫኑ</translation> <translation id="2586657967955657006">የቅንጥብ ሰሌዳ</translation> -<translation id="2587730715158995865">ከ<ph name="ARTICLE_PUBLISHER" />። ይህን እና <ph name="OTHER_ARTICLE_COUNT" /> ሌሎች ዘገባዎችን ያንብቡ።</translation> <translation id="2587841377698384444">የማውጫ የኤፒአይ መታወቂያ፦</translation> <translation id="2594318783181750337">ፈጣን የድር እይታ፦</translation> <translation id="2595719060046994702">ይህ መሣሪያ እና መለያ በኩባንያ ወይም ሌላ ድርጅት አይተዳደሩም።</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">ትክክል ያልሆነ የይለፍ ቃል</translation> <translation id="5051305769747448211">የቀጥታ ስርጭት አስቂኝ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{አቅራቢያ አጋራን በመጠቀም ይህንን ፋይል ለመላክ በመሣሪያዎ ላይ ቦታ (<ph name="DISK_SPACE_SIZE" />) ያስለቅቁ}one{አቅራቢያ አጋራን በመጠቀም እነዚህን ፋይሎች ለመላክ በመሣሪያዎ ላይ ቦታ (<ph name="DISK_SPACE_SIZE" />)ን ያስለቅቁ}other{አቅራቢያ አጋራን በመጠቀም እነዚህን ፋይሎች ለመላክ በመሣሪያዎ ላይ ቦታ (<ph name="DISK_SPACE_SIZE" />)ን ያስለቅቁ}}</translation> -<translation id="5056549851600133418">ለእርስዎ የሚሆኑ ጽሑፎች</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" />ን በሚጠቀሙ ድር ጣቢያዎች ላይ በWindows Hello ለማረጋገጥ መርጠዋል። ይህ አቅራቢ ስለእርስዎ የመክፈያ ዘዴ መረጃ አከማችቶ ሊሆን ይችላል። እርስዎ ይህንን <ph name="LINK_TEXT" /> ይችላሉ።</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> ለማለት ፈልገው ነው?</translation> <translation id="5066056036849835175">የማተም ታሪክ</translation> @@ -1856,7 +1850,6 @@ <translation id="5541086400771735334">የመልዕክት ሳጥን 7</translation> <translation id="5541546772353173584">ኢሜይል ያክሉ</translation> <translation id="5543722831081909240">180 ዲግሪ</translation> -<translation id="5545756402275714221">ለእርስዎ የሚሆኑ ጽሑፎች</translation> <translation id="5551890439174915351">100 x 200 ሚሜ</translation> <translation id="5552137475244467770">Chrome በተወሰነ ጊዜ ልዩነት በመስመር ላይ ከታተሙ ዝርዝሮች አንጻር የእርስዎን የይለፍ ቃላት ይፈትሻል። ይህን በሚያደርግበት ጊዜ፣ የእርስዎ የይለፍ ቃላት እና የተጠቃሚ ስሞች Googleን ጨምሮ በማንም ሌላ ወገን እንዳይነበቡ ይመሣጠራሉ።</translation> <translation id="5556459405103347317">ዳግም ጫን</translation> @@ -2138,14 +2131,12 @@ <translation id="6266934640124581640">ፈዘዝ ያለ ውሃ አረንጓዴ ሰማያዊ</translation> <translation id="6272088941196661550">በእርስዎ የChrome ታሪክ ውስጥ አግባብነት ያለው እንቅስቃሴን ለማየት ጉዞዎን ከቆመበት ይቀጥሉ</translation> <translation id="6272383483618007430">የGoogle ዝማኔ</translation> -<translation id="6276112860590028508">ከእርስዎ የንባብ ዝርዝር የመጡ ገጾች እዚህ ይታያሉ</translation> <translation id="627746635834430766">በሚቀጥለው ጊዜ በበለጠ ፍጥነት ለመክፈል ካርድዎን እና የማስከፈያ አድራሻዎን በGoogle መለያዎ ላይ ያስቀምጡ።</translation> <translation id="6279183038361895380">የእርስዎን ጠቋሚ ለማሳየት |<ph name="ACCELERATOR" />| ይጫኑ</translation> <translation id="6280223929691119688">ወደዚህ አድራሻ ማድረስ አይቻልም። የተለየ አድራሻ ይምረጡ።</translation> <translation id="6284292079994426700">26 x 38 ኢንች</translation> <translation id="6285507000506177184">በChrome አዝራር ውስጥ ውርዶችን ያቀናብሩ፣ በChrome ውስጥ ያወረዷቸውን ፋይሎች ለማቀናበር አስገባን ይጫኑ</translation> <translation id="6289939620939689042">ገጽ ቀለም</translation> -<translation id="6290238015253830360">የእርስዎ የተጠቆሙ ዘገባዎች እዚህ ይመጣሉ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">ካርድ ማረጋገጫ ኮድ፦</translation> <translation id="6295855836753816081">በማስቀመጥ ላይ...</translation> @@ -2745,7 +2736,6 @@ <translation id="7696089921647603491">የቆየ ተወዳጅ ሮክ እና አንጋፋዎች</translation> <translation id="769721561045429135">አሁን ላይ በዚህ መሣሪያ ላይ ብቻ ጥቅም ላይ ሊውሉ የሚችሉ ካርዶች አልዎት ካርዶችን መገምገም ለመቀጠል ጠቅ ያድርጉ።</translation> <translation id="7698864304447945242">የGoogle Play አገልግሎቶችን ለኤአር ያዘምኑ?</translation> -<translation id="7699293099605015246">ጽሑፎች አሁን አይገኙም</translation> <translation id="7701040980221191251">ምንም</translation> <translation id="7701544340847569275">ማዘመን ከስህተት ጋር ተጠናቅቋል</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ወደ <ph name="SITE" /> ቀጥል (ደህንነቱ ያልተጠበቀ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index d2e85de..a4c1e69 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">لقد أدخلتَ كلمة المرور في موقع إلكتروني لا تديره مؤسستك. ينصح بعدم استخدام كلمة المرور مجددًا في التطبيقات ومواقع الويب الأخرى لحماية حسابك.</translation> <translation id="1257553931232494454">مستويات التكبير أو التصغير</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />، اضغط على مفتاح Tab ثم مفتاح Enter لإدارة إعدادات Chrome.</translation> -<translation id="1263231323834454256">قائمة القراءة</translation> <translation id="1264309058268477500">الدُرج البديل</translation> <translation id="1264974993859112054">رياضة</translation> <translation id="1266469291454105242">فتح قفل الجهاز</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">الدُرج 8</translation> <translation id="1530707389502320859">يبدو الموقع الإلكتروني الذي حاولت الانتقال إليه مزيفًا. يحاكي المهاجمون أحيانًا المواقع الإلكترونية من خلال إجراء تغييرات بسيطة يصعب رؤيتها على عنوان URL.</translation> <translation id="1532118530259321453">تعرض هذه الصفحة</translation> -<translation id="153384715582417236">هذا كل شيء الآن</translation> <translation id="1536390784834419204">ترجمة الصفحة</translation> <translation id="1539840569003678498">تاريخ ووقت إرسال الإبلاغ:</translation> <translation id="1549470594296187301">يجب تفعيل JavaScript لاستخدام هذه الميزة.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">إدارة متصفِّحك</translation> <translation id="1746113442205726301">Image Y shift</translation> <translation id="1746531169546376413">0 درجة</translation> -<translation id="17513872634828108">علامات التبويب المفتوحة</translation> <translation id="1752021286346845558">صندوق البريد الإلكتروني 8</translation> <translation id="1753068535428855445">مواعدة وإعلانات شخصية</translation> <translation id="1753706481035618306">رقم الصفحة</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />تجربة تشغيل بيانات التشخيص لشبكة Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />مزيد من المعلومات حول وضع التصفّح المتخفي في متصفّح Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">تظهر علامات التبويب المفتوحة هنا</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />: اضغط على مفتاح التبويب (Tab) ثم Enter لإدارة المعلومات والخصوصية والأمان في حسابك على Google.</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />، تتوفّر عدة إجراءات، اضغط على مفتاح التبويب (Tab) للتنقّل بينها.</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">جمع</translation> <translation id="2576880857912732701">زر "إدارة إعدادات الأمان": اضغط على مفتاح Enter لإدارة إعدادات ميزة "التصفّح الآمن" وغيرها في إعدادات Chrome</translation> <translation id="2586657967955657006">الحافظة</translation> -<translation id="2587730715158995865">من <ph name="ARTICLE_PUBLISHER" />. يمكنك قراءة هذه المقالة و<ph name="OTHER_ARTICLE_COUNT" /> قصص أخرى.</translation> <translation id="2587841377698384444">رقم تعريف واجهة برمجة التطبيقات الدليل:</translation> <translation id="2594318783181750337">العرض السريع على الويب:</translation> <translation id="2595719060046994702">لا تتم إدارة جهازك وحسابك من خلال شركة أو مؤسسة أخرى.</translation> @@ -1668,7 +1663,6 @@ <translation id="5045550434625856497">كلمة مرور غير صحيحة</translation> <translation id="5051305769747448211">عروض كوميدية مباشرة</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{لإرسال هذا الملف باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}zero{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}two{لإرسال هذين الملفَين باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}few{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}many{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}other{لإرسال هذه الملفات باستخدام ميزة "المشاركة عن قرب"، عليك إخلاء مساحة قدرها (<ph name="DISK_SPACE_SIZE" />) على جهازك.}}</translation> -<translation id="5056549851600133418">مقالات لك</translation> <translation id="5060483733937416656">لقد اخترت إثبات هويتك باستخدام Windows Hello على المواقع الإلكترونية التي تستخدم مقدِّم الخدمة <ph name="PROVIDER_ORIGIN" />. قد يكون مقدِّم الخدمة احتفظ بمعلومات حول طريقة الدفع التي تم استخدامها، ويمكنك <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">هل كنت تقصد <ph name="LOOKALIKE_DOMAIN" />؟</translation> <translation id="5066056036849835175">سجلّ الطباعة</translation> @@ -1863,7 +1857,6 @@ <translation id="5541086400771735334">صندوق البريد الإلكتروني 7</translation> <translation id="5541546772353173584">إضافة البريد الإلكتروني</translation> <translation id="5543722831081909240">180 درجة</translation> -<translation id="5545756402275714221">مقالات لك</translation> <translation id="5551890439174915351">100 × 200 ملم</translation> <translation id="5552137475244467770">يتحقَّق Chrome من كلمات مرورك بشكلٍ دوري في البيانات التي تم نشرها على الإنترنت. وأثناء هذه العملية، تكون كلمات المرور وأسماء المستخدمين مشفّرة، ولا يمكن لأي مستخدم آخر الاطِّلاع على هذه البيانات بما في ذلك Google.</translation> <translation id="5556459405103347317">إعادة التحميل</translation> @@ -2145,14 +2138,12 @@ <translation id="6266934640124581640">أزرق مخضر فاتح</translation> <translation id="6272088941196661550">يمكنك استئناف سجلّ أنشطة البحث والتصفُّح للاطّلاع على النشاط ذي الصلة في سجلّ Chrome.</translation> <translation id="6272383483618007430">تحديث Google</translation> -<translation id="6276112860590028508">تظهر الصفحات من قائمة القراءة التابعة لك هنا</translation> <translation id="627746635834430766">للدفع بشكلٍ أسرع في المرة القادمة، يجب حفظ البطاقة وعنوان إرسال الفواتير في حسابك على Google.</translation> <translation id="6279183038361895380">اضغط على |<ph name="ACCELERATOR" />| لعرض المؤشر</translation> <translation id="6280223929691119688">لا يمكن التسليم على هذا العنوان. اختَر عنوانًا آخر.</translation> <translation id="6284292079994426700">26 × 38 بوصة</translation> <translation id="6285507000506177184">زر إدارة عمليات التنزيل في Chrome: اضغط على مفتاح Enter لإدارة الملفات التي تم تنزيلها في Chrome</translation> <translation id="6289939620939689042">لون الصفحة</translation> -<translation id="6290238015253830360">ستظهر المقالات المقترحة هنا</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">جارٍ الحفظ...</translation> @@ -2752,7 +2743,6 @@ <translation id="7696089921647603491">موسيقى "روك" كلاسيكية وقديمة</translation> <translation id="769721561045429135">تمتلك حتى الآن بطاقات يمكنك استخدامها فقط على هذا الجهاز. انقر على "متابعة" لمراجعة البطاقات</translation> <translation id="7698864304447945242">هل تريد تحديث "خدمات Google Play للواقع المعزّز"؟</translation> -<translation id="7699293099605015246">المقالات غير متاحة الآن</translation> <translation id="7701040980221191251">لا يوجد</translation> <translation id="7701544340847569275">اكتملت عملية التحديث مع حدوث أخطاء</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />متابعة إلى <ph name="SITE" /> (غير آمن)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_as.xtb b/components/strings/components_strings_as.xtb index f12518b1..dd00f37e 100644 --- a/components/strings/components_strings_as.xtb +++ b/components/strings/components_strings_as.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">আপুনি আপোনাৰ প্ৰতিষ্ঠানে পৰিচালনা নকৰা এটা ছাইটত নিজৰ পাছৱৰ্ডটো দিছে। আপোনাৰ একাউণ্টটো সুৰক্ষিত কৰিবলৈ আপোনাৰ পাছৱৰ্ডটো অন্য এপ্ আৰু ছাইটত পুনৰ ব্যৱহাৰ নকৰিব।</translation> <translation id="1257553931232494454">জুমৰ স্তৰ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, আপোনাৰ Chromeৰ ছেটিং পৰিচালনা কৰিবলৈ প্ৰথমে টেব আৰু তাৰ পাছত এণ্টাৰ টিপক</translation> -<translation id="1263231323834454256">পঢ়াৰ সূচী</translation> <translation id="1264309058268477500">বিকল্প</translation> <translation id="1264974993859112054">খেলা-ধূলা</translation> <translation id="1266469291454105242">ডিভাইচ আনলক কৰাৰ সুবিধা</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ট্ৰে’ ৮</translation> <translation id="1530707389502320859">আপুনি এইমাত্ৰ চাবলৈ প্ৰয়াস কৰা ছাইটটো নকল যেন লাগিছে৷ আক্ৰমণকাৰীসকলে কেতিয়াবা ইউআৰএলত ক্ষুদ্ৰ, চকুৰে মনিব নোৱাৰা সলনি কৰি ছাইটসমূহ নকল কৰিব পাৰে৷</translation> <translation id="1532118530259321453">এই পৃষ্ঠাটোৱে কৈছে</translation> -<translation id="153384715582417236">এতিয়াৰ বাবে ইমানেই</translation> <translation id="1536390784834419204">পৃষ্ঠাখন অনুবাদ কৰক</translation> <translation id="1539840569003678498">অভিযোগ পঠিওৱা হ’ল:</translation> <translation id="1549470594296187301">এই সুবিধাটো ব্যৱহাৰ কৰিবলৈ হ'লে JavaScript সক্ষম কৰা থাকিবই লাগিব।</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">আপোনাৰ ব্ৰাউজাৰটো পৰিচালিত</translation> <translation id="1746113442205726301">প্ৰতিচ্ছবি Y শ্বিফ্ট</translation> <translation id="1746531169546376413">০ ডিগ্ৰী</translation> -<translation id="17513872634828108">খুলি ৰখা টেবসমূহ</translation> <translation id="1752021286346845558">মেইলবক্স ৮</translation> <translation id="1753068535428855445">ডেটিং আৰু ব্যক্তিগত সেৱা</translation> <translation id="1753706481035618306">পৃষ্ঠাৰ সংখ্যা</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows Network Diagnostics চলাই চাওক<ph name="END_LINK" />।</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromiumত ইনক’গনিট’ৰ বিষয়ে অধিক জানক<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">আপুনি খোলা টেববোৰ ইয়াত দেখা যাব</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, আপোনাৰ Google একাউণ্টত নিজৰ তথ্য, গোপনীয়তা আৰু সুৰক্ষা পৰিচালনা কৰিবলৈ প্ৰথমে টেব তাৰ পাছত এণ্টাৰ টিপক</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, একাধিক কাৰ্য উপলব্ধ, সেইবিলাক এটা এটাকৈ চাবলৈ টেব টিপক</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">গোট</translation> <translation id="2576880857912732701">সুৰক্ষা ছেটিং পৰিচালনা কৰাৰ বুটাম, Chromeৰ ছেটিঙত আপোনাৰ সুৰক্ষিত ব্ৰাউজিং আৰু বহুতো সুবিধা পৰিচালনা কৰিবলৈ এণ্টাৰ টিপক</translation> <translation id="2586657967955657006">ক্লিপব'ৰ্ড</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" />ৰ পৰা। <ph name="OTHER_ARTICLE_COUNT" /> আৰু অন্য লেখাসমূহ পঢ়ক।</translation> <translation id="2587841377698384444">ডাইৰেক্টৰী এপিআই আইডি:</translation> <translation id="2594318783181750337">দ্ৰুত ৱেব ভিউ:</translation> <translation id="2595719060046994702">এই ডিভাইচ আৰু একাউণ্ট কোনো কোম্পানী বা অন্য প্ৰতিষ্ঠানে পৰিচালনা নকৰে।</translation> @@ -1660,7 +1655,6 @@ <translation id="5045550434625856497">ভুল পাছৱৰ্ড</translation> <translation id="5051305769747448211">লাইভ কমেডী</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby Share ব্যৱহাৰ কৰি এই ফাইলটো পঠিয়াবলৈ, আপোনাৰ ডিভাইচত ঠাই (<ph name="DISK_SPACE_SIZE" />) খালী কৰক}one{Nearby Share ব্যৱহাৰ কৰি এই ফাইলসমূহ পঠিয়াবলৈ, আপোনাৰ ডিভাইচত ঠাই (<ph name="DISK_SPACE_SIZE" />) খালী কৰক}other{Nearby Share ব্যৱহাৰ কৰি এই ফাইলসমূহ পঠিয়াবলৈ, আপোনাৰ ডিভাইচত ঠাই (<ph name="DISK_SPACE_SIZE" />) খালী কৰক}}</translation> -<translation id="5056549851600133418">আপোনাৰ বাবে লেখনি</translation> <translation id="5060483733937416656">আপুনি <ph name="PROVIDER_ORIGIN" /> ব্যৱহাৰ কৰা ৱেবছাইটসমূহত Windows Helloৰ জৰিয়তে সত্যাপন কৰিবলৈ বাছনি কৰিছে। এই প্ৰদানকাৰীয়ে হয়তো আপোনাৰ পৰিশোধ পদ্ধতিৰ বিষয়ে তথ্য ষ্ট’ৰ কৰি ৰাখিব পাৰে, যিটো আপুনি <ph name="LINK_TEXT" /> পাৰে।</translation> <translation id="5061227663725596739">আপুনি <ph name="LOOKALIKE_DOMAIN" />ৰ কথা বুজাব বিচাৰিছিল নেকি?</translation> <translation id="5066056036849835175">প্ৰিণ্ট কৰাৰ ইতিহাস</translation> @@ -1738,6 +1732,8 @@ <translation id="5234764350956374838">অগ্ৰাহ্য কৰক</translation> <translation id="5239623327352565343">অৱস্থানৰ অনুমতি আছে</translation> <translation id="5242889659037569123">ভ্ৰমণকাৰীৰ মাল-বস্তু আৰু ভ্ৰমণৰ আনুষংগিক সামগ্ৰী</translation> +<translation id="5244732203286792411">ল’ড কৰি থকা হৈছে... + এইটোৰ বাবে এক মিনিটমান লাগিব পাৰে।</translation> <translation id="5250209940322997802">"নেটৱর্কত সংযোগ কৰক"</translation> <translation id="52517543715119994">Chromeৰ সুবিধাসমূহৰ বিষয়ে জানক</translation> <translation id="5251803541071282808">ক্লাউড</translation> @@ -1855,7 +1851,6 @@ <translation id="5541086400771735334">মেইলবক্স ৭</translation> <translation id="5541546772353173584">ইমেইল যোগ কৰক</translation> <translation id="5543722831081909240">১৮০ ডিগ্ৰী</translation> -<translation id="5545756402275714221">আপোনাৰ বাবে লেখা</translation> <translation id="5551890439174915351">১০০ x ২০০ মি.মি.</translation> <translation id="5552137475244467770">Chromeএ আপোনাৰ পাছৱৰ্ডসমূহ অনলাইনত প্ৰকাশ কৰা তালিকাসমূহৰ লগত সময়ে সময়ে তুলনা কৰে। এনে কৰোঁতে আপোনাৰ পাছৱৰ্ডসমূহ আৰু ব্যৱহাৰকাৰীৰ নামসমূহ এনক্ৰিপ্ট কৰা হয়, গতিকে সেইবোৰ Googleকে ধৰি অন্য কোনেও পঢ়িব নোৱাৰে।</translation> <translation id="5556459405103347317">পুনৰ ল’ড কৰক</translation> @@ -2136,14 +2131,12 @@ <translation id="6266934640124581640">পাতল নীলা</translation> <translation id="6272088941196661550">আপোনাৰ Chromeৰ ইতিহাসত প্ৰাসংগিক কাৰ্যকলাপ চাবলৈ আপোনাৰ যাত্ৰা পুনৰ আৰম্ভ কৰক</translation> <translation id="6272383483618007430">Google আপডে’ট</translation> -<translation id="6276112860590028508">আপোনাৰ পঢ়াৰ সূচীৰ পৃষ্ঠাসমূহ ইয়াত প্ৰদর্শন হয়</translation> <translation id="627746635834430766">পৰৱৰ্তী সময়ত দ্ৰুতভাৱে পৰিশোধ কৰিবলৈ আপোনাৰ কাৰ্ড আৰু বিলিঙৰ ঠিকনা নিজৰ Google একাউণ্টত ছেভ কৰক।</translation> <translation id="6279183038361895380">আপোনাৰ কাৰ্ছৰটো দেখুৱাবলৈ |<ph name="ACCELERATOR" />| টিপক</translation> <translation id="6280223929691119688">এই ঠিকনাটোত পঠিয়াব নোৱাৰি৷ অন্য এটা ঠিকনা বাছনি কৰক।</translation> <translation id="6284292079994426700">২৬ x ৩৮ ইঞ্চি</translation> <translation id="6285507000506177184">Chrome বুটামত ডাউনল’ড পৰিচালনা কৰক, আপুনি Chromeৰ জৰিয়তে ডাউনল’ড কৰা ফাইল পৰিচালনা কৰিবলৈ এণ্টাৰ টিপক</translation> <translation id="6289939620939689042">পৃষ্ঠাৰ ৰং</translation> -<translation id="6290238015253830360">আপুনি পৰামৰ্শ দিয়া প্ৰবন্ধবোৰ ইয়াত দেখা যাব</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">চিভিচি:</translation> <translation id="6295855836753816081">ছেভ কৰি থকা হৈছে...</translation> @@ -2743,7 +2736,6 @@ <translation id="7696089921647603491">ক্লাছিক ৰক আৰু পুৰণি সংগীত</translation> <translation id="769721561045429135">এই মুহূৰ্তত আপোনাৰ লগত কেইখনমান কাৰ্ড আছে যিবোৰ কেৱল এই ডিভাইচটোতহে ব্যৱহাৰ কৰিব পাৰি। কাৰ্ডবোৰৰ পৰ্যালোচনা কৰিবলৈ অব্যাহত ৰাখক-ত ক্লিক কৰক</translation> <translation id="7698864304447945242">Google Play Services for AR আপডে’ট কৰিবনে?</translation> -<translation id="7699293099605015246">প্ৰৱন্ধবোৰ এই মুহূৰ্তত উপলব্ধ নহয়</translation> <translation id="7701040980221191251">নাই</translation> <translation id="7701544340847569275">আসোঁৱাহৰ সৈতে আপডে’ট সম্পূৰ্ণ হৈছে</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> (অসুৰক্ষিত) লৈ যাওক<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_az.xtb b/components/strings/components_strings_az.xtb index a790579d..db59554 100644 --- a/components/strings/components_strings_az.xtb +++ b/components/strings/components_strings_az.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Təşkilatınızın idarə etmədiyi saytda parolunuzu daxil etdiniz. Hesabınızı qorumaq üçün digər tətbiq və saytlarda parolunuzdan təkrar istifadə etməyin.</translation> <translation id="1257553931232494454">zoom səviyyələri</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq Chrome ayarlarınızı idarə edin</translation> -<translation id="1263231323834454256">Oxu siyahısı</translation> <translation id="1264309058268477500">Alternativ</translation> <translation id="1264974993859112054">İdman</translation> <translation id="1266469291454105242">Cihazın kiliddən çıxarılması</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Qab 8</translation> <translation id="1530707389502320859">Bu, saxta sayta oxşayır. Hücumçular bəzən URL-a kiçik, çətin sezilə bilən dəyişikliklər etməklə saytları təqlid edir.</translation> <translation id="1532118530259321453">Bu səhifə deyir:</translation> -<translation id="153384715582417236">İndilik bu qədər</translation> <translation id="1536390784834419204">Səhifəni tərcümə edin</translation> <translation id="1539840569003678498">Şikayət göndərildi:</translation> <translation id="1549470594296187301">JavaScript bu funksiyanı istifadə etmək üçün aktiv olmalıdır.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Brauzer idarə edilir</translation> <translation id="1746113442205726301">Şəklin Y oxu üzrə yerdəyişməsi</translation> <translation id="1746531169546376413">0 dərəcə</translation> -<translation id="17513872634828108">Panelləri açın</translation> <translation id="1752021286346845558">Poçt qutusu 8</translation> <translation id="1753068535428855445">Tanışlıq</translation> <translation id="1753706481035618306">Səhifə nömrəsi</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows Şəbəkə Diaqnostikasını işlətməyə çalışın<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium'da Anonim Rejim barədə məlumat<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Açıq tablarınız burada görünür</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab düyməsi, sonra Enter düyməsinə basaraq Google Hesabınızda məlumat, məxfilik və təhlükəsizliyinizi idarə edin</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, bir neçə əməliyyat əlçatandır, onları nəzərdən keçirmək üçün Tab düyməsinə basın</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Qrup</translation> <translation id="2576880857912732701">"Təhlükəsizlik ayarlarını idarə edin" düyməsi, Chrome ayarlarında Təhlükəsiz Baxış və daha çoxunu idarə etmək üçün Enter düyməsinə basın</translation> <translation id="2586657967955657006">Mübadilə buferi</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> adlı şəxsdən. Bunu və digər <ph name="OTHER_ARTICLE_COUNT" /> hekayəni oxuyun.</translation> <translation id="2587841377698384444">Direktoriya API ID:</translation> <translation id="2594318783181750337">Sürətli veb görünüşü:</translation> <translation id="2595719060046994702">Bu cihaz və hesab şirkət və ya başqa təşkilat tərəfindən idarə olunmur.</translation> @@ -1660,7 +1655,6 @@ <translation id="5045550434625856497">Yanlış parol</translation> <translation id="5051305769747448211">Canlı komediya</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Yaxınlıqda Paylaşım ilə bu faylı göndərmək üçün cihazınızda (<ph name="DISK_SPACE_SIZE" />) yer boşaldın}other{Yaxınlıqda Paylaşım ilə bu faylları göndərmək üçün cihazınızda (<ph name="DISK_SPACE_SIZE" />) yer boşaldın}}</translation> -<translation id="5056549851600133418">Sizin üçün məqalələr</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> istifadə edən saytlarda Windows Hello ilə doğrulamağı seçmisiniz. Bu provayder ödəniş metodunuz haqqında məlumat saxlamış ola bilər, onu <ph name="LINK_TEXT" /> ünvanında tapa bilərsiniz.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> nəzərdə tuturdunuz?</translation> <translation id="5066056036849835175">Çap tarixçəsi</translation> @@ -1738,6 +1732,8 @@ <translation id="5234764350956374838">Kənarlaşdırın</translation> <translation id="5239623327352565343">Məkana icazə verilib</translation> <translation id="5242889659037569123">Baqaj və səyahət aksesuarları</translation> +<translation id="5244732203286792411">Yüklənir... + Bir dəqiqə çəkə bilər.</translation> <translation id="5250209940322997802">"Şəbəkəyə qoşulun"</translation> <translation id="52517543715119994">Chrome funksiyaları haqqında öyrənin</translation> <translation id="5251803541071282808">Bulud</translation> @@ -1855,7 +1851,6 @@ <translation id="5541086400771735334">Poçt qutusu 7</translation> <translation id="5541546772353173584">E-poçt Əlavə Edin</translation> <translation id="5543722831081909240">180 dərəcə</translation> -<translation id="5545756402275714221">Sizin üçün təklif edilən məqalələr</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome müntəzəm olaraq onlayn yayımlanan siyahılar əsasında parollarınızı yoxlayır. Bunu edərkən, parollar və istifadəçi adları şifrələnir ki, Google daxil olmaqla, heç kim onları oxuya bilməsin.</translation> <translation id="5556459405103347317">Yenidən yükləyin</translation> @@ -2137,14 +2132,12 @@ <translation id="6266934640124581640">Açıq-firuzəyi</translation> <translation id="6272088941196661550">Chrome tarixçəsində əlaqəli fəaliyyəti görmək üçün baxışa davam edin</translation> <translation id="6272383483618007430">Google Güncəlləməsi</translation> -<translation id="6276112860590028508">Oxu siyahısının səhifələri burada görünəcək</translation> <translation id="627746635834430766">Növbəti dəfə daha sürətli ödəniş etmək üçün kartı və faktura ünvanını Google Hesabınızda yadda saxlayın.</translation> <translation id="6279183038361895380">Kursorunuzu göstərmək üçün |<ph name="ACCELERATOR" />| basın</translation> <translation id="6280223929691119688">Bu ünvana çatdırmaq mümkün deyil. Başqa ünvan seçin.</translation> <translation id="6284292079994426700">26 x 38 düym</translation> <translation id="6285507000506177184">"Chrome'da endirmələri idarə edin" düyməsi, Enter düyməsinə basaraq Chrome'da endirdiyiniz faylları idarə edin</translation> <translation id="6289939620939689042">Səhifə Rəngi</translation> -<translation id="6290238015253830360">Təklif edilən məqalələriniz burada görünür</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Yadda saxlanılır...</translation> @@ -2744,7 +2737,6 @@ <translation id="7696089921647603491">Klassik rok və köhnə musiqilər</translation> <translation id="769721561045429135">Hazırda yalnız bu cihazda istifadə edilə bilən kartlar var Kartlara baxmaq üçün "Davam edin" seçiminə klikləyin.</translation> <translation id="7698864304447945242">Google Play AR Xidmətləri güncəllənsin?</translation> -<translation id="7699293099605015246">Hazırda məqalələr əlçatan deyil</translation> <translation id="7701040980221191251">Heç biri</translation> <translation id="7701544340847569275">Güncəllənmədə xətalar oldu</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ilə davam edin (güvənsiz)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_be.xtb b/components/strings/components_strings_be.xtb index 469cefa..8f15440 100644 --- a/components/strings/components_strings_be.xtb +++ b/components/strings/components_strings_be.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Вы ўвялі пароль на сайце, які не знаходзіцца пад кіраваннем арганізацыі. Каб абараніць свой уліковы запіс, не выкарыстоўвайце пароль у іншых праграмах і на іншых сайтах.</translation> <translation id="1257553931232494454">узроўні маштабавання</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Каб кіраваць наладамі Chrome, націсніце Tab, затым Enter</translation> -<translation id="1263231323834454256">Спіс чытання</translation> <translation id="1264309058268477500">Розныя</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Разблакіроўка прылады</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Латок 8</translation> <translation id="1530707389502320859">Сайт, які вы хацелі наведаць, можа быць фальшывым. Зламыснікі часам імітуюць сайты, уносячы невялікія і непрыкметныя змяненні ў URL-адрас.</translation> <translation id="1532118530259321453">Інфармацыя ад старонкі</translation> -<translation id="153384715582417236">Пакуль што ўсё!</translation> <translation id="1536390784834419204">Перакласці старонку</translation> <translation id="1539840569003678498">Справаздача адпраўлена:</translation> <translation id="1549470594296187301">Каб карыстацца гэтай функцыяй, трэба ўключыць JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Ваш браўзер знаходзіцца пад кіраваннем</translation> <translation id="1746113442205726301">Зрух відарыса па восі Y</translation> <translation id="1746531169546376413">0 градусаў</translation> -<translation id="17513872634828108">Адкрытыя ўкладкі</translation> <translation id="1752021286346845558">Паштовая скрынка 8</translation> <translation id="1753068535428855445">Сустрэчы і знаёмствы</translation> <translation id="1753706481035618306">Нумар старонкі</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Паспрабаваць запусціць дыягностыку сеткі Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Даведацца больш пра рэжым інкогніта ў браўзеры Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Адкрытыя ўкладкі з'явяцца тут</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Каб кіраваць параметрамі даных, прыватнасці і бяспекі ва Уліковым запісе Google, націсніце Tab, затым Enter</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, даступна некалькі дзеянняў. Для іх прагляду націскайце Tab</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Група</translation> <translation id="2576880857912732701">Кнопка "Кіраваць наладамі бяспекі". Каб кіраваць параметрамі Бяспечнага прагляду і выконваць іншыя дзеянні праз налады Chrome, націсніце Enter</translation> <translation id="2586657967955657006">Буфер абмену</translation> -<translation id="2587730715158995865">Крыніца: <ph name="ARTICLE_PUBLISHER" />. Вы можаце прачытаць гэты і яшчэ <ph name="OTHER_ARTICLE_COUNT" /> артыкулаў.</translation> <translation id="2587841377698384444">Ідэнтыфікатар API каталога:</translation> <translation id="2594318783181750337">Хуткі прагляд у інтэрнэце:</translation> <translation id="2595719060046994702">Гэта прылада не знаходзіцца пад кіраваннем кампаніі або іншай арганізацыі.</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">Няправільны пароль</translation> <translation id="5051305769747448211">Імправізацыйная камедыя</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Каб адправіць гэты файл з дапамогай функцыі "Абагульванне паблізу", вызваліце месца на прыладзе (<ph name="DISK_SPACE_SIZE" />)}one{Каб адправіць гэтыя файлы з дапамогай функцыі "Абагульванне паблізу", вызваліце месца на прыладзе (<ph name="DISK_SPACE_SIZE" />)}few{Каб адправіць гэтыя файлы з дапамогай функцыі "Абагульванне паблізу", вызваліце месца на прыладзе (<ph name="DISK_SPACE_SIZE" />)}many{Каб адправіць гэтыя файлы з дапамогай функцыі "Абагульванне паблізу", вызваліце месца на прыладзе (<ph name="DISK_SPACE_SIZE" />)}other{Каб адправіць гэтыя файлы з дапамогай функцыі "Абагульванне паблізу", вызваліце месца на прыладзе (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Артыкулы для вас</translation> <translation id="5060483733937416656">Вы выбралі Windows Hello для спраўджання купляў на сайтах, якія карыстаюцца паслугамі пастаўшчыка <ph name="PROVIDER_ORIGIN" />. Гэты пастаўшчык мог захаваць інфармацыю пра ваш спосаб аплаты. Вы можаце <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Вы мелі на ўвазе "<ph name="LOOKALIKE_DOMAIN" />"?</translation> <translation id="5066056036849835175">Гісторыя друку</translation> @@ -1858,7 +1852,6 @@ <translation id="5541086400771735334">Паштовая скрынка 7</translation> <translation id="5541546772353173584">Дадайце адрас электроннай пошты</translation> <translation id="5543722831081909240">180 градусаў</translation> -<translation id="5545756402275714221">Артыкулы для вас</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Chrome перыядычна звярае вашы паролі з паролямі са спісаў, апублікаваных у інтэрнэце. Пры гэтым вашы паролі і імёны карыстальніка зашыфраваны – прачытаць іх не можа ніхто, нават Google.</translation> <translation id="5556459405103347317">Перазагрузіць</translation> @@ -2140,14 +2133,12 @@ <translation id="6266934640124581640">Светла-сіне-зялёны</translation> <translation id="6272088941196661550">Пашукаць звязаныя дзеянні ў гісторыі праглядаў Chrome</translation> <translation id="6272383483618007430">Абнаўленне Google</translation> -<translation id="6276112860590028508">Старонкі са спіса чытання з'явяцца тут</translation> <translation id="627746635834430766">Каб наступны раз плаціць хутчэй, захавайце картку і адрас для выстаўлення рахункаў ва Уліковым запісе Google.</translation> <translation id="6279183038361895380">Націсніце "<ph name="ACCELERATOR" />", каб убачыць курсор</translation> <translation id="6280223929691119688">Немагчыма адправіць на гэты адрас. Выберыце іншы адрас.</translation> <translation id="6284292079994426700">26 x 38 цаляў</translation> <translation id="6285507000506177184">Кнопка "Кіраваць спампоўкамі ў Chrome". Каб кіраваць файламі, якія вы спампавалі ў браўзеры Chrome, націсніце Enter</translation> <translation id="6289939620939689042">Колер старонкі</translation> -<translation id="6290238015253830360">Рэкамендаваныя вам артыкулы з'явяцца тут</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Ідзе захаванне...</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Класічны рок і старыя хіты</translation> <translation id="769721561045429135">Зараз у вас ёсць карткі, якія могуць выкарыстоўвацца толькі на гэтай прыладзе. Націсніце "Працягнуць", каб праглядзець карткі.</translation> <translation id="7698864304447945242">Абнавіць сэрвісы Google Play для AR?</translation> -<translation id="7699293099605015246">Артыкулы зараз недаступныя</translation> <translation id="7701040980221191251">Няма</translation> <translation id="7701544340847569275">Абнаўленне завершана з памылкамі</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перайсці на сайт <ph name="SITE" /> (небяспечна)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb index aebaea2..627271f 100644 --- a/components/strings/components_strings_bg.xtb +++ b/components/strings/components_strings_bg.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Въведохте паролата си на сайт, който не се управлява от организацията ви. За да защитите профила си, не използвайте паролата си повторно в други приложения и сайтове.</translation> <translation id="1257553931232494454">нива на промяна на мащаба</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Натиснете Tab и след това – Enter, за да управлявате настройките си за Chrome</translation> -<translation id="1263231323834454256">Списък за четене</translation> <translation id="1264309058268477500">Алтернативна</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Отключване на устройството</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Тава 8</translation> <translation id="1530707389502320859">Сайтът, който току-що се опитахте да отворите, изглежда фалшив. Понякога атакуващите имитират сайтове, като правят незначителни, труднозабележими промени в URL адреса</translation> <translation id="1532118530259321453">Тази страница изпраща съобщение</translation> -<translation id="153384715582417236">Това е всичко засега</translation> <translation id="1536390784834419204">Превод на страницата</translation> <translation id="1539840569003678498">Сигналът е изпратен на:</translation> <translation id="1549470594296187301">Трябва да активирате JavaScript, за да използвате тази функция.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Браузърът ви е управляван</translation> <translation id="1746113442205726301">Изместване на изображението по оста Y</translation> <translation id="1746531169546376413">0 градуса</translation> -<translation id="17513872634828108">Отворени раздели</translation> <translation id="1752021286346845558">Пощенска кутия 8</translation> <translation id="1753068535428855445">Запознанства и лични обяви</translation> <translation id="1753706481035618306">Номер на страницата</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Опитайте да стартирате мрежова диагностика в Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Научете повече за режима „инкогнито“ в Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Тук ще се показват отворените ви раздели</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Натиснете Tab и след това Enter, за да управлявате информацията си и настройките за поверителност и сигурност в профила си в Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Възможни са няколко действия. Натискайте Tab, за да преминавате циклично между тях</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Група</translation> <translation id="2576880857912732701">Бутон „Управление на настройките за сигурност“. Натиснете Enter, за да управлявате Безопасно сърфиране и други функции от настройките на Chrome</translation> <translation id="2586657967955657006">Буферна памет</translation> -<translation id="2587730715158995865">От <ph name="ARTICLE_PUBLISHER" />. Прочетете тази и още <ph name="OTHER_ARTICLE_COUNT" /> статии.</translation> <translation id="2587841377698384444">ID на API за директории:</translation> <translation id="2594318783181750337">Бърз изглед в мрежата:</translation> <translation id="2595719060046994702">Устройството и профилът не се управляват от фирма или друга организация.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Грешна парола</translation> <translation id="5051305769747448211">Комедия на живо</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{За да изпратите този файл чрез „Споделяне наблизо“, освободете място (<ph name="DISK_SPACE_SIZE" />) на устройството си}other{За да изпратите тези файлове чрез „Споделяне наблизо“, освободете място (<ph name="DISK_SPACE_SIZE" />) на устройството си}}</translation> -<translation id="5056549851600133418">Статии за вас</translation> <translation id="5060483733937416656">Избрахте опцията за потвърждаване чрез Windows Hello в уебсайтовете, които използват <ph name="PROVIDER_ORIGIN" />. Възможно е този доставчик да е съхранил информация за начина ви на плащане. Можете обаче да <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Може би имахте предвид <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">История на отпечатаното</translation> @@ -1796,6 +1790,7 @@ <translation id="5344579389779391559">Тази страница може да опита да ви таксува пари</translation> <translation id="5347645913823149105">Бутон „Персонализиране на шрифтовете в Chrome“. Натиснете Enter, за да персонализирате шрифтовете в Chrome и размера им</translation> <translation id="5355557959165512791">В момента не можете да посетите сайта <ph name="SITE" />, защото сертификатът му е анулиран. Обикновено грешките в мрежата и атаките срещу нея са временни, така че тази страница вероятно ще работи по-късно.</translation> +<translation id="5356345925629253198">Можете да използвате запазените адреси в различни продукти на Google. Този адрес ще бъде запазен в профила ви в Google (<ph name="ACCOUNT" />).</translation> <translation id="5357848622083956825">Визуални изкуства и дизайн</translation> <translation id="536296301121032821">Съхраняването на настройките за правилото не бе успешно</translation> <translation id="5363309033720083897">Сериен порт, разрешен от администратора ви</translation> @@ -1861,7 +1856,6 @@ <translation id="5541086400771735334">Пощенска кутия 7</translation> <translation id="5541546772353173584">Добавяне на имейл адрес</translation> <translation id="5543722831081909240">180 градуса</translation> -<translation id="5545756402275714221">Статии за вас</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Chrome периодично проверява паролите ви в списъци, които са били публикувани онлайн. Когато го прави, паролите и потребителските ви имена са шифровани, така че да не могат да бъдат прочетени от никого, включително от Google.</translation> <translation id="5556459405103347317">Повторно зареждане</translation> @@ -2143,14 +2137,12 @@ <translation id="6266934640124581640">светло синьо-зелено</translation> <translation id="6272088941196661550">Възобновете пътешествието си, за да прегледате съответната активност в историята си в Chrome</translation> <translation id="6272383483618007430">Google Актуализиране</translation> -<translation id="6276112860590028508">Страниците от списъка ви за четене се показват тук</translation> <translation id="627746635834430766">За да платите по-бързо следващия път, запазете картата и адреса си за фактуриране в профила си в Google.</translation> <translation id="6279183038361895380">Натиснете |<ph name="ACCELERATOR" />|, за да се покаже курсорът</translation> <translation id="6280223929691119688">Този адрес за бърза доставка не се поддържа. Изберете друг.</translation> <translation id="6284292079994426700">26 x 38 инча</translation> <translation id="6285507000506177184">Бутон „Управление на изтеглянията с Chrome“. Натиснете Enter, за да управлявате файловете, които сте изтеглили с Chrome</translation> <translation id="6289939620939689042">Цвят на страницата</translation> -<translation id="6290238015253830360">Предложените ви статии ще се показват тук</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Код за сигурност:</translation> <translation id="6295855836753816081">Запазва се...</translation> @@ -2750,7 +2742,6 @@ <translation id="7696089921647603491">Класически рок и песни от миналото</translation> <translation id="769721561045429135">В момента имате карти, които могат да се използват само на това устройство. Кликнете върху „Напред“, за да ги прегледате.</translation> <translation id="7698864304447945242">Да се актуализират ли услугите за Google Play за AR?</translation> -<translation id="7699293099605015246">В момента няма статии</translation> <translation id="7701040980221191251">Няма</translation> <translation id="7701544340847569275">Актуализирането завърши с грешки</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Продължаване към <ph name="SITE" /> (опасно)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb index e88a064..cc36cfc 100644 --- a/components/strings/components_strings_bn.xtb +++ b/components/strings/components_strings_bn.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">আপনার প্রতিষ্ঠানের নয় এমন একটি সাইটে আপনার পাসওয়ার্ড লিখেছেন। আপনার অ্যাকাউন্টের সুরক্ষার জন্য অন্যান্য অ্যাপ এবং সাইটগুলিতে আপনার এই পাসওয়ার্ডটি ব্যবহার করবেন না।</translation> <translation id="1257553931232494454">জুম লেভেল</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, আপনার Chrome সেটিংস ম্যানেজ করতে Tab প্রেস করে Enter প্রেস করুন</translation> -<translation id="1263231323834454256">পড়ার তালিকা</translation> <translation id="1264309058268477500">বিকল্প</translation> <translation id="1264974993859112054">খেলাধূলা</translation> <translation id="1266469291454105242">ডিভাইস আনলক</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ট্রে ৮</translation> <translation id="1530707389502320859">এখন যে সাইট দেখার চেষ্টা করছেন তা নকল বলে মনে হচ্ছে। ইউআরএলে সামান্য বা সহজে দেখা যায় না এমন পরিবর্তন করে আক্রমণকারীরা সাইট নকল করে।</translation> <translation id="1532118530259321453">এই পৃষ্ঠায় এটি দেখানো হচ্ছে</translation> -<translation id="153384715582417236">এখন এই পর্যন্তই</translation> <translation id="1536390784834419204">পৃষ্ঠাটি অনুবাদ করুন</translation> <translation id="1539840569003678498">রিপোর্ট পাঠানো হয়েছে:</translation> <translation id="1549470594296187301">এই বৈশিষ্ট্যটি ব্যবহার করার জন্য জাভাস্ক্রিপ্ট চালু করা প্রয়োজন।</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">আপনার ব্রাউজারটি ম্যানেজ করা হচ্ছে</translation> <translation id="1746113442205726301">ছবি Y শিফ্ট</translation> <translation id="1746531169546376413">০ ডিগ্রী</translation> -<translation id="17513872634828108">খোলা ট্যাব</translation> <translation id="1752021286346845558">মেলবক্স ৮</translation> <translation id="1753068535428855445">ডেটিং ও ব্যক্তিগত</translation> <translation id="1753706481035618306">পৃষ্ঠা সংখ্যা</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows নেটওয়ার্ক ডায়গনিস্টিক্স চালিয়ে দেখুন<ph name="END_LINK" />।</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium-এ ছদ্মবেশী মোডের বিষয়ে আরও জানুন<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">আপনার খোলা ট্যাবগুলি এখানে দেখা যাবে</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, আপনার Google অ্যাকাউন্টে নিজের সম্পর্কে তথ্য, গোপনীয়তা এবং সুরক্ষা ম্যানেজ করতে প্রথমে Tab তারপরে Enter প্রেস করুন</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, একাধিক কাজ করা যাবে, বিকল্পগুলি এক এক করে দেখতে ট্যাব টিপুন</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">গ্রুপ</translation> <translation id="2576880857912732701">'নিরাপত্তা সেটিংস' বোতাম ম্যানেজ করুন, Chrome সেটিংসে Safe Browsing ও আরও অনেক কিছু ম্যানেজ করতে, Enter প্রেস করুন</translation> <translation id="2586657967955657006">ক্লিপবোর্ড</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> থেকে পাওয়া। এটি এবং আরও <ph name="OTHER_ARTICLE_COUNT" />টি গল্প পড়ুন।</translation> <translation id="2587841377698384444">ডিরেক্টরি API আইডি:</translation> <translation id="2594318783181750337">চটপট ওয়েব ভিউ:</translation> <translation id="2595719060046994702">কোনও কোম্পানি বা সংস্থা এই ডিভাইস ও অ্যাকাউন্ট ম্যানেজ করে না।</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">ভুল পাসওয়ার্ড</translation> <translation id="5051305769747448211">লাইভ কমেডি</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{নিয়ারবাই শেয়ার ব্যবহার করে এই ফাইল পাঠাতে চাইলে, আপনার ডিভাইসে (<ph name="DISK_SPACE_SIZE" />) জায়গা খালি করুন}one{নিয়ারবাই শেয়ার ব্যবহার করে এই ফাইলগুলি পাঠাতে চাইলে, আপনার ডিভাইসে (<ph name="DISK_SPACE_SIZE" />) জায়গা খালি করুন}other{নিয়ারবাই শেয়ার ব্যবহার করে এই ফাইলগুলি পাঠাতে চাইলে, আপনার ডিভাইসে (<ph name="DISK_SPACE_SIZE" />) জায়গা খালি করুন}}</translation> -<translation id="5056549851600133418">আপনার জন্য নিবন্ধগুলি</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> ব্যবহার করে এমন ওয়েবসাইটে Windows Hello ব্যবহার করে যাচাই করার বিকল্প বেছে নিয়েছেন। এই পরিষেবা প্রদানকারী আপনার পেমেন্ট পদ্ধতি সম্পর্কে তথ্য স্টোর করে থাকতে পারে যা আপনি <ph name="LINK_TEXT" /> পারেন।</translation> <translation id="5061227663725596739">আপনি কি <ph name="LOOKALIKE_DOMAIN" /> ডোমেনের কথা বলছেন?</translation> <translation id="5066056036849835175">প্রিন্ট করার ইতিহাস</translation> @@ -1860,7 +1854,6 @@ <translation id="5541086400771735334">মেলবক্স ৭</translation> <translation id="5541546772353173584">ইমেল আইডি যোগ করুন</translation> <translation id="5543722831081909240">১৮০ ডিগ্রী</translation> -<translation id="5545756402275714221">আপনার জন্য নিবন্ধ</translation> <translation id="5551890439174915351">১০০ x ২০০ মিমি</translation> <translation id="5552137475244467770">Chrome মাঝে মাঝে অনলাইনে প্রকাশ করা তালিকা অনুযায়ী আপনার পাসওয়ার্ড চেক করে। এটি করার সময় আপনার পাসওয়ার্ড ও ইউজারনেম এনক্রিপ্ট করা থাকে, তাই সেগুলি কেউ দেখতে পাবে না, এমনকি Google-ও না।</translation> <translation id="5556459405103347317">রিলোড করুন</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">হালকা টিল</translation> <translation id="6272088941196661550">Chrome ইতিহাসে প্রাসঙ্গিক অ্যাক্টিভিটি দেখতে সার্চ করা আবার চালু করুন</translation> <translation id="6272383483618007430">Google আপডেট</translation> -<translation id="6276112860590028508">পড়ার তালিকার পৃষ্ঠাগুলি এখানে দেখা যাবে</translation> <translation id="627746635834430766">পরের বার আরও দ্রুত পেমেন্ট করা জন্য আপনার এই কার্ড এবং বিলিং ঠিকানাটি Google অ্যাকাউন্টে সেভ করে রাখুন।</translation> <translation id="6279183038361895380">আপনার কার্সার দেখাতে |<ph name="ACCELERATOR" />| চাপুন</translation> <translation id="6280223929691119688">এই ঠিকানায় ডেলিভারি করা যাবে না। অন্য ঠিকানা বেছে নিন।</translation> <translation id="6284292079994426700">২৬ x ৩৮ ইঞ্চি</translation> <translation id="6285507000506177184">Chrome বোতামে ডাউনলোড ম্যানেজ করুন, Chrome-এ ডাউনলোড করা ফাইল ম্যানেজ করতে Enter প্রেস করুন</translation> <translation id="6289939620939689042">পৃষ্ঠার রঙ</translation> -<translation id="6290238015253830360">আপনার প্রস্তাবিত নিবন্ধগুলি এখানে দেখা যাবে</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">সংরক্ষণ করা হচ্ছে...</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">ক্লাসিক রক ও পুরানো দিনের</translation> <translation id="769721561045429135">এই মুহূর্তে, আপনার কাছে থাকা কার্ডগুলি শুধুমাত্র এই ডিভাইসে ব্যবহার করা যেতে পারে। কার্ডগুলির পর্যালোচনা চালিয়ে যেতে ক্লিক করুন।</translation> <translation id="7698864304447945242">Google Play Services for AR আপডেট করবেন?</translation> -<translation id="7699293099605015246">নিবন্ধ এখন পাওয়া যাবে না</translation> <translation id="7701040980221191251">কিছু নেই</translation> <translation id="7701544340847569275">আপডেট প্রক্রিয়া সম্পূর্ণ করা যায়নি</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> এ এগিয়ে যান (নিরাপদ নয়) <ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_bs.xtb b/components/strings/components_strings_bs.xtb index dcbea76..06fb694c 100644 --- a/components/strings/components_strings_bs.xtb +++ b/components/strings/components_strings_bs.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Unijeli ste lozinku na web lokaciji kojom ne upravlja vaša organizacija. Da zaštitite račun, lozinku nemojte ponovo koristiti na drugim aplikacijama i web lokacijama.</translation> <translation id="1257553931232494454">nivoi zumiranja</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, a zatim Enter da upravljate postavkama Chromea</translation> -<translation id="1263231323834454256">Lista za čitanje</translation> <translation id="1264309058268477500">Alternativno</translation> <translation id="1264974993859112054">Sportovi</translation> <translation id="1266469291454105242">Otključavanje uređaja</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Ladica 8</translation> <translation id="1530707389502320859">Izgleda da je web lokacija koju ste upravo htjeli posjetiti lažna. Napadači ponekad oponašaju web lokacije tako što naprave male, teško primjetne izmjene URL-a.</translation> <translation id="1532118530259321453">Na ovoj stranici piše</translation> -<translation id="153384715582417236">To je sve za sada</translation> <translation id="1536390784834419204">Prevedi stranicu</translation> <translation id="1539840569003678498">Prijava je poslana:</translation> <translation id="1549470594296187301">Za korištenje ove funkcije trebate omogućiti JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Vašim preglednikom se upravlja</translation> <translation id="1746113442205726301">Pomak slike Y</translation> <translation id="1746531169546376413">0 stepeni</translation> -<translation id="17513872634828108">Otvorene kartice</translation> <translation id="1752021286346845558">Poštansko sanduče 8</translation> <translation id="1753068535428855445">Zabavljanje i lični oglasi</translation> <translation id="1753706481035618306">Broj stranice</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Probajte pokrenuti Windows mrežnu dijagnostiku<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Saznajte više o anonimnom načinu rada u Chromiumu<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Vaše otvorene kartice se prikazuju ovdje</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, a zatim Enter da upravljate informacijama, privatnošću i sigurnošću na Google računu</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Dostupno je više radnji. Pritisnite Tab da ih prelistate</translation> @@ -368,7 +364,7 @@ <translation id="1801812870656502108">Detalji virtuelne kartice</translation> <translation id="1803020234906945288">Zdrava ishrana</translation> <translation id="1803351196216024260">Može tražiti da koristi mikrofon</translation> -<translation id="1806174020048213474">Aplikacija zahtijeva dopuštenje za instaliranje vjerodajnica za Wi-Fi. Nakon postavljanja <ph name="DEVICE_TYPE" /> će se automatski povezati s obuhvaćenim Wi-Fi mrežama. Da biste uklonili te vjerodajnice, deinstalirajte aplikaciju.</translation> +<translation id="1806174020048213474">Aplikacija traži odobrenje za instaliranje akreditiva za WiFi. Nakon postavljanja uređaj <ph name="DEVICE_TYPE" /> će se automatski povezivati s WiFi mrežama koje učestvuju. Da uklonite akreditive, deinstalirajte aplikaciju.</translation> <translation id="1807246157184219062">Svijetli</translation> <translation id="1807528111851433570">Početna tabela</translation> <translation id="180991881384371158">Vaš CVC je na zadnjoj strani kartice. To je trocifreni broj u donjem desnom uglu iznad polja za potpis.</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">Grupa</translation> <translation id="2576880857912732701">Dugme za upravljanje sigurnosnim postavkama, pritisnite Enter da upravljate Sigurnim pregledanjem i drugim funkcijama u postavkama Chromea</translation> <translation id="2586657967955657006">Međumemorija</translation> -<translation id="2587730715158995865">Od izdavača <ph name="ARTICLE_PUBLISHER" />. Pročitajte ovu i druge priče kojih ima <ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">ID API-ja direktorija:</translation> <translation id="2594318783181750337">Brzi web prikaz:</translation> <translation id="2595719060046994702">Uređajem i računom ne upravlja kompanija ili druga organizacija.</translation> @@ -1666,7 +1661,6 @@ <translation id="5045550434625856497">Pogrešna lozinka</translation> <translation id="5051305769747448211">Komedija uživo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Da pošaljete ovaj fajl pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}one{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}few{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}other{Da pošaljete ove fajlove pomoću Dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}}</translation> -<translation id="5056549851600133418">Članci za vas</translation> <translation id="5060483733937416656">Odabrali ste potvrdu pomoću funkcije Windows Hello na web lokacijama koje koriste pružaoca usluga <ph name="PROVIDER_ORIGIN" />. Ovaj pružalac usluga je možda pohranio informacije o vašem načinu plaćanja, za koji možete <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Jeste li mislili <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historija štampanja</translation> @@ -1704,7 +1698,7 @@ <translation id="5129534298163637277">Dijaloški okvir za potvrdu</translation> <translation id="5135404736266831032">Upravljaj adresama...</translation> <translation id="5136841603454277753">Unesite tačan kôd</translation> -<translation id="5137761395480718572">Aplikacija zahtijeva dopuštenje za instaliranje vjerodajnica za Wi-Fi. Nakon postavljanja <ph name="DEVICE_TYPE" /> će se automatski povezati s obuhvaćenim Wi-Fi mrežama. Da biste uklonili te vjerodajnice, deinstalirajte aplikaciju. <ph name="LEARN_MORE" /></translation> +<translation id="5137761395480718572">Aplikacija traži odobrenje za instaliranje akreditiva za WiFi. Nakon postavljanja uređaj <ph name="DEVICE_TYPE" /> će se automatski povezivati s WiFi mrežama koje učestvuju. Da uklonite akreditive, deinstalirajte aplikaciju. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtuelna kartica trenutno nije dostupna. Kontaktirajte banku</translation> <translation id="5138227688689900538">Prikaži manje</translation> <translation id="5145883236150621069">Odgovor na pravilo sadrži kȏd greške</translation> @@ -1745,8 +1739,8 @@ <translation id="5234764350956374838">Odbaci</translation> <translation id="5239623327352565343">Lokacija je dozvoljena</translation> <translation id="5242889659037569123">Prtljaga i putna oprema</translation> -<translation id="5244732203286792411">Učitavanje... - Moglo bi potrajati koju minutu.</translation> +<translation id="5244732203286792411">Učitavanje… + Ovo može malo potrajati.</translation> <translation id="5250209940322997802">"Povežite se s mrežom"</translation> <translation id="52517543715119994">Saznajte više o funkcijama Chromea</translation> <translation id="5251803541071282808">Oblak</translation> @@ -1800,6 +1794,7 @@ <translation id="5344579389779391559">Ova stranica vam može pokušati nešto naplatiti</translation> <translation id="5347645913823149105">Dugme za prilagođavanje fontova u Chromeu, pritisnite Enter da prilagodite veličine i stilove fonta u Chromeu</translation> <translation id="5355557959165512791">Trenutno ne možete posjetiti web lokaciju <ph name="SITE" /> jer je njena potvrda opozvana. Greške i napadi na mreži su obično privremenog karaktera, tako da će ova stranica vjerovatno funkcionirati kasnije.</translation> +<translation id="5356345925629253198">Spremljene adrese možete upotrijebiti na Googleovim proizvodima. Ta će se adresa spremiti na vaš Google račun (<ph name="ACCOUNT" />).</translation> <translation id="5357848622083956825">Vizuelna umjetnost i dizajn</translation> <translation id="536296301121032821">Pohranjivanje postavki pravila nije uspjelo</translation> <translation id="5363309033720083897">Serijski priključak koji je dozvolio vaš administrator</translation> @@ -1865,7 +1860,6 @@ <translation id="5541086400771735334">Poštansko sanduče 7</translation> <translation id="5541546772353173584">Dodajte adresu e-pošte</translation> <translation id="5543722831081909240">180 stepeni</translation> -<translation id="5545756402275714221">Članci za vas</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome povremeno provjerava nalaze li se vaše lozinke na listama koje su objavljene na mreži. Prilikom toga, vaše lozinke i korisnička imena su šifrirana i niko, uključujući Google, ih ne može pročitati.</translation> <translation id="5556459405103347317">Učitaj ponovo</translation> @@ -2147,14 +2141,12 @@ <translation id="6266934640124581640">Svijetlotirkizna</translation> <translation id="6272088941196661550">Nastavite iskustvo pregledanja da vidite relevantne aktivnosti u historiji Chromea</translation> <translation id="6272383483618007430">Google Ažuriranje</translation> -<translation id="6276112860590028508">Stranice s vašeg spiska za čitanje će se pojaviti ovdje</translation> <translation id="627746635834430766">Da sljedeći put brže izvršite plaćanje, sačuvajte adresu kartice i adresu za naplatu na svoj Google račun.</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da prikažete kursor</translation> <translation id="6280223929691119688">Isporuka na ovu adresu nije moguća. Odaberite drugu adresu.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Dugme za upravljanje preuzimanjima u Chromeu, pritisnite Enter da upravljate fajlovima koje ste preuzeli u Chromeu</translation> <translation id="6289939620939689042">Boja stranice</translation> -<translation id="6290238015253830360">Predloženi članci će se pojaviti ovdje</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Pohranjivanje…</translation> @@ -2257,7 +2249,7 @@ <translation id="6529173248185917884">Sedma rolna</translation> <translation id="6529602333819889595">&Ponovi brisanje</translation> <translation id="6535751101619004418">Valute i devize</translation> -<translation id="6536221421038631327">Uklanjanjem pretplate na Passpoint s uređaja <ph name="DEVICE_TYPE" /> uklonit će se povezane mreže. Obratite se aplikaciji <ph name="FRIENDLY_NAME" /> da biste promijenili svoju pretplatu. <ph name="LEARN_MORE" /></translation> +<translation id="6536221421038631327">Uklanjanje pretplate na Passpoint s uređaja <ph name="DEVICE_TYPE" /> će ukloniti povezane mreže. Idite u aplikaciju "<ph name="FRIENDLY_NAME" />" da promijenite pretplatnički paket. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Uzajamni fondovi</translation> <translation id="6545864417968258051">Skeniranje Bluetootha</translation> <translation id="6547208576736763147">Dvostruko bušenje na lijevoj strani</translation> @@ -2755,7 +2747,6 @@ <translation id="7696089921647603491">Klasični rock i stari hitovi</translation> <translation id="769721561045429135">Trenutno imate kartice koje se mogu koristiti samo na ovom uređaju. Kliknite Nastavi da pregledate kartice.</translation> <translation id="7698864304447945242">Ažurirati Google Play usluge za AR?</translation> -<translation id="7699293099605015246">Članci trenutno nisu dostupni</translation> <translation id="7701040980221191251">Nema</translation> <translation id="7701544340847569275">Ažuriranje je završeno s greškama</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nastavi na <ph name="SITE" /> (nesigurno)<ph name="END_LINK" /></translation> @@ -3354,7 +3345,7 @@ <translation id="9219103736887031265">Slike</translation> <translation id="922152298093051471">Prilagodite Chrome</translation> <translation id="933712198907837967">Diners Club</translation> -<translation id="934634059306213385">Želite li dopustiti aplikaciji <ph name="APP_NAME" /> da postavi Wi-Fi mreže?</translation> +<translation id="934634059306213385">Dozvoliti aplikaciji <ph name="APP_NAME" /> da postavi WiFi mreže?</translation> <translation id="936602727769022409">Možete izgubiti pristup svom Google računu. Chromium preporučuje da odmah promijenite lozinku. Od vas će se tražiti da se prijavite.</translation> <translation id="937457230470581909">Zoološki vrtovi, akvarijumi i rezervati</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Koji podaci se koriste:<ph name="END_BOLD" /> vaše teme oglasa se zasnivaju na nedavnoj historiji pregledanja, listi web lokacija koje ste posjetili koristeći Chrome na ovom uređaju.</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb index d09b29c..a277b29 100644 --- a/components/strings/components_strings_ca.xtb +++ b/components/strings/components_strings_ca.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Has introduït la contrasenya en un lloc web que no està gestionat per la teva organització. Per protegir el teu compte, no facis servir la mateixa contrasenya en altres aplicacions ni llocs web.</translation> <translation id="1257553931232494454">nivells de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />: prem Tab i després Retorn per gestionar la configuració de Chrome</translation> -<translation id="1263231323834454256">Llista de lectura</translation> <translation id="1264309058268477500">Alternatiu</translation> <translation id="1264974993859112054">Esports</translation> <translation id="1266469291454105242">Desbloqueig del dispositiu</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Safata 8</translation> <translation id="1530707389502320859">El lloc web al qual acabes de provar d'accedir sembla fals. De vegades, els atacants imiten llocs web introduint petits canvis difícils de veure a l'URL.</translation> <translation id="1532118530259321453">Aquesta pàgina diu</translation> -<translation id="153384715582417236">De moment, això és tot</translation> <translation id="1536390784834419204">Tradueix la pàgina</translation> <translation id="1539840569003678498">S'ha enviat l'informe:</translation> <translation id="1549470594296187301">Heu d'activar el JavaScript per utilitzar aquesta funció.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">El navegador està gestionat</translation> <translation id="1746113442205726301">Desplaçament a l'eix Y de la imatge</translation> <translation id="1746531169546376413">0 graus</translation> -<translation id="17513872634828108">Pestanyes obertes</translation> <translation id="1752021286346845558">Bústia de correu 8</translation> <translation id="1753068535428855445">Cites i anuncis personals</translation> <translation id="1753706481035618306">Número de pàgina</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prova d'executar el diagnòstic de xarxes de Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Més informació sobre el mode d'incògnit a Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Les pestanyes obertes es mostren aquí</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />: prem Tab i després Retorn per gestionar la teva informació, privadesa i seguretat al teu Compte de Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, hi ha diverses accions disponibles, prem el tabulador per moure't d'una acció a una altra</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grup</translation> <translation id="2576880857912732701">Botó Gestiona la configuració de seguretat: prem Retorn per gestionar Navegació segura i altres opcions de la configuració de Chrome</translation> <translation id="2586657967955657006">Porta-retalls</translation> -<translation id="2587730715158995865">Publicat per <ph name="ARTICLE_PUBLISHER" />. Llegeix aquesta història i <ph name="OTHER_ARTICLE_COUNT" /> més.</translation> <translation id="2587841377698384444">Identificador de l'API de directoris:</translation> <translation id="2594318783181750337">Visualització web ràpida:</translation> <translation id="2595719060046994702">Aquest dispositiu i aquest compte no estan gestionats per una empresa ni per una altra organització.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Contrasenya incorrecta</translation> <translation id="5051305769747448211">Comèdia en directe</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Per enviar aquest fitxer amb Compartició Nearby, allibera espai (<ph name="DISK_SPACE_SIZE" />) al dispositiu}other{Per enviar aquests fitxers amb Compartició Nearby, allibera espai (<ph name="DISK_SPACE_SIZE" />) al dispositiu}}</translation> -<translation id="5056549851600133418">Articles que et poden interessar</translation> <translation id="5060483733937416656">Has decidit verificar amb Windows Hello els llocs web que utilitzen <ph name="PROVIDER_ORIGIN" />. És possible que aquest proveïdor hagi emmagatzemat informació sobre la teva forma de pagament, que pots <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Volies dir <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historial d'impressions</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Ignora</translation> <translation id="5239623327352565343">Està permès utilitzar la ubicació</translation> <translation id="5242889659037569123">Equipatge i accessoris de viatge</translation> +<translation id="5244732203286792411">S'està carregant... + Aquest procés pot tardar un minut.</translation> <translation id="5250209940322997802">"Connecteu-vos a la xarxa"</translation> <translation id="52517543715119994">Més informació sobre les funcions de Chrome</translation> <translation id="5251803541071282808">Núvol</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Bústia de correu 7</translation> <translation id="5541546772353173584">Afegeix un correu electrònic</translation> <translation id="5543722831081909240">180 graus</translation> -<translation id="5545756402275714221">Articles que et poden interessar</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome contrasta periòdicament les teves contrasenyes amb les d'una sèrie de llistes publicades en línia. Quan ho fa, les teves contrasenyes i els teus noms d'usuari s'encripten i, per tant, ningú no els pot llegir (ni tan sols Google).</translation> <translation id="5556459405103347317">Torna a carregar</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Verd blavós clar</translation> <translation id="6272088941196661550">Reprèn el recorregut per veure activitat rellevant a l'historial de Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Les pàgines de la teva llista de lectura es mostren aquí</translation> <translation id="627746635834430766">Perquè la propera vegada puguis pagar més ràpidament, desa la targeta i l'adreça de facturació al compte de Google.</translation> <translation id="6279183038361895380">Premeu |<ph name="ACCELERATOR" />| per veure el cursor</translation> <translation id="6280223929691119688">No es pot entregar a aquesta adreça. Selecciona'n una altra.</translation> <translation id="6284292079994426700">26 x 38 polzades</translation> <translation id="6285507000506177184">Botó Gestiona les baixades a Chrome: prem Retorn per gestionar els fitxers que has baixat a Chrome</translation> <translation id="6289939620939689042">Color de la pàgina</translation> -<translation id="6290238015253830360">Els articles suggerits es mostren aquí</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">S'està desant…</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Rock clàssic i èxits antics</translation> <translation id="769721561045429135">En aquest moment tens targetes que només es poden fer servir en aquest dispositiu. Fes clic a Continua per consultar les targetes.</translation> <translation id="7698864304447945242">Vols actualitzar Serveis de Google Play per a RA?</translation> -<translation id="7699293099605015246">En aquests moments no hi ha articles disponibles</translation> <translation id="7701040980221191251">Cap</translation> <translation id="7701544340847569275">L'actualització ha finalitzat amb errors</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continua per accedir a <ph name="SITE" /> (no segur)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb index e7fc834..385ccaea 100644 --- a/components/strings/components_strings_cs.xtb +++ b/components/strings/components_strings_cs.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Zadali jste své heslo na webu, který není spravován vaší organizací. Kvůli ochraně účtu nepoužívejte jeho heslo v jiných aplikacích a na jiných webech.</translation> <translation id="1257553931232494454">úrovně přiblížení</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím tabulátoru a poté klávesy Enter můžete spravovat nastavení Chromu</translation> -<translation id="1263231323834454256">Seznam četby</translation> <translation id="1264309058268477500">Alternativní</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Odemknutí zařízení</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Přihrádka 8</translation> <translation id="1530707389502320859">Web, který se pokoušíte navštívit, vypadá falešný. Útočníci někdy weby napodobují tak, že v adrese URL provádějí drobné, obtížně odhalitelné změny.</translation> <translation id="1532118530259321453">Tato stránka říká</translation> -<translation id="153384715582417236">To je prozatím vše</translation> <translation id="1536390784834419204">Přeložit stránku</translation> <translation id="1539840569003678498">Hlášení bylo odesláno:</translation> <translation id="1549470594296187301">Chcete-li tuto funkci použít, musí být aktivován JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Váš prohlížeč je spravován</translation> <translation id="1746113442205726301">Posun obrázku na ose Y</translation> <translation id="1746531169546376413">0°</translation> -<translation id="17513872634828108">Otevřené karty</translation> <translation id="1752021286346845558">Schránka 8</translation> <translation id="1753068535428855445">Seznamování a osobní inzerce</translation> <translation id="1753706481035618306">Číslo stránky</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Zkuste spustit Diagnostiku sítě systému Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Další informace o anonymním režimu v prohlížeči Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Zde se zobrazí otevřené karty</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, stisknutím klávesy Tab a poté Enter můžete spravovat své údaje, ochranu soukromí a zabezpečení v účtu Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, je k dispozici několik akcí, můžete je procházet stisknutím klávesy Tab</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Skupina</translation> <translation id="2576880857912732701">Tlačítko Spravovat nastavení zabezpečení, stisknutím klávesy Enter můžete spravovat Bezpečné prohlížení a další funkce v nastavení Chromu</translation> <translation id="2586657967955657006">Schránka</translation> -<translation id="2587730715158995865">Vydavatel: <ph name="ARTICLE_PUBLISHER" />. Přečtěte si tento článek a další (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">ID rozhraní Directory API:</translation> <translation id="2594318783181750337">Rychlé zobrazování z webu:</translation> <translation id="2595719060046994702">Toto zařízení a účet nespravuje žádná společnost ani organizace.</translation> @@ -1660,7 +1655,6 @@ <translation id="5045550434625856497">Nesprávné heslo</translation> <translation id="5051305769747448211">Živé komedie</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Pokud tento soubor chcete odeslat pomocí funkce Sdílení nablízko, uvolněte v zařízení místo (<ph name="DISK_SPACE_SIZE" />)}few{Pokud tyto soubory chcete odeslat pomocí funkce Sdílení nablízko, uvolněte v zařízení místo (<ph name="DISK_SPACE_SIZE" />)}many{Pokud tyto soubory chcete odeslat pomocí funkce Sdílení nablízko, uvolněte v zařízení místo (<ph name="DISK_SPACE_SIZE" />)}other{Pokud tyto soubory chcete odeslat pomocí funkce Sdílení nablízko, uvolněte v zařízení místo (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Články pro vás</translation> <translation id="5060483733937416656">Rozhodli jste se provést ověření pomocí Windows Hello na webech, které používají <ph name="PROVIDER_ORIGIN" />. Tento poskytovatel může mít uložené údaje o vaší platební metodě – můžete <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Měli jste na mysli <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historie tisku</translation> @@ -1855,7 +1849,6 @@ <translation id="5541086400771735334">Schránka 7</translation> <translation id="5541546772353173584">Přidání e-mailu</translation> <translation id="5543722831081909240">180°</translation> -<translation id="5545756402275714221">Články pro vás</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Chrome vaše hesla pravidelně porovnává se seznamy hesel, která unikla na internet. Vaše hesla a uživatelská jména jsou při tom šifrována, takže je nemůže nikdo zobrazit (ani Google).</translation> <translation id="5556459405103347317">Načíst znovu</translation> @@ -2136,14 +2129,12 @@ <translation id="6266934640124581640">Světle modrozelená</translation> <translation id="6272088941196661550">Obnovením cesty zobrazíte příslušnou aktivitu v historii Chromu</translation> <translation id="6272383483618007430">Aktualizace Google</translation> -<translation id="6276112860590028508">Zde naleznete stránky ze seznamu četby</translation> <translation id="627746635834430766">Abyste příště mohli zaplatit rychleji, uložte si kartu a fakturační adresu do účtu Google.</translation> <translation id="6279183038361895380">Kurzor zobrazíte stisknutím klávesy |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Doručení na tuto adresu není možné. Vyberte jinou adresu.</translation> <translation id="6284292079994426700">26 × 38 palců</translation> <translation id="6285507000506177184">Tlačítko správy stažených souborů v Chromu. Stisknutím klávesy Enter můžete spravovat soubory, které jste v Chromu stáhli</translation> <translation id="6289939620939689042">Barva stránky</translation> -<translation id="6290238015253830360">Zde se zobrazí navrhované články</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Bezpečnostní kód kreditní karty (CVC):</translation> <translation id="6295855836753816081">Ukládání...</translation> @@ -2742,7 +2733,6 @@ <translation id="7696089921647603491">Klasický rock a oldies</translation> <translation id="769721561045429135">V současné době máte karty, které lze používat jen na tomto zařízení. Chcete-li karty zkontrolovat, klikněte na Pokračovat.</translation> <translation id="7698864304447945242">Aktualizovat Služby Google Play pro RR?</translation> -<translation id="7699293099605015246">Články momentálně nejsou dostupné</translation> <translation id="7701040980221191251">Žádné</translation> <translation id="7701544340847569275">Aktualizace byla dokončena s chybami</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Pokračovat na web <ph name="SITE" /> (nespolehlivý)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_cy.xtb b/components/strings/components_strings_cy.xtb index 8ef0971..25c386d 100644 --- a/components/strings/components_strings_cy.xtb +++ b/components/strings/components_strings_cy.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Gwnaethoch roi eich cyfrinair ar wefan nad yw'n cael ei rheoli gan eich sefydliad. Er mwyn amddiffyn eich cyfrif, peidiwch ag ailddefnyddio eich cyfrinair ar apiau a gwefannau eraill.</translation> <translation id="1257553931232494454">lefelau chwyddo</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pwyswch Tab yna Enter i reoli eich gosodiadau Chrome</translation> -<translation id="1263231323834454256">Rhestr ddarllen</translation> <translation id="1264309058268477500">Amgen</translation> <translation id="1264974993859112054">Chwaraeon</translation> <translation id="1266469291454105242">Datgloi dyfais</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Hambwrdd 8</translation> <translation id="1530707389502320859">Mae'r wefan rydych newydd geisio ymweld â hi yn ymddangos yn ffug. Weithiau mae ymosodwyr yn dynwared gwefannau drwy wneud newidiadau bach, anodd eu gweld i'r URL.</translation> <translation id="1532118530259321453">Dywed y dudalen hon</translation> -<translation id="153384715582417236">Dyna'r cyfan am nawr</translation> <translation id="1536390784834419204">Cyfieithu'r dudalen</translation> <translation id="1539840569003678498">Anfonwyd yr adroddiad:</translation> <translation id="1549470594296187301">Rhaid galluogi JavaScript i ddefnyddio'r nodwedd hon.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Rheolir eich porwr</translation> <translation id="1746113442205726301">Llun Y sifft</translation> <translation id="1746531169546376413">0 gradd</translation> -<translation id="17513872634828108">Tabiau agored</translation> <translation id="1752021286346845558">Blwch negeseuon 8</translation> <translation id="1753068535428855445">Detio a hysbysebion personol</translation> <translation id="1753706481035618306">Rhif tudalen</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Rhowch gynnig ar redeg Diagnosteg Rhwydwaith Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Dysgu rhagor am y modd Anhysbys yn Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Mae eich tabiau sydd ar agor yn ymddangos yma</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pwyswch Tab yna Enter i reoli eich gwybodaeth, preifatrwydd, a diogelwch yn eich Cyfrif Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, mae mwy nag un weithred ar gael, pwyswch Tab i fynd drwyddynt</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grŵp</translation> <translation id="2576880857912732701">Botwm rheoli gosodiadau diogelwch, pwyswch Enter i reoli eich Pori'n Ddiogel a rhagor yng ngosodiadau Chrome</translation> <translation id="2586657967955657006">Clipfwrdd</translation> -<translation id="2587730715158995865">Gan <ph name="ARTICLE_PUBLISHER" />. Darllen hwn a <ph name="OTHER_ARTICLE_COUNT" /> stori arall.</translation> <translation id="2587841377698384444">Rhif Adnabod API y Cyfeiriadur:</translation> <translation id="2594318783181750337">Gwedd we gyflym:</translation> <translation id="2595719060046994702">Nid yw cwmni na sefydliad arall yn rheoli'r ddyfais a'r cyfrif hwn.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Cyfrinair anghywir</translation> <translation id="5051305769747448211">Comedi byw</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{I anfon y ffeil hon drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}zero{I anfon y ffeiliau hyn drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}two{I anfon y ffeiliau hyn drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}few{I anfon y ffeiliau hyn drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}many{I anfon y ffeiliau hyn drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}other{I anfon y ffeiliau hyn drwy ddefnyddio Rhannu Gerllaw, crëwch ragor o le (<ph name="DISK_SPACE_SIZE" />) ar eich dyfais}}</translation> -<translation id="5056549851600133418">Erthyglau i chi</translation> <translation id="5060483733937416656">Gwnaethoch ddewis dilysu gyda Windows Hello ar wefannau sy'n defnyddio <ph name="PROVIDER_ORIGIN" />. Mae'n bosib bod y darparwr hwn wedi storio gwybodaeth am eich dull talu, y gallwch <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">A oeddech chi'n golygu <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Hanes argraffu</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Diystyru</translation> <translation id="5239623327352565343">Caniateir lleoliad</translation> <translation id="5242889659037569123">Bagiau ac ategolion teithio</translation> +<translation id="5244732203286792411">Wrthi'n llwytho... + Gall hyn gymryd munud.</translation> <translation id="5250209940322997802">"Cysylltu â rhwydwaith"</translation> <translation id="52517543715119994">Dysgu am nodweddion Chrome</translation> <translation id="5251803541071282808">Cwmwl</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Blwch negeseuon 7</translation> <translation id="5541546772353173584">Ychwanegu E-bost</translation> <translation id="5543722831081909240">180 gradd</translation> -<translation id="5545756402275714221">Erthyglau i Chi</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Mae Chrome o bryd i'w gilydd yn gwirio'ch cyfrineiriau yn erbyn rhestrau sydd wedi'u cyhoeddi ar-lein. Wrth wneud hyn, mae eich cyfrineiriau a'ch enwau defnyddwyr wedi'u hamgryptio, felly ni all unrhyw un, gan gynnwys Google, eu darllen.</translation> <translation id="5556459405103347317">Ail-lwytho</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Glaswyrdd Golau</translation> <translation id="6272088941196661550">Parhewch â'ch taith i weld gweithgarwch perthnasol yn eich hanes Chrome</translation> <translation id="6272383483618007430">Diweddariad Google</translation> -<translation id="6276112860590028508">Mae tudalennau o'ch rhestr ddarllen yn ymddangos yma</translation> <translation id="627746635834430766">I dalu'n gyflymach y tro nesaf, cadwch eich cerdyn a'ch cyfeiriad bilio i'ch Cyfrif Google.</translation> <translation id="6279183038361895380">Pwyswch |<ph name="ACCELERATOR" />| i ddangos eich cyrchwr</translation> <translation id="6280223929691119688">Methu ag anfon i'r cyfeiriad hwn. Dewiswch gyfeiriad gwahanol.</translation> <translation id="6284292079994426700">26 x 38 modfedd</translation> <translation id="6285507000506177184">Botwm rheoli lawrlwythiadau yn Chrome, pwyswch Enter i reoli ffeiliau rydych wedi'u lawrlwytho yn Chrome</translation> <translation id="6289939620939689042">Lliw'r Dudalen</translation> -<translation id="6290238015253830360">Mae'r erthyglau a awgrymir gennych yn ymddangos yma</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Wrthi'n cadw...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Roc clasurol a hen ganeuon</translation> <translation id="769721561045429135">Ar hyn o bryd, mae gennych gardiau y gellir eu defnyddio ar y ddyfais hon yn unig. Cliciwch Parhau i weld y cardiau.</translation> <translation id="7698864304447945242">Diweddaru Google Play Services ar gyfer AR?</translation> -<translation id="7699293099605015246">Nid yw erthyglau ar gael ar hyn o bryd</translation> <translation id="7701040980221191251">Dim</translation> <translation id="7701544340847569275">Gorffennodd y diweddariad gyda gwallau</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Parhau i <ph name="SITE" /> (anniogel)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index bcd965b..61ffb98 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Du indtastede din adgangskode på et website, der ikke administreres af din organisation. Du kan beskytte din konto ved at undgå at bruge din adgangskode i andre apps og på andre websites.</translation> <translation id="1257553931232494454">zoomniveauer</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for at administrere dine Chrome-indstillinger</translation> -<translation id="1263231323834454256">Læseliste</translation> <translation id="1264309058268477500">Alternativ</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Enhedsoplåsning</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bakke 8</translation> <translation id="1530707389502320859">Det website, du netop forsøgte at gå til, ser ud til at være falsk. Svindlere efterligner nogle gange websites ved at lave små ændringer af webadressen, som er svære at se.</translation> <translation id="1532118530259321453">Denne side siger</translation> -<translation id="153384715582417236">Det var det hele indtil videre</translation> <translation id="1536390784834419204">Oversæt side</translation> <translation id="1539840569003678498">Rapporten blev sendt:</translation> <translation id="1549470594296187301">JavaScript skal være aktiveret, før du kan bruge denne funktion.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Din browser administreres</translation> <translation id="1746113442205726301">Billedskift Y</translation> <translation id="1746531169546376413">0 grader</translation> -<translation id="17513872634828108">Åbne faner</translation> <translation id="1752021286346845558">Postkasse 8</translation> <translation id="1753068535428855445">Kontaktannoncer og personlige annoncer</translation> <translation id="1753706481035618306">Sidetal</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prøv at køre Windows Netværksdiagnosticering<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Få flere oplysninger om inkognitotilstand i Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Dine åbne faner vises her</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tryk på Tab-tasten efterfulgt af Enter for hurtigt at administrere dine oplysninger, dit privatliv og beskyttelsen på din Google-konto</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, flere handlinger er tilgængelige, tryk på Tab-tasten for at gennemse dem</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Gruppe</translation> <translation id="2576880857912732701">Knappen "Administrer sikkerhedsindstillinger" – tryk på Enter for at administrere Beskyttet browsing m.m. i Chrome-indstillingerne</translation> <translation id="2586657967955657006">Udklipsholder</translation> -<translation id="2587730715158995865">Fra <ph name="ARTICLE_PUBLISHER" />. Læs denne og <ph name="OTHER_ARTICLE_COUNT" /> andre historier.</translation> <translation id="2587841377698384444">Id for Directory API:</translation> <translation id="2594318783181750337">Hurtig webvisning:</translation> <translation id="2595719060046994702">Denne enhed og konto administreres ikke af et selskab eller en organisation.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Ugyldig adgangskode</translation> <translation id="5051305769747448211">Livekomedier</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Hvis du vil sende denne fil ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}one{Hvis du vil sende denne fil ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}other{Hvis du vil sende disse filer ved hjælp af Deling tæt på, skal du frigøre plads (<ph name="DISK_SPACE_SIZE" />) på din enhed}}</translation> -<translation id="5056549851600133418">Artikler til dig</translation> <translation id="5060483733937416656">Du har valgt at bekræfte med Windows Hello på websites, der anvender <ph name="PROVIDER_ORIGIN" />. Denne udbyder har muligvis gemt oplysninger om din betalingsmetode. Du kan <ph name="LINK_TEXT" /> af disse oplysninger.</translation> <translation id="5061227663725596739">Mente du <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Udskrivningshistorik</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Postkasse 7</translation> <translation id="5541546772353173584">Tilføj mailadresse</translation> <translation id="5543722831081909240">180 grader</translation> -<translation id="5545756402275714221">Artikler til dig</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome tjekker regelmæssigt, om dine adgangskoder er på nogen lister over adgangskoder, der er blevet afsløret online. Dine adgangskoder og brugernavne krypteres under disse tjek, så de kan ikke læses af nogen, heller ikke Google.</translation> <translation id="5556459405103347317">Genindlæs</translation> @@ -1917,7 +1910,7 @@ <translation id="5689199277474810259">Eksportér i JSON</translation> <translation id="5689516760719285838">Placering</translation> <translation id="569000877158168851">DnsOverHttpsTemplates-værdien er ikke relevant og anvendes ikke, medmindre politikken DnsOverHttpsMode er angivet som enten <ph name="SECURE_DNS_MODE_AUTOMATIC" /> eller <ph name="SECURE_DNS_MODE_SECURE" />.</translation> -<translation id="5695542892312572833">Vil du bruge Windows Hello til at bekræfte og gennemføre dit køb?</translation> +<translation id="5695542892312572833">Vil du bruge Windows Hello til at verificere og gennemføre dit køb?</translation> <translation id="5701381305118179107">Centrér</translation> <translation id="570530837424789914">Administrer...</translation> <translation id="5706906618852913030">Vil du gemme adressen på din konto?</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">Lys grønblå</translation> <translation id="6272088941196661550">Genoptag din søgning for at se relevant aktivitet i din Chrome-historik</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Sider fra din læseliste vises her</translation> <translation id="627746635834430766">Gem dit kort og din faktureringsadresse på din Google-konto for at betale hurtigere næste gang.</translation> <translation id="6279183038361895380">Tryk på |<ph name="ACCELERATOR" />| at se markøren</translation> <translation id="6280223929691119688">Der kan ikke leveres til denne adresse. Vælg en anden adresse.</translation> <translation id="6284292079994426700">26 x 38 tommer</translation> <translation id="6285507000506177184">Knappen "Administrer downloads i Chrome" – tryk på Enter for at administrere de filer, du har downloadet i Chrome</translation> <translation id="6289939620939689042">Farve på side</translation> -<translation id="6290238015253830360">Forslag til artikler til dig vises her</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Gemmer...</translation> @@ -2246,7 +2237,7 @@ <translation id="6508722015517270189">Genstart Chrome</translation> <translation id="6513005815064132016">Websitet kan anmode om tilladelse til at registrere din kameraposition</translation> <translation id="6517596291481585650">Advarsel! Denne politik blev ikke flettet som angivet i politikken, da den ikke er en liste.</translation> -<translation id="6518133107902771759">Bekræft</translation> +<translation id="6518133107902771759">Verificer</translation> <translation id="6521745193039995384">Ikke aktiv</translation> <translation id="6529173248185917884">Syvende papirrulle</translation> <translation id="6529602333819889595">&Annuller fortryd slet</translation> @@ -2518,7 +2509,7 @@ <translation id="7210863904660874423"><ph name="HOST_NAME" /> overholder ikke sikkerhedsstandarderne.</translation> <translation id="7210993021468939304">Linux-aktivitet i containeren. Kan også installere og køre Linux-apps i containeren.</translation> <translation id="721197778055552897"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /> om dette problem.</translation> -<translation id="7217745192097460130">Vil du bruge Touch ID til at bekræfte og gennemføre dit køb?</translation> +<translation id="7217745192097460130">Vil du bruge Touch ID til at verificere og gennemføre dit køb?</translation> <translation id="7219179957768738017">Forbindelsen bruger <ph name="SSL_VERSION" />.</translation> <translation id="7220786058474068424">Behandler</translation> <translation id="7221855153210829124">Vise notifikationer</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Klassisk rock og ældre musik</translation> <translation id="769721561045429135">Lige nu har du kort, som kun kan bruges på denne enhed. Klik på Fortsæt for at se kortene.</translation> <translation id="7698864304447945242">Vil du opdatere Google Play-tjenester til AR?</translation> -<translation id="7699293099605015246">Der er ingen tilgængelige artikler lige nu</translation> <translation id="7701040980221191251">Ingen</translation> <translation id="7701544340847569275">Opdateringen blev afsluttet med fejl</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsæt til <ph name="SITE" /> (usikkert)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index 2d63f2b6..e817135e3 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Du hast dein Passwort auf einer Website eingegeben, die nicht von deiner Organisation verwaltet wird. Zum Schutz deines Kontos solltest du das Passwort nicht für andere Apps und Websites verwenden.</translation> <translation id="1257553931232494454">Zoomstufen</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" /> – drücke die Tabulatortaste und dann die Eingabetaste, um deine Chrome-Einstellungen zu verwalten</translation> -<translation id="1263231323834454256">Leseliste</translation> <translation id="1264309058268477500">Wechselnd</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Geräteentsperrung</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Fach 8</translation> <translation id="1530707389502320859">Die Website, die du besuchen möchtest, ist möglicherweise eine Fälschung. Angreifer kopieren manchmal Websites und nehmen kleine, unauffällige Änderungen an der URL vor.</translation> <translation id="1532118530259321453">Auf dieser Seite wird Folgendes angezeigt</translation> -<translation id="153384715582417236">Das ist im Moment alles</translation> <translation id="1536390784834419204">Seite übersetzen</translation> <translation id="1539840569003678498">Bericht gesendet:</translation> <translation id="1549470594296187301">Für diese Funktion muss JavaScript aktiviert sein.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Dein Browser wird verwaltet</translation> <translation id="1746113442205726301">Y-Verschiebung des Bilds</translation> <translation id="1746531169546376413">0°</translation> -<translation id="17513872634828108">Geöffnete Tabs</translation> <translation id="1752021286346845558">Ablage 8</translation> <translation id="1753068535428855445">Dating und Partnervermittlung</translation> <translation id="1753706481035618306">Seitennummer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Versuche, die Windows-Netzwerkdiagnose auszuführen.<ph name="END_LINK" /></translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Weitere Informationen zum Inkognitomodus in Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Hier werden deine offenen Tabs angezeigt</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" /> – drücke die Tabulatortaste und dann die Eingabetaste, um Daten sowie Datenschutz- und Sicherheitseinstellungen in deinem Google-Konto zu verwalten</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, es sind mehrere Aktionen verfügbar, drücke die Tabulatortaste, um sie durchzugehen</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Gruppe</translation> <translation id="2576880857912732701">Schaltfläche zum Verwalten der Sicherheitseinstellungen – drücke die Eingabetaste, um beispielsweise Safe Browsing in den Chrome-Einstellungen zu verwalten</translation> <translation id="2586657967955657006">Zwischenablage</translation> -<translation id="2587730715158995865">Von <ph name="ARTICLE_PUBLISHER" />. Diese Meldung und <ph name="OTHER_ARTICLE_COUNT" /> weitere Meldungen lesen.</translation> <translation id="2587841377698384444">Directory API-ID: </translation> <translation id="2594318783181750337">Schnelle Webanzeige:</translation> <translation id="2595719060046994702">Dieses Gerät und dieses Konto werden nicht von einem Unternehmen oder einer anderen Organisation verwaltet.</translation> @@ -1662,7 +1657,6 @@ <translation id="5045550434625856497">Falsches Passwort</translation> <translation id="5051305769747448211">Live-Comedy</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Damit du diese Datei mit Nearby Share senden kannst, musst du auf deinem Gerät Speicherplatz (<ph name="DISK_SPACE_SIZE" />) freigeben}other{Damit du diese Dateien mit Nearby Share senden kannst, musst du auf deinem Gerät Speicherplatz (<ph name="DISK_SPACE_SIZE" />) freigeben}}</translation> -<translation id="5056549851600133418">Artikel für mich</translation> <translation id="5060483733937416656">Du hast festgelegt, dass die Bestätigung auf Websites, die <ph name="PROVIDER_ORIGIN" /> verwenden, mit Windows Hello durchgeführt werden soll. Dieser Anbieter hat möglicherweise Informationen zu deiner Zahlungsmethode gespeichert. Du kannst deren <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Meintest du <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Druckverlauf</translation> @@ -1857,7 +1851,6 @@ <translation id="5541086400771735334">Ablage 7</translation> <translation id="5541546772353173584">E-Mail-Adresse hinzufügen</translation> <translation id="5543722831081909240">180°</translation> -<translation id="5545756402275714221">Artikel für mich</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Chrome prüft in regelmäßigen Abständen, ob deine Passwörter auf Listen erscheinen, die online veröffentlicht wurden. Dabei werden deine Passwörter und Nutzernamen verschlüsselt, damit sie von niemandem gelesen werden können, auch nicht von Google.</translation> <translation id="5556459405103347317">Neu laden</translation> @@ -2139,14 +2132,12 @@ <translation id="6266934640124581640">Helles Blaugrün</translation> <translation id="6272088941196661550">Du kannst weiter stöbern, um relevante Aktivitäten in deinem Chrome-Verlauf zu sehen</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Seiten von deiner Leseliste werden hier angezeigt</translation> <translation id="627746635834430766">Damit Zahlungen zukünftig schneller abgewickelt werden können, speichere deine Kreditkartendaten und deine Rechnungsadresse in deinem Google-Konto.</translation> <translation id="6279183038361895380">Zum Einblenden des Cursors |<ph name="ACCELERATOR" />| drücken</translation> <translation id="6280223929691119688">Die Lieferadresse wird nicht unterstützt. Bitte wähle eine andere Adresse aus.</translation> <translation id="6284292079994426700">26 x 38 Zoll</translation> <translation id="6285507000506177184">Schaltfläche zum Verwalten von Downloads in Chrome – drücke die Eingabetaste, um in Chrome heruntergeladene Dateien zu verwalten</translation> <translation id="6289939620939689042">Seitenfarbe</translation> -<translation id="6290238015253830360">Hier werden deine vorgeschlagenen Artikel angezeigt</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Wird gespeichert...</translation> @@ -2746,7 +2737,6 @@ <translation id="7696089921647603491">Classicrock und Oldies</translation> <translation id="769721561045429135">Derzeit können bestimmte Karten nur auf diesem Gerät verwendet werden. Klicke auf "Weiter", um dir die Karten anzusehen.</translation> <translation id="7698864304447945242">Google Play-Dienste für AR aktualisieren?</translation> -<translation id="7699293099605015246">Momentan sind keine Artikel verfügbar</translation> <translation id="7701040980221191251">Keine</translation> <translation id="7701544340847569275">Update mit Fehlern abgeschlossen</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Weiter zu <ph name="SITE" /> (unsicher)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index e8e14ee8..99343293 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Έχετε εισαγάγει τον κωδικό πρόσβασής σας σε έναν ιστότοπο τον οποίο δεν διαχειρίζεται ο οργανισμός σας. Για να προστατεύσετε τον λογαριασμό σας, μην χρησιμοποιήσετε ξανά αυτόν τον κωδικό πρόσβασης σε άλλες εφαρμογές και ιστοτόπους.</translation> <translation id="1257553931232494454">επίπεδα εστίασης</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, πατήστε το πλήκτρο Tab και έπειτα το πλήκτρο Enter για να διαχειριστείτε τις ρυθμίσεις του Chrome.</translation> -<translation id="1263231323834454256">Λίστα ανάγνωσης</translation> <translation id="1264309058268477500">Εναλλακτικός</translation> <translation id="1264974993859112054">Αθλητικά</translation> <translation id="1266469291454105242">Ξεκλείδωμα συσκευής</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Δίσκος 8</translation> <translation id="1530707389502320859">Ο ιστότοπος που προσπαθήσατε μόλις να επισκεφτείτε μοιάζει ψεύτικος. Οι εισβολείς απομιμούνται μερικές φορές ιστοτόπους κάνοντας μικρές, δυσδιάκριτες αλλαγές στο URL.</translation> <translation id="1532118530259321453">Αυτή η σελίδα λέει</translation> -<translation id="153384715582417236">Αυτά προς το παρόν</translation> <translation id="1536390784834419204">Μετάφραση σελίδας</translation> <translation id="1539840569003678498">Η αναφορά στάλθηκε:</translation> <translation id="1549470594296187301">Θα πρέπει να ενεργοποιηθεί η JavaScript για τη χρήση αυτής της λειτουργίας.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Το πρόγραμμα περιήγησής σας είναι διαχειριζόμενο</translation> <translation id="1746113442205726301">Μετατόπιση εικόνας στον άξονα Y</translation> <translation id="1746531169546376413">0 μοίρες</translation> -<translation id="17513872634828108">Ανοικτές καρτέλες</translation> <translation id="1752021286346845558">Γραμματοκιβώτιο 8</translation> <translation id="1753068535428855445">Γνωριμίες και προσωπικά</translation> <translation id="1753706481035618306">Αριθμός σελίδας</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Δοκιμάστε να εκτελέσετε τον Διαγνωστικό έλεγχο δικτύου των Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Μάθετε περισσότερα σχετικά με την Ανώνυμη περιήγηση στο Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Οι ανοιχτές καρτέλες σας εμφανίζονται εδώ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, πατήστε το πλήκτρο Tab και έπειτα το πλήκτρο Enter για να διαχειριστείτε τις πληροφορίες σας, το απόρρητο και την ασφάλεια στον Λογαριασμό σας Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Υπάρχουν πολλές διαθέσιμες ενέργειες. Πατήστε το πλήκτρο Tab για να μετακινηθείτε ανάμεσά τους.</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Στοιχεία εικονικής κάρτας</translation> <translation id="1803020234906945288">Υγιεινή διατροφή</translation> <translation id="1803351196216024260">Μπορεί να ζητά να χρησιμοποιεί το μικρόφωνό σας.</translation> +<translation id="1806174020048213474">Αυτή η εφαρμογή ζητά άδεια για εγκατάσταση διαπιστευτηρίων Wi-Fi. Μετά τη ρύθμιση, η συσκευή <ph name="DEVICE_TYPE" /> θα συνδεθεί αυτόματα στα δίκτυα Wi-Fi που συμμετέχουν. Για να καταργήσετε αυτά τα διαπιστευτήρια, απεγκαταστήστε την εφαρμογή.</translation> <translation id="1807246157184219062">Ανοιχτόχρωμο</translation> <translation id="1807528111851433570">Φύλλο έναρξης</translation> <translation id="180991881384371158">Ο κωδικός CVC βρίσκεται στο πίσω μέρος της κάρτας σας. Είναι τα 3 τελευταία ψηφία στην επάνω δεξιά γωνία του πλαισίου υπογραφής.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Ομάδα</translation> <translation id="2576880857912732701">Κουμπί Διαχείριση ρυθμίσεων ασφάλειας, πατήστε το πλήκτρο Enter για να διαχειριστείτε την Ασφαλή περιήγηση και άλλες επιλογές από τις ρυθμίσεις του Chrome</translation> <translation id="2586657967955657006">Πρόχειρο</translation> -<translation id="2587730715158995865">Από <ph name="ARTICLE_PUBLISHER" />. Διαβάστε αυτό το άρθρο και <ph name="OTHER_ARTICLE_COUNT" /> ακόμα ιστορίες.</translation> <translation id="2587841377698384444">Αναγνωριστικό API καταλόγου:</translation> <translation id="2594318783181750337">Γρήγορη προβολή ιστού:</translation> <translation id="2595719060046994702">Αυτή η συσκευή και αυτός ο λογαριασμός δεν είναι υπό τη διαχείριση μιας εταιρείας ή ενός οργανισμού.</translation> @@ -1342,6 +1338,7 @@ <translation id="4270541775497538019">Μονάδα στοίβαξης 6</translation> <translation id="4274173425554582601">Υπολογιστές και ηλεκτρονικές συσκευές</translation> <translation id="4275830172053184480">Επανεκκινήστε τη συσκευή σας</translation> +<translation id="4276974990916607331">Όχι, ευχαριστώ</translation> <translation id="4277028893293644418">Επαναφορά κωδικού πρόσβασης</translation> <translation id="4277937682389409325">Τοπική διεύθυνση</translation> <translation id="4278390842282768270">Επιτρέπεται</translation> @@ -1665,7 +1662,6 @@ <translation id="5045550434625856497">Λανθασμένος κωδικός πρόσβασης</translation> <translation id="5051305769747448211">Ζωντανή κωμωδία</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Για να στείλετε αυτό το αρχείο χρησιμοποιώντας την Κοινοποίηση κοντά, ελευθερώστε χώρο (<ph name="DISK_SPACE_SIZE" />) στη συσκευή σας}other{Για να στείλετε αυτά τα αρχεία χρησιμοποιώντας την Κοινοποίηση κοντά, ελευθερώστε χώρο (<ph name="DISK_SPACE_SIZE" />) στη συσκευή σας}}</translation> -<translation id="5056549851600133418">Άρθρα για εσάς</translation> <translation id="5060483733937416656">Επιλέξατε να γίνεται επαλήθευση με το Windows Hello σε ιστοτόπους που χρησιμοποιούν τον πάροχο <ph name="PROVIDER_ORIGIN" />. Αυτός ο πάροχος μπορεί να έχει αποθηκεύσει πληροφορίες σχετικά με τον τρόπο πληρωμής σας, τις οποίες μπορείτε να <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Μήπως εννοούσατε <ph name="LOOKALIKE_DOMAIN" />;</translation> <translation id="5066056036849835175">Ιστορικό εκτύπωσης</translation> @@ -1703,6 +1699,7 @@ <translation id="5129534298163637277">Παράθυρο διαλόγου επιβεβαίωσης</translation> <translation id="5135404736266831032">Διαχείριση διευθύνσεων…</translation> <translation id="5136841603454277753">Εισαγάγετε τον σωστό κωδικό</translation> +<translation id="5137761395480718572">Αυτή η εφαρμογή ζητά άδεια για εγκατάσταση διαπιστευτηρίων Wi-Fi. Μετά τη ρύθμιση, η συσκευή <ph name="DEVICE_TYPE" /> θα συνδεθεί αυτόματα στα δίκτυα Wi-Fi που συμμετέχουν. Για να καταργήσετε αυτά τα διαπιστευτήρια, απεγκαταστήστε την εφαρμογή. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Η εικονική κάρτα δεν είναι διαθέσιμη αυτήν τη στιγμή. Επικοινωνήστε με την τράπεζά σας.</translation> <translation id="5138227688689900538">Εμφάνιση λιγότερων</translation> <translation id="5145883236150621069">Βρέθηκε κωδικός σφάλματος στην απόκριση πολιτικής</translation> @@ -1759,6 +1756,7 @@ <translation id="5273881944177595304">Εφαρμογές ιστού και εργαλεία στο διαδίκτυο</translation> <translation id="5274025349362408263">Βιβλία και λογοτεχνία</translation> <translation id="5279286380302340275">Διαχείριση στοιχείων λήψης</translation> +<translation id="5279453600310613955">Όχι, ευχαριστώ</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Ιδιότητες εγγράφου</translation> <translation id="528468243742722775">Τέλος</translation> @@ -1862,7 +1860,6 @@ <translation id="5541086400771735334">Γραμματοκιβώτιο 7</translation> <translation id="5541546772353173584">Προσθήκη διεύθυνσης ηλεκτρονικού ταχυδρομείου</translation> <translation id="5543722831081909240">180 μοίρες</translation> -<translation id="5545756402275714221">Άρθρα για εσάς</translation> <translation id="5551890439174915351">100 x 200 χιλ.</translation> <translation id="5552137475244467770">Το Chrome ελέγχει ανά διαστήματα τους κωδικούς πρόσβασής σας σε σχέση με λίστες που έχουν δημοσιευτεί στο διαδίκτυο. Κατά τη διάρκεια αυτής της διαδικασίας, οι κωδικοί πρόσβασης και τα ονόματα χρήστη σας κρυπτογραφούνται, έτσι ώστε να μην μπορεί να τα διαβάσει κανείς, συμπεριλαμβανομένης της Google.</translation> <translation id="5556459405103347317">Επαναφόρτωση</translation> @@ -2144,14 +2141,12 @@ <translation id="6266934640124581640">Ανοιχτό γαλαζοπράσινο</translation> <translation id="6272088941196661550">Συνεχίστε τη διαδρομή σας για προβολή σχετικής δραστηριότητας στο Ιστορικό Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Εδώ εμφανίζονται οι σελίδες από τη λίστα ανάγνωσής σας</translation> <translation id="627746635834430766">Για πιο γρήγορες πληρωμές, αποθηκεύστε τα στοιχεία της κάρτας και τη διεύθυνση χρέωσης στον Λογαριασμό σας Google.</translation> <translation id="6279183038361895380">Πιέστε |<ph name="ACCELERATOR" />| για να εμφανιστεί ο δρομέας</translation> <translation id="6280223929691119688">Δεν είναι δυνατή η παράδοση σε αυτήν τη διεύθυνση. Επιλέξτε μια άλλη διεύθυνση.</translation> <translation id="6284292079994426700">26 x 38 ίντσες</translation> <translation id="6285507000506177184">Κουμπί Διαχείριση λήψεων στο Chrome, πατήστε το πλήκτρο Enter για να διαχειριστείτε τα αρχεία που έχετε κατεβάσει στο Chrome</translation> <translation id="6289939620939689042">Χρώμα σελίδας</translation> -<translation id="6290238015253830360">Τα προτεινόμενα άρθρα σας εμφανίζονται εδώ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Αποθήκευση…</translation> @@ -2254,6 +2249,7 @@ <translation id="6529173248185917884">Έβδομο ρολό</translation> <translation id="6529602333819889595">&Επανάληψη διαγραφής</translation> <translation id="6535751101619004418">Νομίσματα και συνάλλαγμα</translation> +<translation id="6536221421038631327">Με την κατάργηση μιας συνδρομής Passpoint από τη συσκευή <ph name="DEVICE_TYPE" />, θα καταργηθούν τα συσχετισμένα δίκτυα. Επικοινωνήστε με το <ph name="FRIENDLY_NAME" /> για να κάνετε αλλαγές στο πρόγραμμα συνδρομής σας. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Αμοιβαία κεφάλαια</translation> <translation id="6545864417968258051">Σάρωση Bluetooth</translation> <translation id="6547208576736763147">Διπλό τρύπημα στα αριστερά</translation> @@ -2751,7 +2747,6 @@ <translation id="7696089921647603491">Κλασικό ροκ και oldies</translation> <translation id="769721561045429135">Αυτήν τη στιγμή, έχετε κάρτες που μπορούν να χρησιμοποιηθούν μόνο σε αυτήν τη συσκευή. Κάντε κλικ στη Συνέχεια για να ελέγξετε τις κάρτες.</translation> <translation id="7698864304447945242">Ενημέρωση των Υπηρεσιών Google Play για AR;</translation> -<translation id="7699293099605015246">Δεν υπάρχουν διαθέσιμα άρθρα αυτήν τη στιγμή</translation> <translation id="7701040980221191251">Καμία</translation> <translation id="7701544340847569275">Η ενημέρωση ολοκληρώθηκε με σφάλματα</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Μετάβαση στον ιστότοπο <ph name="SITE" /> (μη ασφαλής)<ph name="END_LINK" /></translation> @@ -3351,6 +3346,7 @@ <translation id="9219103736887031265">Εικόνες</translation> <translation id="922152298093051471">Προσαρμογή του Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Να επιτρέπεται στην εφαρμογή <ph name="APP_NAME" /> η ρύθμιση δικτύων Wi-Fi;</translation> <translation id="936602727769022409">Μπορεί να χάσετε την πρόσβαση στον Λογαριασμό σας Google. Το Chromium συνιστά να αλλάξετε τον κωδικό πρόσβασής σας τώρα. Θα σας ζητηθεί να συνδεθείτε.</translation> <translation id="937457230470581909">Ζωολογικοί κήποι, ενυδρεία και προστατευόμενες περιοχές</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Ποια δεδομένα χρησιμοποιούνται:<ph name="END_BOLD" /> Τα θέματα διαφημίσεων βασίζονται στο πρόσφατο ιστορικό περιήγησης, μια λίστα των ιστοτόπων που έχετε επισκεφτεί χρησιμοποιώντας το Chrome σε αυτήν τη συσκευή.</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb index 7f3ce58..d3d529c 100644 --- a/components/strings/components_strings_en-GB.xtb +++ b/components/strings/components_strings_en-GB.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">You entered your password on a site that’s not managed by your organisation. To protect your account, don’t reuse your password on other apps and sites.</translation> <translation id="1257553931232494454">zoom levels</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />: press Tab then Enter to manage your Chrome settings</translation> -<translation id="1263231323834454256">Reading list</translation> <translation id="1264309058268477500">Alternative</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1266469291454105242">Device unlock</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tray 8</translation> <translation id="1530707389502320859">The site that you just tried to visit looks fake. Attackers sometimes mimic sites by making small, hard-to-see changes to the URL.</translation> <translation id="1532118530259321453">This page says</translation> -<translation id="153384715582417236">That’s all for now</translation> <translation id="1536390784834419204">Translate page</translation> <translation id="1539840569003678498">Report sent:</translation> <translation id="1549470594296187301">JavaScript must be enabled to use this feature.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Your browser is managed</translation> <translation id="1746113442205726301">Image Y shift</translation> <translation id="1746531169546376413">0 degrees</translation> -<translation id="17513872634828108">Open tabs</translation> <translation id="1752021286346845558">Mailbox 8</translation> <translation id="1753068535428855445">Dating and personals</translation> <translation id="1753706481035618306">Page number</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Try running Windows Network Diagnostics<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Learn more about Incognito in Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Your open tabs appear here</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />: press Tab then Enter to manage your info, privacy and security in your Google Account</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, multiple actions are available; press 'Tab' to cycle through them</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Virtual card details</translation> <translation id="1803020234906945288">Healthy eating</translation> <translation id="1803351196216024260">Can ask to use your microphone</translation> +<translation id="1806174020048213474">This app is requesting permission to install Wi-Fi credentials. After setup, your <ph name="DEVICE_TYPE" /> will automatically connect to participating Wi-Fi networks. To remove these credentials, uninstall the app.</translation> <translation id="1807246157184219062">Light</translation> <translation id="1807528111851433570">Start sheet</translation> <translation id="180991881384371158">Your CVC is on the back of your card. It’s the last three digits at the top right of the signature box.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Group</translation> <translation id="2576880857912732701">Manage security settings button; press Enter to manage your Safe Browsing and more in Chrome settings</translation> <translation id="2586657967955657006">Clipboard</translation> -<translation id="2587730715158995865">From <ph name="ARTICLE_PUBLISHER" />. Read this and <ph name="OTHER_ARTICLE_COUNT" /> other stories.</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">Fast web view:</translation> <translation id="2595719060046994702">This device and account are not managed by a company or other organisation.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">Stacker 6</translation> <translation id="4274173425554582601">Computers and electronics</translation> <translation id="4275830172053184480">Restart your device</translation> +<translation id="4276974990916607331">No thanks</translation> <translation id="4277028893293644418">Reset password</translation> <translation id="4277937682389409325">Local address</translation> <translation id="4278390842282768270">Allowed</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Incorrect password</translation> <translation id="5051305769747448211">Live comedy</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{To send this file using Nearby Share, free up space (<ph name="DISK_SPACE_SIZE" />) on your device}other{To send these files using Nearby Share, free up space (<ph name="DISK_SPACE_SIZE" />) on your device}}</translation> -<translation id="5056549851600133418">Articles for you</translation> <translation id="5060483733937416656">You chose to verify with Windows Hello on websites that use <ph name="PROVIDER_ORIGIN" />. This provider may have stored information about your payment method, which you can <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Did you mean <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Printing history</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Confirmation dialogue</translation> <translation id="5135404736266831032">Manage addresses...</translation> <translation id="5136841603454277753">Enter correct code</translation> +<translation id="5137761395480718572">This app is requesting permission to install Wi-Fi credentials. After setup, your <ph name="DEVICE_TYPE" /> will automatically connect to participating Wi-Fi networks. To remove these credentials, uninstall the app. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtual card is not available at the moment; please contact your bank</translation> <translation id="5138227688689900538">Show less</translation> <translation id="5145883236150621069">Error code present in the policy response</translation> @@ -1758,6 +1755,7 @@ <translation id="5273881944177595304">Web apps and online tools</translation> <translation id="5274025349362408263">Books and literature</translation> <translation id="5279286380302340275">Manage downloads</translation> +<translation id="5279453600310613955">No thanks</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Document properties</translation> <translation id="528468243742722775">End</translation> @@ -1861,7 +1859,6 @@ <translation id="5541086400771735334">Mailbox 7</translation> <translation id="5541546772353173584">Add Email</translation> <translation id="5543722831081909240">180 degrees</translation> -<translation id="5545756402275714221">Articles for You</translation> <translation id="5551890439174915351">100 mm x 200 mm</translation> <translation id="5552137475244467770">Chrome periodically checks your passwords against lists that have been published online. When doing this, your passwords and usernames are encrypted, so they can’t be read by anyone, including Google.</translation> <translation id="5556459405103347317">Reload</translation> @@ -2143,14 +2140,12 @@ <translation id="6266934640124581640">Light teal</translation> <translation id="6272088941196661550">Resume your journey to see relevant activity in your Chrome history</translation> <translation id="6272383483618007430">Google update</translation> -<translation id="6276112860590028508">Pages from your reading list appear here</translation> <translation id="627746635834430766">To pay faster next time, save your card and billing address to your Google Account.</translation> <translation id="6279183038361895380">Press |<ph name="ACCELERATOR" />| to show your cursor</translation> <translation id="6280223929691119688">Can’t deliver to this address. Select a different address.</translation> <translation id="6284292079994426700">26 in x 38 in</translation> <translation id="6285507000506177184">Manage downloads in Chrome button; press Enter to manage files that you have downloaded in Chrome</translation> <translation id="6289939620939689042">Page colour</translation> -<translation id="6290238015253830360">Your suggested articles appear here</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Saving...</translation> @@ -2253,6 +2248,7 @@ <translation id="6529173248185917884">Seventh roll</translation> <translation id="6529602333819889595">&Redo Delete</translation> <translation id="6535751101619004418">Currencies and foreign exchange</translation> +<translation id="6536221421038631327">Removing a Passpoint subscription from your <ph name="DEVICE_TYPE" /> will remove the associated networks. Contact '<ph name="FRIENDLY_NAME" />' to make changes to your subscription plan. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Mutual funds</translation> <translation id="6545864417968258051">Bluetooth scanning</translation> <translation id="6547208576736763147">Dual punch left</translation> @@ -2750,7 +2746,6 @@ <translation id="7696089921647603491">Classic rock and oldies</translation> <translation id="769721561045429135">At the moment, you have cards that can only be used on this device. Click Continue to review cards.</translation> <translation id="7698864304447945242">Update Google Play Services for AR?</translation> -<translation id="7699293099605015246">Articles aren't available at the moment.</translation> <translation id="7701040980221191251">None</translation> <translation id="7701544340847569275">Update finished with errors</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Proceed to <ph name="SITE" /> (unsafe)<ph name="END_LINK" /></translation> @@ -3349,6 +3344,7 @@ <translation id="9219103736887031265">Images</translation> <translation id="922152298093051471">Customise Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Allow the <ph name="APP_NAME" /> app to set up Wi-Fi networks?</translation> <translation id="936602727769022409">You could lose access to your Google Account. Chromium recommends changing your password now. You'll be asked to sign in.</translation> <translation id="937457230470581909">Zoos, aquariums and preserves</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />What data is used:<ph name="END_BOLD" /> Your ad topics are based on your recent browsing history – a list of sites that you’ve visited using Chrome on this device.</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb index 70f4145..61f2fee 100644 --- a/components/strings/components_strings_es-419.xtb +++ b/components/strings/components_strings_es-419.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ingresaste tu contraseña en un sitio que no administra tu organización. Para proteger tu cuenta, no vuelvas a usar tu contraseña en otras apps y sitios.</translation> <translation id="1257553931232494454">niveles de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para administrar tu configuración de Chrome</translation> -<translation id="1263231323834454256">Lista de lectura</translation> <translation id="1264309058268477500">Alternativa</translation> <translation id="1264974993859112054">Deportes</translation> <translation id="1266469291454105242">Desbloqueo del dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bandeja 8</translation> <translation id="1530707389502320859">El sitio que intentaste visitar parece falso. A veces, los atacantes hacen cambios sutiles y difíciles de detectar en la URL para imitar sitios.</translation> <translation id="1532118530259321453">Esta página dice</translation> -<translation id="153384715582417236">Eso es todo por ahora</translation> <translation id="1536390784834419204">Traducir la página</translation> <translation id="1539840569003678498">Fecha de envío del informe:</translation> <translation id="1549470594296187301">JavaScript debe estar habilitado para usar esta función.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Tu navegador está administrado</translation> <translation id="1746113442205726301">Cambio del eje Y de la imagen</translation> <translation id="1746531169546376413">0 grados</translation> -<translation id="17513872634828108">Pestañas abiertas</translation> <translation id="1752021286346845558">Buzón 8</translation> <translation id="1753068535428855445">Citas y anuncios personales</translation> <translation id="1753706481035618306">Número de página</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Intenta ejecutar el Diagnóstico de red de Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Obtén más información sobre el modo Incógnito en Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tus pestañas abiertas aparecen aquí</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, presiona Tab y, luego, Intro para administrar la información, privacidad y seguridad de tu Cuenta de Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />: hay varias acciones disponibles; presiona Tab para elegir una</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Agrupar</translation> <translation id="2576880857912732701">Botón Administrar la configuración de seguridad: presiona Intro para administrar tu Navegación segura y más en la configuración de Chrome</translation> <translation id="2586657967955657006">Portapapeles</translation> -<translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Lee este artículo y <ph name="OTHER_ARTICLE_COUNT" /> más.</translation> <translation id="2587841377698384444">ID de API de directorio:</translation> <translation id="2594318783181750337">Vista rápida en Web:</translation> <translation id="2595719060046994702">Este dispositivo y esta cuenta no están administrados por una empresa ni otra organización.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Contraseña incorrecta</translation> <translation id="5051305769747448211">Comedia en vivo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este archivo mediante Compartir con Nearby, libera espacio (<ph name="DISK_SPACE_SIZE" />) en el dispositivo.}other{Para enviar estos archivos mediante Compartir con Nearby, libera espacio (<ph name="DISK_SPACE_SIZE" />) en el dispositivo.}}</translation> -<translation id="5056549851600133418">Artículos para ti</translation> <translation id="5060483733937416656">Elegiste realizar la verificación con Windows Hello en sitios web que usan <ph name="PROVIDER_ORIGIN" />. Es posible que este proveedor haya almacenado información sobre tu forma de pago, la que puedes <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">¿Quisiste decir <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historial de impresión</translation> @@ -1860,7 +1854,6 @@ <translation id="5541086400771735334">Buzón 7</translation> <translation id="5541546772353173584">Agregar correo electrónico</translation> <translation id="5543722831081909240">180 grados</translation> -<translation id="5545756402275714221">Artículos para ti</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Chrome revisa tus contraseñas de forma periódica para comprobar si aparecen en listas que se hayan publicado en línea. Durante esta acción, se encriptan tus contraseñas y nombres de usuario para que nadie, ni siquiera Google, pueda leer esta información.</translation> <translation id="5556459405103347317">Volver a cargar</translation> @@ -2142,14 +2135,12 @@ <translation id="6266934640124581640">Verde azulado claro</translation> <translation id="6272088941196661550">Reanuda la exploración para ver actividad pertinente en tu historial de Chrome.</translation> <translation id="6272383483618007430">Google Actualización</translation> -<translation id="6276112860590028508">Las páginas de tu lista de lectura aparecen aquí</translation> <translation id="627746635834430766">Para realizar pagos de forma más rápida la próxima vez, guarda tu tarjeta y dirección de facturación en tu Cuenta de Google.</translation> <translation id="6279183038361895380">Presiona |<ph name="ACCELERATOR" />| para mostrar tu cursor</translation> <translation id="6280223929691119688">La dirección de envío no es válida. Selecciona una dirección diferente.</translation> <translation id="6284292079994426700">66.04 × 96.52 cm</translation> <translation id="6285507000506177184">Botón Administrar las descargas en Chrome: presiona Intro para administrar los archivos que has descargado en Chrome</translation> <translation id="6289939620939689042">Color de la página</translation> -<translation id="6290238015253830360">Tus artículos sugeridos aparecen aquí</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Guardando…</translation> @@ -2749,7 +2740,6 @@ <translation id="7696089921647603491">Rock clásico</translation> <translation id="769721561045429135">En este momento, tienes tarjetas que pueden usarse solo en este dispositivo. Haz clic en Continuar para revisar las tarjetas.</translation> <translation id="7698864304447945242">¿Quieres actualizar los Servicios de Google Play para RA?</translation> -<translation id="7699293099605015246">Los artículos no están disponibles en este momento</translation> <translation id="7701040980221191251">Ninguna</translation> <translation id="7701544340847569275">La actualización finalizó con errores</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuar a <ph name="SITE" /> (no seguro)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb index b3e9066a..3f4db7f 100644 --- a/components/strings/components_strings_es.xtb +++ b/components/strings/components_strings_es.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Has introducido tu contraseña en un sitio web que no está gestionado por tu organización. Para proteger tu cuenta, no vuelvas a utilizar tu contraseña en otras aplicaciones ni en otros sitios.</translation> <translation id="1257553931232494454">niveles de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pulsa Tabulador y luego Intro para gestionar la configuración de Chrome</translation> -<translation id="1263231323834454256">Lista de lectura</translation> <translation id="1264309058268477500">Alternativa</translation> <translation id="1264974993859112054">Deportes</translation> <translation id="1266469291454105242">Desbloqueo del dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bandeja 8</translation> <translation id="1530707389502320859">El sitio web al que estás intentando acceder parece falso. Los atacantes suelen imitar los sitios haciendo pequeños cambios en la URL que son difíciles de ver.</translation> <translation id="1532118530259321453">Esta página dice</translation> -<translation id="153384715582417236">Eso es todo por ahora</translation> <translation id="1536390784834419204">Traducir página</translation> <translation id="1539840569003678498">Informe enviado:</translation> <translation id="1549470594296187301">JavaScript debe estar habilitado para utilizar esta función.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Tu navegador está administrado</translation> <translation id="1746113442205726301">Desplazamiento de la imagen en el eje Y</translation> <translation id="1746531169546376413">0 grados</translation> -<translation id="17513872634828108">Pestañas abiertas</translation> <translation id="1752021286346845558">Buzón de correo 8</translation> <translation id="1753068535428855445">Citas y anuncios personales</translation> <translation id="1753706481035618306">Número de página</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prueba a ejecutar Diagnósticos de red de Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Más información sobre el modo Incógnito de Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Las pestañas abiertas aparecen aquí</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pulsa Tabulador y luego Intro para gestionar la información, la privacidad y la seguridad de tu cuenta de Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, hay varias acciones disponibles, pulsa Tabulador para desplazarte entre ellas</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupo</translation> <translation id="2576880857912732701">Botón Gestionar ajustes de seguridad: pulsa Intro para gestionar Navegación segura y otras opciones en la configuración de Chrome</translation> <translation id="2586657967955657006">Portapapeles</translation> -<translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Lee este y <ph name="OTHER_ARTICLE_COUNT" /> artículos más.</translation> <translation id="2587841377698384444">ID de la API del directorio:</translation> <translation id="2594318783181750337">Vista web rápida:</translation> <translation id="2595719060046994702">Este dispositivo y esta cuenta no están administrados por ninguna empresa ni organización.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Contraseña incorrecta</translation> <translation id="5051305769747448211">Comedia en directo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este archivo usando Compartir con Nearby, libera espacio (<ph name="DISK_SPACE_SIZE" />) en tu dispositivo}other{Para enviar estos archivos usando Compartir con Nearby, libera espacio (<ph name="DISK_SPACE_SIZE" />) en tu dispositivo}}</translation> -<translation id="5056549851600133418">Artículos recomendados para ti</translation> <translation id="5060483733937416656">Has elegido realizar la verificación con Windows Hello en sitios web que usan <ph name="PROVIDER_ORIGIN" />. Este proveedor puede haber almacenado información sobre tu método de pago, que puedes <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">¿Querías decir <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historial de impresión</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Cerrar</translation> <translation id="5239623327352565343">Ubicación permitida</translation> <translation id="5242889659037569123">Maletas y accesorios de viaje</translation> +<translation id="5244732203286792411">Cargando... + Este proceso puede tardar un minuto.</translation> <translation id="5250209940322997802">"Conéctate a la red"</translation> <translation id="52517543715119994">Consulta información sobre las funciones de Chrome</translation> <translation id="5251803541071282808">Nube</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Buzón de correo 7</translation> <translation id="5541546772353173584">Añade un correo electrónico</translation> <translation id="5543722831081909240">180 grados</translation> -<translation id="5545756402275714221">Artículos recomendados para ti</translation> <translation id="5551890439174915351">100x200 mm</translation> <translation id="5552137475244467770">Chrome comprueba de forma periódica si tus contraseñas se encuentran en alguna lista publicada en Internet. Cuando lo hace, se cifran tus contraseñas y nombres de usuario para que nadie pueda leerlos, ni siquiera Google.</translation> <translation id="5556459405103347317">Volver a cargar</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Verde azulado claro</translation> <translation id="6272088941196661550">Reanuda tu recorrido para ver la actividad relevante de tu historial de Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Las páginas de tu lista de lectura aparecen aquí</translation> <translation id="627746635834430766">Para pagar más rápido la próxima vez, guarda tu tarjeta y tu dirección de facturación en tu cuenta de Google.</translation> <translation id="6279183038361895380">Pulsa |<ph name="ACCELERATOR" />| para mostrar el cursor</translation> <translation id="6280223929691119688">Los pedidos no se pueden entregar en esta dirección. Selecciona otra.</translation> <translation id="6284292079994426700">26x38 pulgadas</translation> <translation id="6285507000506177184">Botón Gestionar las descargas en Chrome: pulsa Intro para gestionar los archivos que has descargado en Chrome</translation> <translation id="6289939620939689042">Color de la página</translation> -<translation id="6290238015253830360">Los artículos sugeridos aparecen aquí</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Guardando...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Clásicos del rock</translation> <translation id="769721561045429135">Tienes tarjetas que solo se pueden usar en este dispositivo. Haz clic en Continuar para revisarlas.</translation> <translation id="7698864304447945242">¿Actualizar Servicios de Google Play para RA?</translation> -<translation id="7699293099605015246">Los artículos no están disponibles en este momento</translation> <translation id="7701040980221191251">No hay</translation> <translation id="7701544340847569275">Actualización finalizada con errores</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Acceder a <ph name="SITE" /> (sitio no seguro)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb index 07244f0aa..84ff08f 100644 --- a/components/strings/components_strings_et.xtb +++ b/components/strings/components_strings_et.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Sisestasite oma parooli saidile, mida ei halda teie organisatsioon. Oma konto kaitsmiseks ärge kasutage oma parooli muudes rakendustes ega saitidel.</translation> <translation id="1257553931232494454">suumitasemed</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, oma Chrome'i seadete haldamiseks vajutage tabulaatorit ja seejärel sisestusklahvi.</translation> -<translation id="1263231323834454256">Lugemisloend</translation> <translation id="1264309058268477500">Alternatiivne</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Seadmega avamine</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Salv 8</translation> <translation id="1530707389502320859">Sait, mida üritasite külastada, näib olevat võltsitud. Ründajad imiteerivad mõnikord saite, tehes URL-is väikeseid raskestimärgatavaid muudatusi.</translation> <translation id="1532118530259321453">Leht ütleb</translation> -<translation id="153384715582417236">See on praeguseks kõik</translation> <translation id="1536390784834419204">Tõlgi leht</translation> <translation id="1539840569003678498">Aruanne saadeti:</translation> <translation id="1549470594296187301">Selle funktsiooni kasutamiseks peab JavaScript olema lubatud.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Teie brauserit hallatakse</translation> <translation id="1746113442205726301">Pildi nihe Y-teljel</translation> <translation id="1746531169546376413">0 kraadi</translation> -<translation id="17513872634828108">Avatud vahelehed</translation> <translation id="1752021286346845558">Postkast 8</translation> <translation id="1753068535428855445">Kohtingud ja tutvumiskuulutused</translation> <translation id="1753706481035618306">Lk</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Proovige käitada Windowsi võrgudiagnostika tööriista<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Lisateave Chromiumi inkognito režiimi kohta<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Teie avatud vahelehed kuvatakse siin</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, oma Google'i kontol teabe, privaatsuse ja turvalisuse haldamiseks vajutage tabulaatorit ja seejärel sisestusklahvi</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, saadaval on mitu toimingut, vajutage nende vahel vahetamiseks tabulaatorit</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupeeri</translation> <translation id="2576880857912732701">Nupp Turvaseadete haldamine, vajutage Chrome'i seadetes Google'i ohutu sirvimise ja muu haldamiseks sisestusklahvi</translation> <translation id="2586657967955657006">Lõikelaud</translation> -<translation id="2587730715158995865">Avaldajalt <ph name="ARTICLE_PUBLISHER" />. Lugege seda ja <ph name="OTHER_ARTICLE_COUNT" /> teist lugu.</translation> <translation id="2587841377698384444">Kataloogi API ID:</translation> <translation id="2594318783181750337">Kiire veebikuva:</translation> <translation id="2595719060046994702">Seda seadet ja kontot ei halda ettevõte ega muu organisatsioon.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Vale salasõna</translation> <translation id="5051305769747448211">Komöödiaesitused</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Selle faili saatmiseks funktsiooni Läheduses jagamine kaudu vabastage seadmes ruumi (<ph name="DISK_SPACE_SIZE" />)}other{Nende failide saatmiseks funktsiooni Läheduses jagamine kaudu vabastage seadmes ruumi (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Teile soovitatud artiklid</translation> <translation id="5060483733937416656">Valisite Windows Helloga kinnitamise veebisaitide puhul, mis kasutavad pakkujat <ph name="PROVIDER_ORIGIN" />. See pakkuja võis teie makseviisi teabe salvestada. Võite <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Kas mõtlesite domeeni <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Printimisajalugu</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Loobu</translation> <translation id="5239623327352565343">Asukoht on lubatud</translation> <translation id="5242889659037569123">Pagas ja reisitarvikud</translation> +<translation id="5244732203286792411">Laadimine … + See võib võtta minuti.</translation> <translation id="5250209940322997802">„Looge võrguühendus”</translation> <translation id="52517543715119994">Teave Chrome'i funktsioonide kohta</translation> <translation id="5251803541071282808">Pilv</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Postkast 7</translation> <translation id="5541546772353173584">E-posti aadressi lisamine</translation> <translation id="5543722831081909240">180 kraadi</translation> -<translation id="5545756402275714221">Teile soovitatud artiklid</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Chrome võrdleb teie paroole regulaarselt veebis avaldatud loenditega. Selle käigus on teie paroolid ja kasutajanimed krüpteeritud, et mitte keegi (sh Google) ei saaks neid lugeda.</translation> <translation id="5556459405103347317">Laadi uuesti</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Helesinakasroheline</translation> <translation id="6272088941196661550">Jätkake oma teekonda, et näha Chrome'i ajaloos asjakohaseid tegevusi</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Siin kuvatakse teie lugemisloendis olevad lehed</translation> <translation id="627746635834430766">Kui soovite järgmisel korral kiiremini maksta, salvestage kaart ja arveldusaadress oma Google'i kontole.</translation> <translation id="6279183038361895380">Kursori kuvamiseks vajutage klahvi |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Sellele aadressile ei saa kaupa kohale toimetada. Valige mõni teine aadress.</translation> <translation id="6284292079994426700">26 × 38 tolli</translation> <translation id="6285507000506177184">Nupp Chrome'i allalaadimiste haldamine, Chrome'is allalaaditud failide haldamiseks vajutage sisestusklahvi</translation> <translation id="6289939620939689042">Lehe värv</translation> -<translation id="6290238015253830360">Teie soovitatud artiklid kuvatakse siin</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Salvestamine ...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Klassikaline rokk ja vanad hitid</translation> <translation id="769721561045429135">Praegu on teil kaarte, mida saab kasutada ainult selles seadmes. Kaartide ülevaatamiseks klõpsake käsul Jätka.</translation> <translation id="7698864304447945242">Kas värskendada rakendust Google Play Services for AR?</translation> -<translation id="7699293099605015246">Artiklid pole praegu saadaval</translation> <translation id="7701040980221191251">Pole</translation> <translation id="7701544340847569275">Värskendamine lõppes vigadega</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Edasiliikumine saidile <ph name="SITE" /> (ebaturvaline)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_eu.xtb b/components/strings/components_strings_eu.xtb index 75f25f1..0161a85 100644 --- a/components/strings/components_strings_eu.xtb +++ b/components/strings/components_strings_eu.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Zure erakundeak kudeatzen ez duen webgune batean idatzi duzu pasahitza. Kontua babesteko, ez erabili berriro pasahitz hori beste inongo aplikazio eta webgunetan.</translation> <translation id="1257553931232494454">zoom-mailak</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />: sakatu tabuladorea eta, ondoren, sakatu "Sartu" Chrome-ren ezarpenak kudeatzeko</translation> -<translation id="1263231323834454256">Irakurketa-zerrenda</translation> <translation id="1264309058268477500">Ordezkoa</translation> <translation id="1264974993859112054">Kirolak</translation> <translation id="1266469291454105242">Gailu-desblokeoa</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8. erretilua</translation> <translation id="1530707389502320859">Bisitatzen saiatu zaren webguneak faltsua dirudi. Batzuetan, erasotzaileek webgune ofizialen plantak egiten dituzte URLari aldaketa oso txikiak eginda.</translation> <translation id="1532118530259321453">Orriak hau dio:</translation> -<translation id="153384715582417236">Hori da dena, oraingoz!</translation> <translation id="1536390784834419204">Itzuli orria</translation> <translation id="1539840569003678498">Txostenaren bidaltze-data:</translation> <translation id="1549470594296187301">JavaScript aktibatu behar da eginbide hau erabiltzeko.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Arakatzaileak kudeatzailea du</translation> <translation id="1746113442205726301">Irudia Y ardatzaren arabera aldatuta</translation> <translation id="1746531169546376413">0 gradu</translation> -<translation id="17513872634828108">Fitxa irekiak</translation> <translation id="1752021286346845558">8. postontzia</translation> <translation id="1753068535428855445">Zitetarako eta gauza pertsonaletarako zerbitzuak</translation> <translation id="1753706481035618306">Orri-zenbakia</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Exekutatu Windows-en sare-diagnostikoak<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Lortu Chromium-eko ezkutuko moduari buruzko informazio gehiago<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Ireki dituzun fitxak agertuko dira hemen</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />: sakatu tabuladorea eta, ondoren, "Sartu" Google-ko kontuko informazioa, pribatutasuna eta segurtasuna kudeatzeko</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />: hainbat ekintza dituzu eskuragarri. Sakatu tabuladorea batetik bestera joateko.</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Taldekatu</translation> <translation id="2576880857912732701">Segurtasun-ezarpenak kudeatzeko botoia, sakatu "Sartu" tekla Chrome-ren ezarpenetara joan, eta Arakatze segurua eta beste gauza batzuk kudeatzeko</translation> <translation id="2586657967955657006">Arbela</translation> -<translation id="2587730715158995865">Iturburua: <ph name="ARTICLE_PUBLISHER" />. Irakurri hau eta beste <ph name="OTHER_ARTICLE_COUNT" /> artikulu.</translation> <translation id="2587841377698384444">Direktorioko APIaren IDa:</translation> <translation id="2594318783181750337">Web-ikuspegi bizkorra:</translation> <translation id="2595719060046994702">Ez dago gailua eta kontua kudeatzen dituen enpresa edo erakunderik.</translation> @@ -1658,7 +1653,6 @@ <translation id="5045550434625856497">Pasahitz okerra</translation> <translation id="5051305769747448211">Zuzeneko komedia</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Fitxategia Nearby Share bidez bidaltzeko, egin tokia (<ph name="DISK_SPACE_SIZE" />) gailuan}other{Fitxategiak Nearby Share bidez bidaltzeko, egin tokia (<ph name="DISK_SPACE_SIZE" />) gailuan}}</translation> -<translation id="5056549851600133418">Zuretzako artikuluak</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> darabilten webguneetan Windows Hello-rekin egiaztatzea aukeratu duzu. Baliteke hornitzaile horrek zure ordainketa-metodoari buruzko informazioa gorde izatea, baina <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> esan nahi al zenuen?</translation> <translation id="5066056036849835175">Inprimaketa-historia</translation> @@ -1853,7 +1847,6 @@ <translation id="5541086400771735334">7. postontzia</translation> <translation id="5541546772353173584">Gehitu helbide elektronikoa</translation> <translation id="5543722831081909240">180 gradu</translation> -<translation id="5545756402275714221">Zuretzako artikuluak</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Sarean argitaratu diren zerrendetan zure pasahitzak dauden egiaztatzen du noizean behin Chrome-k. Hori egiteko, pasahitzak eta erabiltzaile-izenak enkriptatu egiten ditu, inork ezin ditzan irakurri, Google barne.</translation> <translation id="5556459405103347317">Kargatu berriro</translation> @@ -2133,14 +2126,12 @@ <translation id="6266934640124581640">Anil argia</translation> <translation id="6272088941196661550">Berrekin bilaketa-ibilbideari Chrome-ko historian dauden erlazionatutako jarduerak ikusteko</translation> <translation id="6272383483618007430">Google-ren eguneratzea</translation> -<translation id="6276112860590028508">Hemen agertuko dira irakurketa-zerrendako orriak</translation> <translation id="627746635834430766">Hurrengoan bizkorrago ordaintzeko, gorde txartela eta fakturazio-helbidea Google-ko kontuan.</translation> <translation id="6279183038361895380">Kurtsorea ikusteko, sakatu |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Ezin da entregatu helbide horretan. Hautatu beste helbide bat.</translation> <translation id="6284292079994426700">66,04 × 96,52 cm (26 × 38 in)</translation> <translation id="6285507000506177184">Chrome-ren bidez egindako deskargak kudeatzeko botoia: sakatu "Sartu" tekla Chrome-ren bidez deskargatu dituzun fitxategiak kudeatzeko</translation> <translation id="6289939620939689042">Orriaren kolorea</translation> -<translation id="6290238015253830360">Iradokitako artikuluak agertuko zaizkizu hemen</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Gordetzen…</translation> @@ -2740,7 +2731,6 @@ <translation id="7696089921647603491">Rock klasikoa eta abesti zaharrak</translation> <translation id="769721561045429135">Une honetan, gailu honetan soilik erabil daitezkeen txartelak dituzu. Txartelak berrikusteko, sakatu Egin aurrera.</translation> <translation id="7698864304447945242">Errealitate areagoturako Google Play Services eguneratu nahi duzu?</translation> -<translation id="7699293099605015246">Une honetan, artikuluak ez daude erabilgarri</translation> <translation id="7701040980221191251">Bat ere ez</translation> <translation id="7701544340847569275">Eguneratzea erroreekin amaitu da</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Joan <ph name="SITE" /> webgunera (ez da segurua)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index b8dc40c..dc4b8c9 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">گذرواژهتان را در سایتی که توسط سازمانتان مدیریت نمیشود وارد کردید. برای محافظت از حسابتان، از گذرواژهتان در سایر برنامهها و سایتها مجدداً استفاده نکنید.</translation> <translation id="1257553931232494454">سطوح بزرگنمایی</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />؛ برای مدیریت تنظیمات Chrome، کلید «جهش» و سپس «ورود» را فشار دهید</translation> -<translation id="1263231323834454256">فهرست خواندن</translation> <translation id="1264309058268477500">جایگزین</translation> <translation id="1264974993859112054">ورزش</translation> <translation id="1266469291454105242">باز کردن قفل دستگاه</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">سینی ۸</translation> <translation id="1530707389502320859">سایتی که لحظاتی پیش تلاش کردید از آن بازدید کنید، جعلی بهنظر میرسد. گاهیاوقات حملهکنندگان با ایجاد تغییرات کوچک در نشانی وب که بهآسانی قابلدیدن نیست، سایتها را جعل میکنند.</translation> <translation id="1532118530259321453">این صفحه میگوید</translation> -<translation id="153384715582417236">درحالحاضر مورد دیگری وجود ندارد</translation> <translation id="1536390784834419204">ترجمه صفحه</translation> <translation id="1539840569003678498">گزارش ارسال شد:</translation> <translation id="1549470594296187301">برای استفاده از این قابلیت، جاوا اسکریپت باید فعال باشد.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">مرورگرتان تحت مدیریت است</translation> <translation id="1746113442205726301">تغییر جهت تصویر حول محور Y</translation> <translation id="1746531169546376413">۰ درجه</translation> -<translation id="17513872634828108">بازکردن برگهها</translation> <translation id="1752021286346845558">صندوق پست ۸</translation> <translation id="1753068535428855445">دوستیابی و شخصیت</translation> <translation id="1753706481035618306">شماره صفحه</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows Network Diagnostics را اجرا کنید<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />درباره «حالت ناشناس» در Chromium بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">برگههای بازتان در اینجا نشان داده میشوند</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />؛ برای مدیریت اطلاعات، حریم خصوصی، و امنیت در «حساب Google»، کلید «جهش» و سپس «ورود» را فشار دهید</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />، چند کنش دردسترس است، برای جابهجایی بین آنها، کلید Tab را فشار دهید</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">گروه</translation> <translation id="2576880857912732701">دکمه «مدیریت تنظیمات امنیتی»؛ برای مدیریت «مرور ایمن» و موارد دیگر در تنظیمات Chrome، کلید «ورود» را فشار دهید</translation> <translation id="2586657967955657006">بریدهدان</translation> -<translation id="2587730715158995865">از <ph name="ARTICLE_PUBLISHER" />. این داستان و <ph name="OTHER_ARTICLE_COUNT" /> داستان دیگر را بخوانید.</translation> <translation id="2587841377698384444">شناسه Directory API:</translation> <translation id="2594318783181750337">نمای وب سریع:</translation> <translation id="2595719060046994702">این دستگاه و حساب توسط شرکت یا سازمان دیگری مدیریت نمیشود.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">گذرواژه نادرست</translation> <translation id="5051305769747448211">کمدی زنده</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{برای ارسال این فایل ازطریق «همرسانی با اطراف»، در دستگاهتان فضا (<ph name="DISK_SPACE_SIZE" />) آزاد کنید}one{برای ارسال این فایل ازطریق «همرسانی با اطراف»، در دستگاهتان فضا (<ph name="DISK_SPACE_SIZE" />) آزاد کنید}other{برای ارسال این فایلها ازطریق «همرسانی با اطراف»، در دستگاهتان فضا (<ph name="DISK_SPACE_SIZE" />) آزاد کنید}}</translation> -<translation id="5056549851600133418">مقالاتی برای شما</translation> <translation id="5060483733937416656">قبلاً انتخاب کردهاید در وبسایتهایی که از <ph name="PROVIDER_ORIGIN" /> استفاده میکنند درستیسنجی با Windows Hello انجام شود. این ارائهدهنده ممکن است اطلاعات روش پرداختتان را ذخیره کرده باشد، که میتوانید <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">منظورتان <ph name="LOOKALIKE_DOMAIN" /> بود؟</translation> <translation id="5066056036849835175">سابقه چاپ</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">رد کردن</translation> <translation id="5239623327352565343">مکان مجاز است</translation> <translation id="5242889659037569123">لوازم سفر و چمدان</translation> +<translation id="5244732203286792411">درحال بار کردن… + ممکن است یک دقیقه طول بکشد.</translation> <translation id="5250209940322997802">«به شبکه متصل شوید»</translation> <translation id="52517543715119994">با ویژگیهای Chrome آشنا شوید</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">صندوق پست ۷</translation> <translation id="5541546772353173584">افزودن ایمیل</translation> <translation id="5543722831081909240">۱۸۰ درجه</translation> -<translation id="5545756402275714221">مقالههایی برای شما</translation> <translation id="5551890439174915351">۲۰۰ × ۱۰۰ میلیمتر</translation> <translation id="5552137475244467770">Chrome بهطور دورهای گذرواژههایتان را با فهرستهایی که بهصورت آنلاین منتشر میشود مقایسه میکند. هنگام انجام این کار، نامهای کاربری و گذرواژههای شما رمزگذاری میشود تا توسط اشخاص دیگر، ازجمله Google خوانده نشود.</translation> <translation id="5556459405103347317">بار کردن مجدد</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">سبز دودی روشن</translation> <translation id="6272088941196661550">سفر جستجو را ازسر بگیرید تا فعالیتهای مرتبط را در سابقه Chrome ببینید</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">صفحههای مربوط به فهرست خواندنتان اینجا نشان داده میشوند</translation> <translation id="627746635834430766">برای اینکه دفعات بعد پرداخت سریعتری داشته باشید، اطلاعات کارت و نشانی صورتحسابتان را در حساب Google خود ذخیره کنید.</translation> <translation id="6279183038361895380">برای نمایش نشانگر |<ph name="ACCELERATOR" />| را فشار دهید</translation> <translation id="6280223929691119688">تحویل به این نشانی ممکن نیست. نشانی دیگری را انتخاب کنید.</translation> <translation id="6284292079994426700">۳۸ × ۲۶ اینچ</translation> <translation id="6285507000506177184">دکمه «مدیریت بارگیریها در Chrome»؛ برای مدیریت فایلهایی که در Chrome بارگیری کردهاید، کلید «ورود» را فشار دهید</translation> <translation id="6289939620939689042">رنگ صفحه</translation> -<translation id="6290238015253830360">مقالههای پیشنهادی شما در اینجا نشان داده میشوند</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">در حال ذخیره کردن...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">راک کلاسیک و قدیمی</translation> <translation id="769721561045429135">درحالحاضر، کارتهایی دارید که فقط در این دستگاه قابل استفادهاند. برای ادامه مرور کارتها، کلیک کنید.</translation> <translation id="7698864304447945242">«خدمات Google Play ویژه واقعیت افزوده» بهروزرسانی شود؟</translation> -<translation id="7699293099605015246">مقالهها درحالحاضر دردسترس نیستند</translation> <translation id="7701040980221191251">هیچکدام</translation> <translation id="7701544340847569275">بهروزرسانی با خطا بهپایان رسید</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ادامه به <ph name="SITE" /> (غیرایمن)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb index 4ebcabf..744a2a25 100644 --- a/components/strings/components_strings_fi.xtb +++ b/components/strings/components_strings_fi.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Kirjoitit salasanan sivustolle, joka ei ole organisaatiosi hallinnoima. Älä käytä samaa salasanaa muissa sovelluksissa tai muilla sivustoilla tilisi turvallisuuden vuoksi.</translation> <translation id="1257553931232494454">zoomaustasot</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, muuta Chromen asetuksia painamalla sarkainta ja sitten Enter</translation> -<translation id="1263231323834454256">Lukulista</translation> <translation id="1264309058268477500">Vaihtoehtoinen</translation> <translation id="1264974993859112054">Urheilu</translation> <translation id="1266469291454105242">Laitteen lukituksen avaustapa</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Lokero 8</translation> <translation id="1530707389502320859">Sivusto, jolle yritit juuri siirtyä, ei vaikuta aidolta. Hyökkääjät jäljittelevät joskus sivustoja tekemällä URL-osoitteeseen pieniä muutoksia, joita on vaikea havaita.</translation> <translation id="1532118530259321453">Viesti tältä sivulta</translation> -<translation id="153384715582417236">Siinä kaikki toistaiseksi</translation> <translation id="1536390784834419204">Käännä sivu</translation> <translation id="1539840569003678498">Ilmoitus lähetetty:</translation> <translation id="1549470594296187301">Tämän ominaisuuden käyttö edellyttää JavaScriptiä.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Tämä on ylläpidetty selain</translation> <translation id="1746113442205726301">Kuvan Y vaihto</translation> <translation id="1746531169546376413">0 astetta</translation> -<translation id="17513872634828108">Avoimet välilehdet</translation> <translation id="1752021286346845558">Postilaatikko 8</translation> <translation id="1753068535428855445">Treffipalvelut ja henkilökohtaista-ilmoitukset</translation> <translation id="1753706481035618306">Sivunumero</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Kokeile Windowsin verkon diagnostiikkaa<ph name="END_LINK" /></translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Lue lisää Chromiumin incognito-tilasta<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0 (1 030 mm x 1 456 mm)</translation> -<translation id="1787142507584202372">Avoimet välilehdet näkyvät tässä.</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ylläpidä tietojasi, yksityisyyttäsi ja tietoturvaasi Google-tilillä painamalla sarkainta ja sitten Enter</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, useita toimintoja saatavilla, selaa niitä painamalla sarkainta</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Ryhmä</translation> <translation id="2576880857912732701">Muuta tietoturva-asetuksia ‑painike, paina Enter, niin voit ylläpitää selaussuojaa ja muita ominaisuuksia Chromen asetuksista</translation> <translation id="2586657967955657006">Leikepöytä</translation> -<translation id="2587730715158995865">Julkaisijalta <ph name="ARTICLE_PUBLISHER" />. Lue tämä ja <ph name="OTHER_ARTICLE_COUNT" /> muuta tarinaa.</translation> <translation id="2587841377698384444">Hakemistosovellusliittymän tunnus:</translation> <translation id="2594318783181750337">Nopea verkkonäkymä:</translation> <translation id="2595719060046994702">Yritys tai muu organisaatio ei ylläpidä tätä laitetta tai tiliä.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Väärä salasana</translation> <translation id="5051305769747448211">Live-komedia</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Jos haluat lähettää tiedoston käyttämällä lähijakamista, vapauta tilaa (<ph name="DISK_SPACE_SIZE" />) laitteeltasi}other{Jos haluat lähettää tiedostot käyttämällä lähijakamista, vapauta tilaa (<ph name="DISK_SPACE_SIZE" />) laitteeltasi}}</translation> -<translation id="5056549851600133418">Sinulle valitut artikkelit</translation> <translation id="5060483733937416656">Valitsit vahvistuksen Windows Hellolla verkkosivustoilla, joilla on käytössä <ph name="PROVIDER_ORIGIN" />. Tämä palveluntarjoaja on saattanut tallentaa maksutapaasi koskevia tietoja, joille voit <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Tarkoititko: <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Tulostushistoria</translation> @@ -1743,6 +1737,8 @@ <translation id="5234764350956374838">Hylkää</translation> <translation id="5239623327352565343">Sijainti sallittu</translation> <translation id="5242889659037569123">Matkalaukut ja matkustustarvikkeet</translation> +<translation id="5244732203286792411">Ladataan… + Tässä voi mennä hetki.</translation> <translation id="5250209940322997802">Yhdistä verkkoon</translation> <translation id="52517543715119994">Lue lisää Chromen ominaisuuksista</translation> <translation id="5251803541071282808">Pilvi</translation> @@ -1860,7 +1856,6 @@ <translation id="5541086400771735334">Postilaatikko 7</translation> <translation id="5541546772353173584">Lisää sähköposti</translation> <translation id="5543722831081909240">180 astetta</translation> -<translation id="5545756402275714221">Sinulle valitut artikkelit</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome vertaa salasanojasi säännöllisesti listoihin salasanoista, jotka on julkaistu verkossa. Tätä varten salasanat ja käyttäjänimet salataan, joten kukaan (myöskään Google) ei voi lukea niitä.</translation> <translation id="5556459405103347317">Lataa uudelleen</translation> @@ -2142,14 +2137,12 @@ <translation id="6266934640124581640">Vaaleanturkoosi</translation> <translation id="6272088941196661550">Jatka toimintoa, niin näet oleelliset tapahtumat Chrome-historiassasi</translation> <translation id="6272383483618007430">Google-päivitys</translation> -<translation id="6276112860590028508">Lukulistasi sivuja tulee näkyviin tänne.</translation> <translation id="627746635834430766">Jos haluat maksaa nopeammin ensi kerralla, tallenna kortti ja laskutusosoite Google-tilillesi.</translation> <translation id="6279183038361895380">Näytä kursori painamalla |<ph name="ACCELERATOR" />|.</translation> <translation id="6280223929691119688">Toimitus ei onnistu tähän osoitteeseen. Valitse eri osoite.</translation> <translation id="6284292079994426700">26 x 38 tuumaa</translation> <translation id="6285507000506177184">Ylläpidä latauksia Chromessa ‑painike, ylläpidä Chromessa lataamiasi tiedostoja painamalla Enter</translation> <translation id="6289939620939689042">Sivun väri</translation> -<translation id="6290238015253830360">Suositellut artikkelit näkyvät tässä.</translation> <translation id="6293309776179964942">JIS B5 (182 mm x 257 mm)</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Tallennetaan…</translation> @@ -2749,7 +2742,6 @@ <translation id="7696089921647603491">Klassinen rock ja ikivihreät suosikit</translation> <translation id="769721561045429135">Joitakin korttejasi voi juuri nyt käyttää vain tällä laitteella. Katso kortit valitsemalla Jatka.</translation> <translation id="7698864304447945242">Päivitetäänkö Google Play Services for AR?</translation> -<translation id="7699293099605015246">Artikkelit eivät juuri nyt ole saatavilla.</translation> <translation id="7701040980221191251">Ei mitään</translation> <translation id="7701544340847569275">Päivitys on valmis, mutta se sisältää virheitä</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Siirry sivustoon <ph name="SITE" /> (tämä ei ole turvallista)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb index fa9db46..181d186 100644 --- a/components/strings/components_strings_fil.xtb +++ b/components/strings/components_strings_fil.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Inilagay mo ang iyong password sa site na hindi pinamamahalaan ng iyong organisasyon. Para protektahan ang account mo, huwag gamiting muli ang iyong password sa iba pang app at site.</translation> <translation id="1257553931232494454">mga antas ng pag-zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Pindutin ang Tab at pagkatapos ay ang Enter para pamahalaan ang iyong mga setting ng Chrome</translation> -<translation id="1263231323834454256">Listahan ng babasahin</translation> <translation id="1264309058268477500">Alternatibo</translation> <translation id="1264974993859112054">Pampalakasan</translation> <translation id="1266469291454105242">Pag-unlock ng device</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tray 8</translation> <translation id="1530707389502320859">Mukhang peke ang site na sinubukan mong bisitahin. Kung minsan, ginagaya ng mga nang-aatake ang mga site sa pamamagitan ng paggawa ng mga pagbabago sa URL na maliit at mahirap makita.</translation> <translation id="1532118530259321453">Isinasaad ng page na ito na</translation> -<translation id="153384715582417236">'Yan na muna sa ngayon</translation> <translation id="1536390784834419204">Isalin ang page</translation> <translation id="1539840569003678498">Naipadala ang ulat:</translation> <translation id="1549470594296187301">Dapat naka-enable ang JavaScript upang magamit ang feature na ito.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Pinapamahalaan ang iyong browser</translation> <translation id="1746113442205726301">Pag-shift ng larawan Y</translation> <translation id="1746531169546376413">0 degrees</translation> -<translation id="17513872634828108">Mga bukas na tab</translation> <translation id="1752021286346845558">Mailbox 8</translation> <translation id="1753068535428855445">Pakikipag-date at mga personal na bagay</translation> <translation id="1753706481035618306">Numero ng page</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Subukang patakbuhin ang Windows Network Diagnostics<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Matuto pa tungkol sa Incognito sa Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Lalabas dito ang iyong mga bukas na tab</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pindutin ang Tab at pagkatapos ay ang Enter para pamahalaan ang iyong impormasyon, privacy, at seguridad sa iyong Google Account</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, maraming available na pagkilos, pindutin ang Tab para makita ang mga ito</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Pangkat</translation> <translation id="2576880857912732701">Button na Pamahalaan ang mga setting ng seguridad, pindutin ang Enter para pamahalaan ang iyong Ligtas na Pag-browse at higit pa sa mga setting ng Chrome</translation> <translation id="2586657967955657006">Clipboard</translation> -<translation id="2587730715158995865">Mula sa <ph name="ARTICLE_PUBLISHER" />. Basahin ito at ang <ph name="OTHER_ARTICLE_COUNT" /> (na) iba pang kwento.</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">Fast web view:</translation> <translation id="2595719060046994702">Ang device at account na ito ay hindi pinapamahalaan ng kumpanya o iba pang organisasyon.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Hindi wastong password</translation> <translation id="5051305769747448211">Live na komedya</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para ipadala ang file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}one{Para ipadala ang mga file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}other{Para ipadala ang mga file na ito gamit ang Nearby Share, magbakante ng espasyo (<ph name="DISK_SPACE_SIZE" />) sa iyong device}}</translation> -<translation id="5056549851600133418">Mga artikulo para sa iyo</translation> <translation id="5060483733937416656">Pinili mong mag-verify gamit ang Windows Hello sa mga website na gumagamit ng <ph name="PROVIDER_ORIGIN" />. Ang provider na ito ay posibleng nag-store ng impormasyon tungkol sa iyong paraan ng pagbabayad, na puwede mong <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Ang ibig mo bang sabihin ay <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">History ng pag-print</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Huwag pansinin</translation> <translation id="5239623327352565343">Pinapayagan ang lokasyon</translation> <translation id="5242889659037569123">Mga accessory sa bagahe at pagbiyahe</translation> +<translation id="5244732203286792411">Naglo-load... + Puwede itong abutin nang isang minuto.</translation> <translation id="5250209940322997802">"Kumonekta sa network"</translation> <translation id="52517543715119994">Alamin ang tungkol sa mga feature ng Chrome</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Mailbox 7</translation> <translation id="5541546772353173584">Magdagdag ng Email</translation> <translation id="5543722831081909240">180 degrees</translation> -<translation id="5545756402275714221">Mga Artikulo para sa Iyo</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Pana-panahong sinusuri ng Chrome ang iyong mga password sa mga listahang na-publish online. Kapag ginagawa ito, naka-encrypt ang iyong mga password at username, para hindi mabasa ng sinuman ang mga ito, kabilang ang Google.</translation> <translation id="5556459405103347317">I-reload</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Light Teal</translation> <translation id="6272088941196661550">Ipagpatuloy ang iyong journey para makakita ng nauugnay na aktibidad sa history mo sa Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Lalabas dito ang mga page mula sa iyong listahan ng babasahin</translation> <translation id="627746635834430766">Para mas mabilis na makapagbayad sa susunod, i-save ang iyong card at billing address sa Google Account mo.</translation> <translation id="6279183038361895380">Pindutin ang |<ph name="ACCELERATOR" />| upang ipakita ang iyong cursor</translation> <translation id="6280223929691119688">Hindi maaaring maghatid sa address na ito. Pumili ng ibang address.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Button na Pamahalaan ang mga download sa Chrome, pindutin ang Enter para pamahalaan ang mga file na na-download mo sa Chrome</translation> <translation id="6289939620939689042">Kulay ng Page</translation> -<translation id="6290238015253830360">Lalabas dito ang mga iminungkahi mong artikulo</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Sine-save...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Classic rock at oldies</translation> <translation id="769721561045429135">Sa ngayon, may mga card kang magagamit lang sa device na ito. I-click ang Magpatuloy para suriin ang mga card.</translation> <translation id="7698864304447945242">I-update ang Google Play Services para sa AR?</translation> -<translation id="7699293099605015246">Hindi available sa ngayon ang mga artikulo</translation> <translation id="7701040980221191251">Wala</translation> <translation id="7701544340847569275">Natapos ang update nang may mga error</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Magpatuloy sa <ph name="SITE" /> (hindi ligtas)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fr-CA.xtb b/components/strings/components_strings_fr-CA.xtb index 0828d3e..f918c4d 100644 --- a/components/strings/components_strings_fr-CA.xtb +++ b/components/strings/components_strings_fr-CA.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Vous avez entré votre mot de passe sur un site qui n'est pas géré par votre organisation. Pour protéger votre compte, ne réutilisez pas votre mot de passe dans d'autres applications ni sur d'autres sites.</translation> <translation id="1257553931232494454">Niveaux de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur la touche Tabulation, puis sur la touche Entrée pour gérer les paramètres de Chrome</translation> -<translation id="1263231323834454256">Liste de lecture</translation> <translation id="1264309058268477500">Autre version</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1266469291454105242">Déverrouillage de l'appareil</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bac 8</translation> <translation id="1530707389502320859">Le site que vous venez d'essayer de visiter semble être un faux. Les pirates tentent parfois d'imiter des sites Web en modifiant légèrement l'URL utilisée.</translation> <translation id="1532118530259321453">Cette page indique</translation> -<translation id="153384715582417236">C'est tout pour le moment</translation> <translation id="1536390784834419204">Traduire la page</translation> <translation id="1539840569003678498">Envoi du rapport :</translation> <translation id="1549470594296187301">Pour utiliser cette fonctionnalité, vous devez activer JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Votre navigateur est géré</translation> <translation id="1746113442205726301">Décalage Y de l'image</translation> <translation id="1746531169546376413">0 degré</translation> -<translation id="17513872634828108">Onglets ouverts</translation> <translation id="1752021286346845558">Boîte aux lettres 8</translation> <translation id="1753068535428855445">Rencontres et services personnels</translation> <translation id="1753706481035618306">Numéro de page</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Essayer d'exécuter Windows Network Diagnostics<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />En savoir plus sur la navigation privée dans Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Vos onglets ouverts s'affichent ici</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur Tabulation, puis sur Entrée pour gérer vos renseignements, la confidentialité et la sécurité de votre compte Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, plusieurs actions sont possibles, appuyez sur la touche Tabulation pour les parcourir</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Groupe</translation> <translation id="2576880857912732701">Bouton Gérer la sécurité, appuyez sur la touche Entrée pour gérer votre navigation sécurisée et plus dans les paramètres de Chrome</translation> <translation id="2586657967955657006">Presse-papiers</translation> -<translation id="2587730715158995865">Publié par <ph name="ARTICLE_PUBLISHER" />. Lisez cet article et <ph name="OTHER_ARTICLE_COUNT" /> autres.</translation> <translation id="2587841377698384444">Identifiant d'API de l'annuaire :</translation> <translation id="2594318783181750337">Affichage Web rapide :</translation> <translation id="2595719060046994702">Cet appareil et ce compte ne sont pas gérés par une entreprise ou une autre organisation.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Mot de passe incorrect</translation> <translation id="5051305769747448211">Spectacles d'humour</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Pour envoyer ce fichier au moyen du partage à proximité, libérez de l'espace de stockage (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}one{Pour envoyer ce fichier au moyen du partage à proximité, libérez de l'espace de stockage (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}other{Pour envoyer ces fichiers au moyen du partage à proximité, libérez de l'espace de stockage (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}}</translation> -<translation id="5056549851600133418">Articles pour vous</translation> <translation id="5060483733937416656">Vous avez choisi de valider avec Windows Hello sur des sites Web qui utilisent <ph name="PROVIDER_ORIGIN" />. Ce fournisseur peut avoir stocké de l'information sur votre mode de paiement, dont vous pouvez <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Vouliez-vous dire <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historique d'impression</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Boîte aux lettres 7</translation> <translation id="5541546772353173584">Ajouter une adresse de courriel</translation> <translation id="5543722831081909240">180 degrés</translation> -<translation id="5545756402275714221">Articles pour vous</translation> <translation id="5551890439174915351">100 mm x 200 mm</translation> <translation id="5552137475244467770">Chrome vérifie régulièrement que vos mots de passe ne figurent pas dans les listes qui ont été publiées en ligne. Lors de cette opération, vos mots de passe et vos noms d'utilisateur sont chiffrés afin que personne ne puisse les consulter, y compris Google.</translation> <translation id="5556459405103347317">Actualiser</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">Bleu sarcelle clair</translation> <translation id="6272088941196661550">Reprenez votre exploration pour consulter l'activité pertinente dans votre historique de Chrome</translation> <translation id="6272383483618007430">Mise à jour Google</translation> -<translation id="6276112860590028508">Les pages de votre liste de lecture apparaissent ici</translation> <translation id="627746635834430766">Pour accélérer le paiement la prochaine fois, enregistrez votre carte et votre adresse de facturation dans votre compte Google.</translation> <translation id="6279183038361895380">Appuyez sur |<ph name="ACCELERATOR" />| pour afficher votre curseur</translation> <translation id="6280223929691119688">Impossible d'effectuer une livraison à cette adresse. Sélectionnez une autre adresse.</translation> <translation id="6284292079994426700">26 po x 38 po</translation> <translation id="6285507000506177184">Bouton Gérer les téléchargements dans Chrome, appuyez sur la touche Entrée pour gérer les fichiers que vous avez téléchargés dans Chrome</translation> <translation id="6289939620939689042">Couleur de la page</translation> -<translation id="6290238015253830360">Les articles que vous avez suggérés s'afficheront ici</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Code CVC :</translation> <translation id="6295855836753816081">Enregistrement en cours...</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Anciens classiques et classiques du rock</translation> <translation id="769721561045429135">Pour le moment, vous avez des cartes qui peuvent être utilisées uniquement sur cet appareil. Cliquez sur Continuer pour consulter les détails de ces cartes.</translation> <translation id="7698864304447945242">Mettre à jour les services Google Play pour la RA?</translation> -<translation id="7699293099605015246">Les articles ne sont pas disponibles pour le moment</translation> <translation id="7701040980221191251">Aucun</translation> <translation id="7701544340847569275">Mise à jour terminée avec des erreurs</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuer vers <ph name="SITE" /> (non recommandé)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index 7cf6070..c5f5ffc 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Vous avez saisi votre mot de passe sur un site qui n'est pas géré par votre organisation. Pour protéger votre compte, ne réutilisez pas ce mot de passe dans d'autres applications ni sur d'autres sites.</translation> <translation id="1257553931232494454">niveaux de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur Tabulation, puis sur Entrée pour gérer vos paramètres Chrome</translation> -<translation id="1263231323834454256">Liste de lecture</translation> <translation id="1264309058268477500">Autre</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1266469291454105242">Déverrouillage de l'appareil</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bac 8</translation> <translation id="1530707389502320859">Le site auquel vous tentez d'accéder semble faux. Les pirates tentent parfois d'imiter des sites Web en modifiant légèrement l'URL utilisée.</translation> <translation id="1532118530259321453">Cette page indique</translation> -<translation id="153384715582417236">C'est tout !</translation> <translation id="1536390784834419204">Traduire la page</translation> <translation id="1539840569003678498">Rapport envoyé :</translation> <translation id="1549470594296187301">Vous devez activer JavaScript pour utiliser cette fonctionnalité.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Votre navigateur est géré</translation> <translation id="1746113442205726301">Décalage Y de l'image</translation> <translation id="1746531169546376413">0 degré</translation> -<translation id="17513872634828108">Onglets ouverts</translation> <translation id="1752021286346845558">Boîte aux lettres 8</translation> <translation id="1753068535428855445">Rencontres</translation> <translation id="1753706481035618306">Numéro de page</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Essayez d'exécuter les diagnostics réseau de Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />En savoir plus sur la navigation privée dans Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Les onglets ouverts s'affichent ici</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, appuyez sur Tabulation, puis sur Entrée pour gérer vos infos, votre vie privée et votre sécurité dans votre compte Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, plusieurs actions disponibles, appuyez sur Tabulation pour passer de l'une à l'autre</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Groupe</translation> <translation id="2576880857912732701">Bouton "Gérer les paramètres de sécurité", puis Entrée pour gérer la navigation sécurisée, etc., dans les paramètres Chrome</translation> <translation id="2586657967955657006">Presse-papiers</translation> -<translation id="2587730715158995865">Proposé par <ph name="ARTICLE_PUBLISHER" />. Lisez cet article et <ph name="OTHER_ARTICLE_COUNT" /> autres.</translation> <translation id="2587841377698384444">ID de l'API d'annuaire : </translation> <translation id="2594318783181750337">Affichage Web rapide :</translation> <translation id="2595719060046994702">Cet appareil et ce compte ne sont pas gérés par une entreprise ni par une autre organisation.</translation> @@ -1662,7 +1657,6 @@ <translation id="5045550434625856497">Mot de passe incorrect</translation> <translation id="5051305769747448211">Spectacles comiques</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Pour partager ce fichier à proximité, libérez de l'espace (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}one{Pour partager ce fichier à proximité, libérez de l'espace (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}other{Pour partager ces fichiers à proximité, libérez de l'espace (<ph name="DISK_SPACE_SIZE" />) sur votre appareil}}</translation> -<translation id="5056549851600133418">Articles pour vous</translation> <translation id="5060483733937416656">Vous avez choisi la validation avec Windows Hello sur les sites Web utilisant <ph name="PROVIDER_ORIGIN" />. Il est possible que ce fournisseur ait stocké des informations sur votre mode de paiement. Vous pouvez <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Vous vouliez dire <ph name="LOOKALIKE_DOMAIN" /> ?</translation> <translation id="5066056036849835175">Historique d'impression</translation> @@ -1740,6 +1734,8 @@ <translation id="5234764350956374838">Ignorer</translation> <translation id="5239623327352565343">Position autorisée</translation> <translation id="5242889659037569123">Bagages et accessoires de voyage</translation> +<translation id="5244732203286792411">Chargement… + Cela peut prendre une minute.</translation> <translation id="5250209940322997802">"Se connecter au réseau"</translation> <translation id="52517543715119994">En savoir plus sur les fonctionnalités de Chrome</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1857,7 +1853,6 @@ <translation id="5541086400771735334">Boîte aux lettres 7</translation> <translation id="5541546772353173584">Ajouter une adresse e-mail</translation> <translation id="5543722831081909240">180 degrés</translation> -<translation id="5545756402275714221">Articles pour vous</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome vérifie régulièrement que vos mots de passe ne figurent pas dans les listes qui ont été publiées en ligne. Lors de cette opération, vos mots de passe et vos noms d'utilisateur sont chiffrés afin que personne ne puisse les consulter, y compris Google.</translation> <translation id="5556459405103347317">Actualiser</translation> @@ -2139,14 +2134,12 @@ <translation id="6266934640124581640">Turquoise clair</translation> <translation id="6272088941196661550">Reprenez votre parcours pour voir les activités pertinentes dans votre historique Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Les pages de votre liste de lecture s'affichent ici</translation> <translation id="627746635834430766">Pour régler vos achats plus rapidement la prochaine fois, enregistrez votre carte et votre adresse de facturation dans votre compte Google.</translation> <translation id="6279183038361895380">Appuyez sur |<ph name="ACCELERATOR" />| pour afficher le curseur.</translation> <translation id="6280223929691119688">Impossible de livrer à cette adresse. Sélectionnez-en une autre.</translation> <translation id="6284292079994426700">26 x 38 pouces</translation> <translation id="6285507000506177184">Bouton "Gérer les téléchargements dans Chrome", puis Entrée pour gérer les fichiers que vous avez téléchargés dans Chrome</translation> <translation id="6289939620939689042">Couleur de la page</translation> -<translation id="6290238015253830360">Vos suggestions d'articles s'affichent ici</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Cryptogramme :</translation> <translation id="6295855836753816081">Enregistrement…</translation> @@ -2747,7 +2740,6 @@ <translation id="7696089921647603491">Vieux classiques du rock</translation> <translation id="769721561045429135">Vous disposez actuellement de plusieurs cartes qui ne peuvent être utilisées que sur cet appareil. Cliquez sur "Continuer" pour examiner les cartes.</translation> <translation id="7698864304447945242">Mettre à jour les services Google Play pour la RA ?</translation> -<translation id="7699293099605015246">Articles non disponibles pour le moment</translation> <translation id="7701040980221191251">Rien</translation> <translation id="7701544340847569275">Mise à jour terminée (avec erreurs)</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Continuer vers le site <ph name="SITE" /> (dangereux)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_gl.xtb b/components/strings/components_strings_gl.xtb index a14c86d..aad570a 100644 --- a/components/strings/components_strings_gl.xtb +++ b/components/strings/components_strings_gl.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Introduciches o teu contrasinal nun sitio que non está xestionado pola túa organización. Para protexer a túa conta, non reutilices o contrasinal noutras aplicacións ou sitios.</translation> <translation id="1257553931232494454">niveis de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Para xestionar a configuración de Chrome, preme Tabulador e, a continuación, Introducir</translation> -<translation id="1263231323834454256">Lista de lectura</translation> <translation id="1264309058268477500">Alternar</translation> <translation id="1264974993859112054">Deportes</translation> <translation id="1266469291454105242">Desbloqueo do dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bandexa 8</translation> <translation id="1530707389502320859">O sitio que acabas de tentar visitar parece falso. Ás veces, os atacantes crean copias de sitios introducindo nos URL cambios pequenos e difíciles de ver.</translation> <translation id="1532118530259321453">Esta páxina di</translation> -<translation id="153384715582417236">Isto é todo polo momento</translation> <translation id="1536390784834419204">Traducir páxina</translation> <translation id="1539840569003678498">Envío do informe:</translation> <translation id="1549470594296187301">JavaScript debe estar activado para usar esta función.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">O teu navegador está xestionado</translation> <translation id="1746113442205726301">Desprazamento da imaxe no eixe Y</translation> <translation id="1746531169546376413">0 graos</translation> -<translation id="17513872634828108">Pestanas abertas</translation> <translation id="1752021286346845558">Caixa de correo 8</translation> <translation id="1753068535428855445">Citas e anuncios persoais</translation> <translation id="1753706481035618306">Número de páxina</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Proba a executar o diagnóstico de rede de Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Máis información sobre o modo de incógnito de Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">As pestanas abertas aparecerán aquí</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Preme Tabulador e, a continuación, Introducir para xestionar a información, a privacidade e a seguranza na túa Conta de Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Hai varias accións dispoñibles; para desprazarte por elas, preme Tab</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupo</translation> <translation id="2576880857912732701">Botón para xestionar a configuración de seguranza. Se queres xestionar na configuración de Chrome a Navegación segura e outras opcións, preme Introducir</translation> <translation id="2586657967955657006">Portapapeis</translation> -<translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Le esta e <ph name="OTHER_ARTICLE_COUNT" /> noticias máis.</translation> <translation id="2587841377698384444">ID de API de directorio:</translation> <translation id="2594318783181750337">Vista web rápida:</translation> <translation id="2595719060046994702">Este dispositivo e conta non están xestionados por unha empresa ou outra organización.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Contrasinal incorrecto</translation> <translation id="5051305769747448211">Comedia en directo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este ficheiro usando Compartir por Nearby, libera espazo (<ph name="DISK_SPACE_SIZE" />) no dispositivo}other{Para enviar estes ficheiros usando Compartir por Nearby, libera espazo (<ph name="DISK_SPACE_SIZE" />) no dispositivo}}</translation> -<translation id="5056549851600133418">Artigos para ti</translation> <translation id="5060483733937416656">Escolliches verificar a túa identidade con Windows Hello nos sitios web que usan <ph name="PROVIDER_ORIGIN" />. É posible que este provedor almacenase información sobre o teu método de pago. Podes <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Querías dicir "<ph name="LOOKALIKE_DOMAIN" />"?</translation> <translation id="5066056036849835175">Historial de impresión</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Caixa de correo 7</translation> <translation id="5541546772353173584">Engade un correo electrónico</translation> <translation id="5543722831081909240">180 graos</translation> -<translation id="5545756402275714221">Artigos personalizados</translation> <translation id="5551890439174915351">100 x 200 polgadas</translation> <translation id="5552137475244467770">Chrome comproba periodicamente se os teus contrasinais aparecen nas listas que se publican en liña. Cando o fai, os teus contrasinais e os teus nomes de usuario están encriptados, polo que ninguén pode lelos, nin sequera Google.</translation> <translation id="5556459405103347317">Volver cargar</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">Turquesa claro</translation> <translation id="6272088941196661550">Retomar o percorrido para ver a actividade relevante do teu historial de Chrome</translation> <translation id="6272383483618007430">Actualización de Google</translation> -<translation id="6276112860590028508">As páxinas da túa lista de lectura aparecen aquí</translation> <translation id="627746635834430766">Para pagar máis rápido a próxima vez, garda a túa tarxeta e o enderezo de facturación na conta de Google.</translation> <translation id="6279183038361895380">Preme |<ph name="ACCELERATOR" />| para mostrar o cursor</translation> <translation id="6280223929691119688">Non se pode realizar a entrega neste enderezo. Selecciona un diferente.</translation> <translation id="6284292079994426700">26 × 38 in</translation> <translation id="6285507000506177184">Botón para xestionar as descargas en Chrome. Se queres xestionar os ficheiros que descargaches en Chrome, preme Introducir</translation> <translation id="6289939620939689042">Cor das páxinas</translation> -<translation id="6290238015253830360">Os teus artigos suxeridos aparecerán aquí</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Gardando...</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Clásicos do rock e do pop</translation> <translation id="769721561045429135">Neste momento, tes tarxetas que só se poden utilizar neste dispositivo. Fai clic en Continuar para revisar as tarxetas.</translation> <translation id="7698864304447945242">Queres actualizar Servizos de Google Play para realidade aumentada?</translation> -<translation id="7699293099605015246">Os artigos non están dispoñibles neste momento</translation> <translation id="7701040980221191251">Ningunha</translation> <translation id="7701544340847569275">A actualización completouse con erros</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Ir a <ph name="SITE" /> (non seguro)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 9e87f491..196af2b1 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">તમે એવી સાઇટ પર તમારો પાસવર્ડ દાખલ કર્યો કે જે તમારી કંપની દ્વારા મેનેજ કરવામાં આવતો નથી. તમારા એકાઉન્ટને સુરક્ષિત કરવા માટે, અન્ય ઍપ અને સાઇટ પર તમારા પાસવર્ડનો ફરી ઉપયોગ કરશો નહીં.</translation> <translation id="1257553931232494454">નાનું-મોટું કરવાના લેવલ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, તમારા Chrome સેટિંગ મેનેજ કરવા માટે, પહેલાં Tab અને પછી Enter કી દબાવો</translation> -<translation id="1263231323834454256">વાચન સૂચિ</translation> <translation id="1264309058268477500">વૈકલ્પિક</translation> <translation id="1264974993859112054">રમત-ગમત</translation> <translation id="1266469291454105242">ડિવાઇસ અનલૉક કરવાની સુવિધા</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ટ્રે 8</translation> <translation id="1530707389502320859">તમે હમણાં જે સાઇટની મુલાકાત લેવાનો પ્રયાસ કર્યો તે બનાવટી હોય એવું લાગે છે. હુમલાખોરો URLમાં સરળતાથી ન જોઈ શકાય એવા મામૂલી ફેરફારો કરીને કેટલીક વખત સાઇટની નકલ કરે છે.</translation> <translation id="1532118530259321453">આ પેજ કહે છે કે</translation> -<translation id="153384715582417236">હમણાં માટે બસ આટલું પૂરતું છે</translation> <translation id="1536390784834419204">પેજનો અનુવાદ કરો</translation> <translation id="1539840569003678498">રિપોર્ટ મોકલ્યો:</translation> <translation id="1549470594296187301">આ સુવિધાનો ઉપયોગ કરવા માટે JavaScript સક્ષમ કરેલ હોવી આવશ્યક છે.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">તમારું બ્રાઉઝર મેનેજ કરવામાં આવે છે</translation> <translation id="1746113442205726301">છબીને Y અક્ષ પર ખસેડો</translation> <translation id="1746531169546376413">0 ડિગ્રી</translation> -<translation id="17513872634828108">ટેબ્સ ખોલો</translation> <translation id="1752021286346845558">મેઇલબૉક્સ 8</translation> <translation id="1753068535428855445">ડેટિંગ અને વ્યક્તિગત</translation> <translation id="1753706481035618306">પેજ નંબર</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows નેટવર્ક ડાયગ્નોસ્ટિક્સ ચલાવવાનો પ્રયાસ કરો<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromiumમાં છૂપા મોડ વિશે વધુ જાણો<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">તમારા ખુલ્લા ટૅબ્સ અહીં દેખાય છે</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, તમારા Google એકાઉન્ટમાં તમારી માહિતી, પ્રાઇવસી અને સુરક્ષા મેનેજ કરવા માટે, પહેલાં Tab અને પછી Enter કી દબાવો</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, એકથી વધારે ક્રિયાઓ ઉપલબ્ધ છે, એ બધી પર નજર કરવા માટે Tab કી દબાવો</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">જૂથ</translation> <translation id="2576880857912732701">સુરક્ષા સેટિંગ મેનેજ કરવા માટેનું બટન, Chrome સેટિંગમાં Safe Browsing જેવી તમારી બીજી ઘણી સુવિધાઓ મેનેજ કરવા માટે Enter કી દબાવો</translation> <translation id="2586657967955657006">ક્લિપબોર્ડ</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> તરફથી. આ અને અન્ય <ph name="OTHER_ARTICLE_COUNT" /> વાર્તાઓ વાંચો.</translation> <translation id="2587841377698384444">ડિરેક્ટરી API ID:</translation> <translation id="2594318783181750337">ઝડપી વેબ વ્યૂ:</translation> <translation id="2595719060046994702">આ ડિવાઇસ એક કંપની અથવા અન્ય સંસ્થા દ્વારા મેનેજ કરવામાં આવે છે.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">ખોટો પાસવર્ડ</translation> <translation id="5051305769747448211">લાઇવ કૉમેડી</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{નજીકના શેરની સુવિધાનો ઉપયોગ કરીને આ ફાઇલ મોકલવા માટે, તમારા ડિવાઇસ પર સ્પેસ (<ph name="DISK_SPACE_SIZE" />) ખાલી કરો}one{નજીકના શેરની સુવિધાનો ઉપયોગ કરીને આ ફાઇલ મોકલવા માટે, તમારા ડિવાઇસ પર સ્પેસ (<ph name="DISK_SPACE_SIZE" />) ખાલી કરો}other{નજીકના શેરની સુવિધાનો ઉપયોગ કરીને આ ફાઇલો મોકલવા માટે, તમારા ડિવાઇસ પર સ્પેસ (<ph name="DISK_SPACE_SIZE" />) ખાલી કરો}}</translation> -<translation id="5056549851600133418">તમારા માટે લેખ</translation> <translation id="5060483733937416656">તમે <ph name="PROVIDER_ORIGIN" />નો ઉપયોગ કરતી વેબસાઇટ પર Windows Hello વડે ચકાસણી કરવાનું પસંદ કર્યું છે. આ પ્રદાતાએ તમારી ચુકવણી પદ્ધતિ વિશેની માહિતી કદાચ સ્ટોર કરી હોઈ શકે છે, જેને તમે <ph name="LINK_TEXT" /> કરી શકો છો.</translation> <translation id="5061227663725596739">શું તમારો અર્થ <ph name="LOOKALIKE_DOMAIN" /> હતો?</translation> <translation id="5066056036849835175">પ્રિન્ટનો ઇતિહાસ</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">કાઢી નાખો</translation> <translation id="5239623327352565343">લોકેશનની મંજૂરી છે</translation> <translation id="5242889659037569123">સામાન અને મુસાફરીની વસ્તુ</translation> +<translation id="5244732203286792411">લોડ કરી રહ્યાં છીએ… + આમાં એક મિનિટ લાગી શકે છે.</translation> <translation id="5250209940322997802">"નેટવર્ક સાથે કનેક્ટ કરો"</translation> <translation id="52517543715119994">Chromeની સુવિધાઓ વિશે જાણો</translation> <translation id="5251803541071282808">મેઘ</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">મેઇલબૉક્સ 7</translation> <translation id="5541546772353173584">ઇમેઇલ ઍડ્રેસ ઉમેરો</translation> <translation id="5543722831081909240">180 ડિગ્રી</translation> -<translation id="5545756402275714221">તમારા માટે લેખ</translation> <translation id="5551890439174915351">100 x 200 મિમી</translation> <translation id="5552137475244467770">Chrome તમારા પાસવર્ડને ઑનલાઇન પ્રકાશિત કરવામાં આવેલી સૂચિઓ સામે સમય સમય પર ચેક કરે છે. આમ કરતી વખતે તમારા પાસવર્ડ અને વપરાશકર્તા નામ એન્ક્રિપ્ટેડ હોય છે, જેથી Google સહિત, કોઈપણ તેને વાંચી શકતું નથી.</translation> <translation id="5556459405103347317">ફરીથી લોડ કરો</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">આછો મોરપીંછ</translation> <translation id="6272088941196661550">તમારા Chrome ઇતિહાસમાં સંબંધિત પ્રવૃત્તિ જોવા માટે, તમારો પ્રવાસ ફરી શરૂ કરો</translation> <translation id="6272383483618007430">Google અપડેટ</translation> -<translation id="6276112860590028508">તમારી વાંચન સૂચિના પેજ અહીં દેખાશે</translation> <translation id="627746635834430766">આગલી વખતે વધુ ઝડપથી ચુકવણી કરવા માટે, તમારા કાર્ડ અને બિલિંગ સરનામાંને તમારા Google એકાઉન્ટમાં સાચવો.</translation> <translation id="6279183038361895380">તમારા કર્સરને બતાવવા માટે |<ph name="ACCELERATOR" />| દબાવો</translation> <translation id="6280223929691119688">આ સરનામે વિતરણ કરી શકતા નથી. કોઈ ભિન્ન સરનામું પસંદ કરો.</translation> <translation id="6284292079994426700">26 x 38 ઇંચ</translation> <translation id="6285507000506177184">Chromeમાં ડાઉનલોડ મેનેજ કરવા માટેનું બટન, Chromeમાં તમે ડાઉનલોડ કરેલી ફાઇલો મેનેજ કરવા માટે Enter કી દબાવો</translation> <translation id="6289939620939689042">પેજનો રંગ</translation> -<translation id="6290238015253830360">તમારા સૂચવેલા લેખ અહીં દેખાય છે</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">સાચવી રહ્યું છે...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">ક્લાસિક રૉક અને જૂના ગીતો</translation> <translation id="769721561045429135">હમણાં, તમારી પાસે જે કાર્ડ છે તેનો માત્ર આ ડિવાઇસ પર ઉપયોગ કરી શકાય છે. કાર્ડને રિવ્યૂ કરવા માટે 'ચાલુ રાખો' પર ક્લિક કરો.</translation> <translation id="7698864304447945242">શું Google Play Services for AR અપડેટ કરીએ?</translation> -<translation id="7699293099605015246">લેખો અત્યારે ઉપલબ્ધ નથી</translation> <translation id="7701040980221191251">કોઈ નથી</translation> <translation id="7701544340847569275">ભૂલો સાથે અપડેટ કરવાનું સમાપ્ત થયું</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> પર આગળ વધો (અસલામત)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index c3fa6223..d8bde24f 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">आपने अपना पासवर्ड ऐसी साइट पर डाला है जिसे आपका संगठन प्रबंधित नहीं करता है. अपना खाता सुरक्षित करने के लिए, दूसरे ऐप्लिकेशन और साइटों पर अपना पासवर्ड दोबारा इस्तेमाल न करें.</translation> <translation id="1257553931232494454">ज़ूम लेवल</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome की सेटिंग को मैनेज करने के लिए, पहले Tab और फिर Enter दबाएं</translation> -<translation id="1263231323834454256">रीडिंग लिस्ट</translation> <translation id="1264309058268477500">वैकल्पिक ट्रे</translation> <translation id="1264974993859112054">खेल-कूद</translation> <translation id="1266469291454105242">डिवाइस को अनलॉक करने की सुविधा</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ट्रे 8</translation> <translation id="1530707389502320859">जिस साइट पर आपने जाने की कोशिश की, वह नकली लग रही है. हमलावर कभी-कभी यूआरएल में छोटे और नज़र न आने वाले बदलाव करके साइट की नकल कर लेते हैं.</translation> <translation id="1532118530259321453">इस पेज का कहना है कि</translation> -<translation id="153384715582417236">फिलहाल बस इतना ही</translation> <translation id="1536390784834419204">पेज का अनुवाद करें</translation> <translation id="1539840569003678498">रिपोर्ट भेज दी गई:</translation> <translation id="1549470594296187301">इस सुविधा का उपयोग करने के लिए JavaScript को सक्षम किया जाना चाहिए.</translation> @@ -349,7 +347,6 @@ <translation id="1745880797583122200">आपका ब्राउज़र प्रबंधित है</translation> <translation id="1746113442205726301">इमेज Y शिफ़्ट</translation> <translation id="1746531169546376413">0 डिग्री</translation> -<translation id="17513872634828108">टैब खोलें</translation> <translation id="1752021286346845558">मेलबॉक्स 8</translation> <translation id="1753068535428855445">डेटिंग और निजी मामलों से जुड़ी सेवाएं</translation> <translation id="1753706481035618306">पृष्ठ संख्या</translation> @@ -361,7 +358,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows नेटवर्क निदान चलाकर देखें<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium में गुप्त मोड की सुविधा के बारे में ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372"> खोले गए टैब, यहां दिखाई देंगे</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google खाते में अपनी जानकारी, निजता, और सुरक्षा को मैनेज करने के लिए, पहले Tab दबाएं और फिर Enter दबाएं</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, एक से ज़्यादा कार्रवाइयां उपलब्ध हैं, एक-एक करके उन पर जाने के लिए Tab दबाएं</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">ग्रुप</translation> <translation id="2576880857912732701">'सुरक्षा की सेटिंग मैनेज करें' बटन. Chrome की सेटिंग में सुरक्षित ब्राउज़िंग वगैरह को मैनेज करने के लिए, Enter दबाएं</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> की ओर से. यह और <ph name="OTHER_ARTICLE_COUNT" /> दूसरे समाचार पढ़ें.</translation> <translation id="2587841377698384444">निर्देशिका API (एपीआई) आईडी:</translation> <translation id="2594318783181750337">फ़ास्ट वेब व्यू:</translation> <translation id="2595719060046994702">इस डिवाइस और खाते का प्रबंधन कोई कंपनी या दूसरा संगठन नहीं करता है.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">ग़लत पासवर्ड</translation> <translation id="5051305769747448211">लाइव कॉमेडी</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इस फ़ाइल को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}one{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इस फ़ाइल को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}other{आस-पास शेयर करने की सुविधा का इस्तेमाल करके इन फ़ाइलों को भेजने के लिए, अपने डिवाइस में (<ph name="DISK_SPACE_SIZE" />) जगह खाली करें}}</translation> -<translation id="5056549851600133418">आपके लिए लेख</translation> <translation id="5060483733937416656">आपने <ph name="PROVIDER_ORIGIN" /> इस्तेमाल करने वाली वेबसाइटों पर, Windows Hello की मदद से पुष्टि करने का विकल्प चुना है. हो सकता है कि सेवा उपलब्ध कराने वाली इस कंपनी ने आपके पैसे चुकाने के तरीके से जुड़ी जानकारी सेव की हो, जिसे <ph name="LINK_TEXT" /> किया जा सकता है.</translation> <translation id="5061227663725596739">क्या आपका मतलब <ph name="LOOKALIKE_DOMAIN" /> से है?</translation> <translation id="5066056036849835175">प्रिंट करने का इतिहास</translation> @@ -1861,7 +1855,6 @@ <translation id="5541086400771735334">मेलबॉक्स 7</translation> <translation id="5541546772353173584">ईमेल जोड़ें</translation> <translation id="5543722831081909240">180 डिग्री</translation> -<translation id="5545756402275714221">आपके लिए लेख</translation> <translation id="5551890439174915351">100 x 200 मि॰मी॰</translation> <translation id="5552137475244467770">Chrome उन सूचियों में शामिल आपके पासवर्ड की समय-समय पर जांच करता है जिन्हें ऑनलाइन प्रकाशित किया गया है. ऐसा करते समय, आपके पासवर्ड और उपयोगकर्ता नाम सुरक्षित रहते हैं, इसलिए उन्हें कोई नहीं देख सकता, यहां तक कि Google भी नहीं.</translation> <translation id="5556459405103347317">फिर लोड करें</translation> @@ -2143,14 +2136,12 @@ <translation id="6266934640124581640">हल्का नीला-हरा</translation> <translation id="6272088941196661550">अपने 'Chrome इतिहास' में काम की गतिविधि देखने के लिए, फिर से शुरू करें</translation> <translation id="6272383483618007430">Google अपडेट</translation> -<translation id="6276112860590028508">आपकी रीडिंग लिस्ट के पेज यहां दिखाई देंगे</translation> <translation id="627746635834430766">अगली बार तेज़ी से भुगतान करने के लिए, अपने कार्ड और बिलिंग पते को अपने Google खाते में सेव करें.</translation> <translation id="6279183038361895380">अपना कर्सर दिखाने के लिए |<ph name="ACCELERATOR" />| दबाएं</translation> <translation id="6280223929691119688">इस पते पर वितरित नहीं किया जा सकता. कोई दूसरा पता चुनें.</translation> <translation id="6284292079994426700">26 x 38 इंच</translation> <translation id="6285507000506177184">'Chrome में डाउनलोड मैनेज करें' बटन. आपने Chrome में जो फ़ाइलें डाउनलोड की हैं उन्हें मैनेज करने के लिए, Enter दबाएं</translation> <translation id="6289939620939689042">पेज का रंग</translation> -<translation id="6290238015253830360">आपके सुझाए हुए लेख यहां दिखाई देते हैं</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">सहेज रहा है...</translation> @@ -2750,7 +2741,6 @@ <translation id="7696089921647603491">पुराना रॉक म्यूज़िक और गाने</translation> <translation id="769721561045429135">फ़िलहाल आपके पास सिर्फ़ इसी डिवाइस पर इस्तेमाल किए जा सकने वाले कार्ड हैं. कार्ड देखने के लिए जारी रखें पर क्लिक करें.</translation> <translation id="7698864304447945242">Google Play Services for AR को अपडेट करें?</translation> -<translation id="7699293099605015246">फ़िलहाल लेख उपलब्ध नहीं हैं</translation> <translation id="7701040980221191251">कुछ भी नहीं</translation> <translation id="7701544340847569275">अपडेट गड़बड़ियों के साथ पूरा हुआ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> में आगे बढ़ें (असुरक्षित)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb index 6bc59346..417983cc 100644 --- a/components/strings/components_strings_hr.xtb +++ b/components/strings/components_strings_hr.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Unijeli ste zaporku na web-lokaciju kojom ne upravlja vaša organizacija. Da biste zaštitili račun, nemojte upotrebljavati tu zaporku za druge aplikacije i web-lokacije.</translation> <translation id="1257553931232494454">razine zumiranja</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, a zatim Enter da biste upravljali svojim postavkama Chromea</translation> -<translation id="1263231323834454256">Popis za čitanje</translation> <translation id="1264309058268477500">Alternativna</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Otključavanje uređaja</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Ladica 8</translation> <translation id="1530707389502320859">Web-lokacija koju ste upravo pokušali posjetiti izgleda lažno. Napadači ponekad oponašaju web-lokacije sitnim izmjenama URL-a.</translation> <translation id="1532118530259321453">Na ovoj se stranici navodi sljedeće</translation> -<translation id="153384715582417236">To je zasad sve</translation> <translation id="1536390784834419204">Prevedi stranicu</translation> <translation id="1539840569003678498">Izvješće je poslano:</translation> <translation id="1549470594296187301">Za upotrebu te značajke mora biti omogućen JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Preglednikom se upravlja</translation> <translation id="1746113442205726301">Y-pomak slike</translation> <translation id="1746531169546376413">0 stupnjeva</translation> -<translation id="17513872634828108">Otvorene kartice</translation> <translation id="1752021286346845558">Izlazni spremnik s odjeljcima 8</translation> <translation id="1753068535428855445">Osobni kontakti</translation> <translation id="1753706481035618306">Broj stranice</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Pokušajte pokrenuti Mrežnu dijagnostiku sustava Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Saznajte više o anonimnom načinu u Chromiumu<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Ovdje se prikazuju vaše otvorene kartice</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, a zatim Enter da biste upravljali podacima, privatnošću i sigurnošću na svojem Google računu</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, dostupno je više radnji, pritišćite Tab da biste prelazili s jedne na drugu</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">Grupa</translation> <translation id="2576880857912732701">Gumb Upravljajte sigurnosnim postavkama, pritisnite Enter da biste upravljali sigurnim pregledavanjem i drugim značajkama u postavkama Chromea</translation> <translation id="2586657967955657006">Međuspremnik</translation> -<translation id="2587730715158995865">Izdavač: <ph name="ARTICLE_PUBLISHER" />. Pročitajte ovaj članak i još <ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">ID API-ja direktorija:</translation> <translation id="2594318783181750337">Brzi web-prikaz:</translation> <translation id="2595719060046994702">Uređajem i računom ne upravlja nijedna tvrtka ili organizacija.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Pogrešna zaporka</translation> <translation id="5051305769747448211">Komedija uživo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Da biste poslali tu datoteku pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}one{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}few{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}other{Da biste poslali te datoteke pomoću dijeljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}}</translation> -<translation id="5056549851600133418">Preporučeni članci</translation> <translation id="5060483733937416656">Odabrali ste potvrdu putem značajke Windows Hello na web-lokacijama koje koriste <ph name="PROVIDER_ORIGIN" />. Taj je davatelj usluga možda pohranio podatke o vašem načinu plaćanja za koje možete <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Jeste li mislili <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Povijest ispisa</translation> @@ -1799,6 +1793,7 @@ <translation id="5344579389779391559">Ta će vam stranica možda pokušati nešto naplatiti</translation> <translation id="5347645913823149105">Gumb Prilagodi fontove u Chromeu, pritisnite Enter da biste prilagodili veličine i vrste fontova u Chromeu</translation> <translation id="5355557959165512791">Trenutačno ne možete otvoriti web-lokaciju <ph name="SITE" /> jer je njezin certifikat opozvan. Mrežne pogreške i napadi uglavnom su privremeni i ta bi stranica kasnije trebala funkcionirati.</translation> +<translation id="5356345925629253198">Spremljene adrese možete upotrijebiti na Googleovim proizvodima. Ta će se adresa spremiti na vaš Google račun (<ph name="ACCOUNT" />).</translation> <translation id="5357848622083956825">Vizualna umjetnost i dizajn</translation> <translation id="536296301121032821">Pohrana postavki pravila nije uspjela</translation> <translation id="5363309033720083897">Serijski priključak koji dopušta vaš administrator</translation> @@ -1864,7 +1859,6 @@ <translation id="5541086400771735334">Izlazni spremnik s odjeljcima 7</translation> <translation id="5541546772353173584">Dodajte e-adresu</translation> <translation id="5543722831081909240">180 stupnjeva</translation> -<translation id="5545756402275714221">Preporučeni članci</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome povremeno uspoređuje vaše zaporke s javno objavljenim popisima. Tom su prilikom vaše zaporke i korisnička imena kriptirani, tako da ih nitko ne može pročitati, uključujući Google.</translation> <translation id="5556459405103347317">Ponovno učitaj</translation> @@ -2146,14 +2140,12 @@ <translation id="6266934640124581640">Svijetlotirkiznoplava</translation> <translation id="6272088941196661550">Nastavite putovanje da biste vidjeli relevantne aktivnosti u svojoj povijesti na Chromeu</translation> <translation id="6272383483618007430">Google ažuriranje</translation> -<translation id="6276112860590028508">Ovdje se prikazuju stranice s vašeg popisa za čitanje</translation> <translation id="627746635834430766">Da biste sljedeći put platili brže, karticu i adresu za naplatu spremite na svoj Google račun.</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da bi se prikazao pokazivač</translation> <translation id="6280223929691119688">Dostava na tu adresu nije moguća. Odaberite drugu adresu.</translation> <translation id="6284292079994426700">26 x 38 inča</translation> <translation id="6285507000506177184">Gumb Upravljaj preuzimanjima u Chromeu, pritisnite Enter da biste upravljali datotekama koje ste preuzeli u Chromeu</translation> <translation id="6289939620939689042">Boja stranice</translation> -<translation id="6290238015253830360">Ovdje će se prikazivati predloženi članci</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Spremanje...</translation> @@ -2754,7 +2746,6 @@ <translation id="7696089921647603491">Klasični rock i stare pjesme</translation> <translation id="769721561045429135">Trenutačno imate kartice kojima se može plaćati samo na ovom uređaju. Kliknite Nastavi da biste pregledali kartice.</translation> <translation id="7698864304447945242">Želite li ažurirati Google Play usluge za AR?</translation> -<translation id="7699293099605015246">Članci trenutačno nisu dostupni</translation> <translation id="7701040980221191251">Nema ih</translation> <translation id="7701544340847569275">Ažuriranje je završeno s pogreškama</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Idi na web-lokaciju <ph name="SITE" /> (nije sigurno)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb index 1fcf03d..cf49280 100644 --- a/components/strings/components_strings_hu.xtb +++ b/components/strings/components_strings_hu.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Olyan webhelyen adta meg a jelszavát, amelyet nem az Ön szervezete kezel. Fiókja védelme érdekében ne használja fel újra a jelszót más alkalmazásokban és webhelyeken.</translation> <translation id="1257553931232494454">nagyítási/kicsinyítési szintek</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Nyomja le a Tab, majd az Enter gombot a Chrome-beállítások kezeléséhez.</translation> -<translation id="1263231323834454256">Olvasási lista</translation> <translation id="1264309058268477500">Alternatív</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Eszköz feloldása</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8. tálca</translation> <translation id="1530707389502320859">Az éppen felkeresni kívánt webhely hamisnak tűnik. A támadók néha úgy próbálnak meg webhelyeket utánozni, hogy apró, alig észrevehető változtatásokkal rendelkező URL-címeket használnak.</translation> <translation id="1532118530259321453">Az oldal közlendője</translation> -<translation id="153384715582417236">Egyelőre ennyi</translation> <translation id="1536390784834419204">Oldal fordítása</translation> <translation id="1539840569003678498">Bejelentés elküldve:</translation> <translation id="1549470594296187301">A funkció használatához engedélyezni kell a JavaScriptet.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">A böngésző felügyelet alatt áll</translation> <translation id="1746113442205726301">Kép Y-eltolása</translation> <translation id="1746531169546376413">0 fok</translation> -<translation id="17513872634828108">Megnyitott lapok</translation> <translation id="1752021286346845558">8. postaláda</translation> <translation id="1753068535428855445">Párkeresés és ismerkedés</translation> <translation id="1753706481035618306">Oldalszám</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Próbálkozzon a Windows Hálózati diagnosztika futtatásával<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />További információ a Chromium inkognitó módjáról<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">A megnyitott lapok helye</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tartsa lenyomva a Tab billentyűt, majd nyomja meg az Enter billentyűt az adatai, az adatvédelem és a biztonság kezeléséhez a Google-fiókjában</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, több művelet is rendelkezésre áll, a Tab gombbal mozoghat közöttük</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Csoport</translation> <translation id="2576880857912732701">Biztonsági beállítások kezelése gomb. Nyomja le az Enter billentyűt a Biztonságos Böngészésnek és más funkcióknak a Chrome-beállítások közötti kezeléséhez.</translation> <translation id="2586657967955657006">Vágólap</translation> -<translation id="2587730715158995865">Forrás: <ph name="ARTICLE_PUBLISHER" />. Olvassa el ezt és további <ph name="OTHER_ARTICLE_COUNT" /> hírt.</translation> <translation id="2587841377698384444">Könyvtár API-azonosítója:</translation> <translation id="2594318783181750337">Gyors webnézet:</translation> <translation id="2595719060046994702">Ezt az eszközt és fiókot nem kezeli cég vagy más szervezet.</translation> @@ -1662,7 +1657,6 @@ <translation id="5045550434625856497">Helytelen jelszó</translation> <translation id="5051305769747448211">Élő kabaré</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ha a Közeli megosztás funkcióval szeretné elküldeni a fájlt, szabadítson fel legalább <ph name="DISK_SPACE_SIZE" /> tárhelyet eszközén}other{Ha a Közeli megosztás funkcióval szeretné elküldeni a fájlokat, szabadítson fel legalább <ph name="DISK_SPACE_SIZE" /> tárhelyet eszközén}}</translation> -<translation id="5056549851600133418">Cikkek Önnek</translation> <translation id="5060483733937416656">Úgy döntött, hogy a Windows Hello használatával igazolja magát a következőt használó webhelyeken: <ph name="PROVIDER_ORIGIN" />. Ez a szolgáltató eltárolhatott információkat az Ön fizetési módjáról. Ön <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Erre gondolt: <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Nyomtatási előzmények</translation> @@ -1857,7 +1851,6 @@ <translation id="5541086400771735334">7. postaláda</translation> <translation id="5541546772353173584">E-mail-cím hozzáadása</translation> <translation id="5543722831081909240">180 fok</translation> -<translation id="5545756402275714221">Cikkek Önnek</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">A Chrome rendszeres időközönként online közzétett listák alapján ellenőrzi az Ön jelszavait. Az eljárás során jelszavai és felhasználónevei titkosítva vannak, így senki nem láthatja őket, még a Google sem.</translation> <translation id="5556459405103347317">Újratöltés</translation> @@ -2139,14 +2132,12 @@ <translation id="6266934640124581640">Világos pávakék</translation> <translation id="6272088941196661550">Utazás folytatása a Chrome-előzmények között található releváns tevékenységek megtekintéséhez</translation> <translation id="6272383483618007430">Google Frissítés</translation> -<translation id="6276112860590028508">Az olvasási listájának adatai itt jelennek meg</translation> <translation id="627746635834430766">A következő alkalommal gyorsabban fizethet, ha Google-fiókjába menti kártyáját és számlázási címét.</translation> <translation id="6279183038361895380">Az egérmutató megjelenítéséhez nyomja meg a következő billentyűt: |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Erre a címre nem lehetséges a kézbesítés. Válasszon másik címet.</translation> <translation id="6284292079994426700">26 × 38 hüvelyk</translation> <translation id="6285507000506177184">Letöltések kezelése a Chrome-ban gomb. Nyomja le az Enter billentyűt a Chrome-ban letöltött fájlok kezeléséhez.</translation> <translation id="6289939620939689042">Oldalszín</translation> -<translation id="6290238015253830360">A javasolt cikkek helye</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Mentés…</translation> @@ -2746,7 +2737,6 @@ <translation id="7696089921647603491">Klasszikus rock és régi zenék</translation> <translation id="769721561045429135">Jelenleg vannak olyan kártyái, amelyek csak ezen az eszközön használhatók Kattintson a Folytatás lehetőségre a kártyák áttekintéséhez.</translation> <translation id="7698864304447945242">Frissíti a Google Play Services for AR szolgáltatást?</translation> -<translation id="7699293099605015246">A cikkek jelenleg nem állnak rendelkezésre</translation> <translation id="7701040980221191251">Nincs</translation> <translation id="7701544340847569275">A frissítés hibákkal fejeződött be</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Tovább a(z) <ph name="SITE" /> webhelyre (nem biztonságos)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_hy.xtb b/components/strings/components_strings_hy.xtb index 98b0155e..6413891f 100644 --- a/components/strings/components_strings_hy.xtb +++ b/components/strings/components_strings_hy.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Դուք մուտքագրել եք գաղտնաբառը մի կայքում, որը չի կառավարվում ձեր կազմակերպության կողմից: Ձեր հաշիվը պաշտպանելու համար խորհուրդ ենք տալիս չօգտագործել այդ գաղտնաբառը այլ հավելվածներում և կայքերում:</translation> <translation id="1257553931232494454">մասշտաբավորման մակարդակներ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />։ Սեղմեք Tab, ապա սեղմեք Enter՝ Chrome-ի ձեր կարգավորումները կառավարելու համար</translation> -<translation id="1263231323834454256">Ընթերցանության ցանկ</translation> <translation id="1264309058268477500">Այլ</translation> <translation id="1264974993859112054">Սպորտ</translation> <translation id="1266469291454105242">Սարքի ապակողպում</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Դարակ 8</translation> <translation id="1530707389502320859">Կայքը, որը փորձում եք անցնել, նման է կեղծ կայքի։ Հաքերները երբեմն ստեղծում են կայքերի կրկնօրինակներ՝ փոքր-ինչ փոփոխելով դրանց URL-ը, ինչը հնարավոր չէ միանգամից նկատել։</translation> <translation id="1532118530259321453">Հաղորդագրություն այս էջից</translation> -<translation id="153384715582417236">Առայժմ այսքանը</translation> <translation id="1536390784834419204">Թարգմանել էջը</translation> <translation id="1539840569003678498">Հաշվետվությունն ուղարկվել է՝</translation> <translation id="1549470594296187301">Այս հատկությունից օգտվելու համար հարկավոր է միացնել JavaScript-ը:</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Ձեր դիտարկիչը կառավարվում է</translation> <translation id="1746113442205726301">Պատկերի տեղաշարժ Y առանցքով</translation> <translation id="1746531169546376413">0 աստիճան</translation> -<translation id="17513872634828108">Բաց ներդիրներ</translation> <translation id="1752021286346845558">Փոստարկղ 8</translation> <translation id="1753068535428855445">Ծանոթություններ և անձնական հանդիպումներ</translation> <translation id="1753706481035618306">Էջի համարը</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Գործարկեք Windows-ի ցանցի ախտորոշումը<ph name="END_LINK" />:</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Իմանալ ավելին Chromium-ի ինկոգնիտո ռեժիմի մասին<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Ձեր բացված ներդիրները կցուցադրվեն այստեղ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />։ Google հաշվում ձեր տվյալները, գաղտնիությունն ու անվտանգությունը կառավարելու համար սեղմեք Tab, ապա՝ Enter։</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />։ Հասանելի են բազմաթիվ գործողություններ։ Դրանք ընտրելու համար սեղմեք Tab:</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Խումբ</translation> <translation id="2576880857912732701">«Կառավարել անվտանգության կարգավորումները» կոճակ։ Ապահով դիտարկումը և այլ պարամետրեր Chrome-ի կարգավորումներում կառավարելու համար սեղմեք Enter։</translation> <translation id="2586657967955657006">Սեղմատախտակ</translation> -<translation id="2587730715158995865">Աղբյուրը՝ <ph name="ARTICLE_PUBLISHER" />: Կարդացեք այս ու ևս <ph name="OTHER_ARTICLE_COUNT" /> հոդված:</translation> <translation id="2587841377698384444">Գրացուցակի API ID՝</translation> <translation id="2594318783181750337">Արագ վեբ տարբերակ՝</translation> <translation id="2595719060046994702">Այս սարքը և հաշիվը չեն կառավարվում որևէ ընկերության կամ կազմակերպության կողմից:</translation> @@ -730,6 +725,7 @@ <translation id="2718207025093645426">Կառավարվող օգտատիրոջ կամ սարքի համար չի բեռնվել կանոն։</translation> <translation id="2721148159707890343">Հարցումը հաջողվեց</translation> <translation id="2723669454293168317">Անցեք անվտանգության ստուգում Chrome-ի կարգավորումներում</translation> +<translation id="2725492561136085792">Սեղմեք Enter՝ այս գործողությունն ակտիվացնելու համար։</translation> <translation id="2726001110728089263">Կողային դարակ</translation> <translation id="2728127805433021124">Սերվերի վկայագիրը ստորագրված է ստորագրության թույլ ալգորիթմով:</translation> <translation id="2730326759066348565"><ph name="BEGIN_LINK" />Գործարկել կապակցման ախտորոշումը<ph name="END_LINK" /></translation> @@ -826,6 +822,7 @@ <translation id="299990983510665749">Հեչբեք ավտոմեքենաներ</translation> <translation id="3002501248619246229">Ստուգել մուտքային դարակի տվյալները</translation> <translation id="3005723025932146533">Ցուցադրել պահված պատճենը</translation> +<translation id="3009036448238594149"><ph name="ACTION_IN_SUGGEST_FOCUSED_FRIENDLY_MATCH_TEXT" />։ Սեղմեք Tab՝ հասանելի գործողությունները դիտելու համար, ապա սեղմեք Enter՝ ընտրված գործողությունը կատարելու համար։</translation> <translation id="3013291976881901233">MIDI սարքեր</translation> <translation id="301521992641321250">Ավտոմատ արգելափակված է</translation> <translation id="3016780570757425217">Իմանալ ձեր տեղադրությունը</translation> @@ -1663,7 +1660,6 @@ <translation id="5045550434625856497">Գաղտնաբառը սխալ է</translation> <translation id="5051305769747448211">Կենդանի կատակերգություն</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Այս ֆայլը «Փոխանակում մոտակա սարքերի հետ» գործառույթի միջոցով ուղարկելու համար ձեր սարքում տարածք ազատեք (<ph name="DISK_SPACE_SIZE" />)}one{Այս ֆայլը «Փոխանակում մոտակա սարքերի հետ» գործառույթի միջոցով ուղարկելու համար ձեր սարքում տարածք ազատեք (<ph name="DISK_SPACE_SIZE" />)}other{Այս ֆայլերը «Փոխանակում մոտակա սարքերի հետ» գործառույթի միջոցով ուղարկելու համար ձեր սարքում տարածք ազատեք (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Հոդվածներ ձեզ համար</translation> <translation id="5060483733937416656">Դուք ընտրել եք, որ կայքերում, որոնք օգտագործում են <ph name="PROVIDER_ORIGIN" /> աղբյուրը, հաստատումը կատարվի Windows Hello-ի միջոցով։ Հնարավոր է՝ այս մատակարարը տեղեկություններ է պահել ձեր վճարման եղանակի մասին։ Դուք կարող եք այդ տեղեկությունների <ph name="LINK_TEXT" />։</translation> <translation id="5061227663725596739">Արդյո՞ք նկատի ունեիք «<ph name="LOOKALIKE_DOMAIN" />»</translation> <translation id="5066056036849835175">Տպման պատմություն</translation> @@ -1858,7 +1854,6 @@ <translation id="5541086400771735334">Փոստարկղ 7</translation> <translation id="5541546772353173584">Ավելացրեք էլեկտրոնային հասցե</translation> <translation id="5543722831081909240">180 աստիճան</translation> -<translation id="5545756402275714221">Հոդվածներ ձեզ համար</translation> <translation id="5551890439174915351">100 x 200 մմ</translation> <translation id="5552137475244467770">Chrome-ը պարբերաբար hամեմատում է ձեր գաղտնաբառերը ցուցակների հետ, որոնք հրապարակվել են առցանց։ Այդ ժամանակ ձեր գաղտնաբառերը և օգտանունները գաղտնագրվում են, այնպես որ ոչ ոք չի կարող կարդալ դրանք, նույնիսկ Google-ը։</translation> <translation id="5556459405103347317">Վերաբեռնել</translation> @@ -2140,14 +2135,12 @@ <translation id="6266934640124581640">Բաց փիրուզագույն</translation> <translation id="6272088941196661550">Շարունակել որոնումը՝ Chrome-ի պատմության մեջ նման հարցումները դիտելու համար</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Ձեր ընթերցանության ցանկի էջերը կցուցադրվեն այստեղ</translation> <translation id="627746635834430766">Հաջորդ անգամ ավելի արագ վճարելու համար պահեք ձեր քարտը և վճարային հասցեն Google հաշվում:</translation> <translation id="6279183038361895380">Նշորդը ցուցադրելու համար սեղմեք |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Այս հասցեով հնարավոր չէ առաքել: Ընտրեք այլ հասցե:</translation> <translation id="6284292079994426700">26 x 38 դյույմ</translation> <translation id="6285507000506177184">«Կառավարել ներբեռնումները Chrome-ում» կոճակ։ Սեղմեք Enter՝ Chrome-ում ձեր ներբեռնած ֆայլերը կառավարելու համար։</translation> <translation id="6289939620939689042">Էջի գույնը</translation> -<translation id="6290238015253830360">Այստեղ կցուցադրվեն առաջարկվող հոդվածները</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC կոդ՝</translation> <translation id="6295855836753816081">Պահում...</translation> @@ -2747,7 +2740,6 @@ <translation id="7696089921647603491">Դասական ռոք և ռետրո</translation> <translation id="769721561045429135">Տվյալ պահին դուք ունեք քարտեր, որոնք կարող են օգտագործվել միայն այս սարքում: Սեղմեք «Շարունակել»՝ դրանց տվյալները տեսնելու համար:</translation> <translation id="7698864304447945242">Թարմացնե՞լ Google Play ծառայություններն AR-ի համար</translation> -<translation id="7699293099605015246">Հոդվածներն այս պահին հասանելի չեն</translation> <translation id="7701040980221191251">Չկա</translation> <translation id="7701544340847569275">Թարմացումն ավարտվել է սխալներով</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Անցնել <ph name="SITE" /> (ապահով չէ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb index eec54649..febd11d3 100644 --- a/components/strings/components_strings_id.xtb +++ b/components/strings/components_strings_id.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Anda memasukkan sandi di situs yang tidak dikelola oleh organisasi. Untuk melindungi akun, jangan gunakan sandi yang sama di aplikasi dan situs lain.</translation> <translation id="1257553931232494454">tingkat zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan Tab lalu Enter untuk mengelola setelan Chrome Anda</translation> -<translation id="1263231323834454256">Daftar bacaan</translation> <translation id="1264309058268477500">Alternatif</translation> <translation id="1264974993859112054">Olahraga</translation> <translation id="1266469291454105242">Buka kunci perangkat</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Baki 8</translation> <translation id="1530707389502320859">Situs yang baru saja Anda coba kunjungi terlihat palsu. Penyerang terkadang meniru situs dengan membuat perubahan kecil dan sulit terlihat pada URL situs.</translation> <translation id="1532118530259321453">Halaman ini menyatakan</translation> -<translation id="153384715582417236">Itu saja untuk sekarang</translation> <translation id="1536390784834419204">Terjemahkan halaman</translation> <translation id="1539840569003678498">Laporan dikirim:</translation> <translation id="1549470594296187301">JavaScript harus diaktifkan untuk menggunakan fitur ini.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Browser Anda dikelola</translation> <translation id="1746113442205726301">Perpindahan image Y</translation> <translation id="1746531169546376413">0 derajat</translation> -<translation id="17513872634828108">Buka tab</translation> <translation id="1752021286346845558">Kotak surat 8</translation> <translation id="1753068535428855445">Kencan & pribadi</translation> <translation id="1753706481035618306">Nomor halaman</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Coba jalankan Diagnostik Jaringan Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Pelajari mode Samaran di Chromium lebih lanjut<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tab yang terbuka muncul di sini</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan Tab lalu Enter untuk mengelola info, privasi, dan keamanan di Akun Google Anda</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, beberapa tindakan tersedia, tekan Tab untuk melihat semua tindakan</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grup</translation> <translation id="2576880857912732701">Tombol Kelola setelan keamanan, tekan Enter untuk mengelola Safe Browsing dan lainnya di setelan Chrome</translation> <translation id="2586657967955657006">Papan klip</translation> -<translation id="2587730715158995865">Dari <ph name="ARTICLE_PUBLISHER" />. Baca artikel ini dan <ph name="OTHER_ARTICLE_COUNT" /> artikel lainnya.</translation> <translation id="2587841377698384444">ID API Direktori:</translation> <translation id="2594318783181750337">Tampilan web cepat:</translation> <translation id="2595719060046994702">Perangkat dan akun ini tidak dikelola oleh perusahaan atau organisasi lain.</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">Sandi salah</translation> <translation id="5051305769747448211">Komedi live</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Untuk mengirim file ini menggunakan Berbagi Langsung, kosongkan ruang penyimpanan (<ph name="DISK_SPACE_SIZE" />) di perangkat Anda}other{Untuk mengirim file ini menggunakan Berbagi Langsung, kosongkan ruang penyimpanan (<ph name="DISK_SPACE_SIZE" />) di perangkat Anda}}</translation> -<translation id="5056549851600133418">Artikel untuk Anda</translation> <translation id="5060483733937416656">Anda memilih untuk memverifikasi dengan Windows Hello di situs yang menggunakan <ph name="PROVIDER_ORIGIN" />. Penyedia ini mungkin telah menyimpan informasi tentang metode pembayaran Anda, yang dapat Anda <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Mungkin maksud Anda <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Histori pencetakan</translation> @@ -1741,6 +1735,8 @@ <translation id="5234764350956374838">Tutup</translation> <translation id="5239623327352565343">Lokasi diizinkan</translation> <translation id="5242889659037569123">Koper & aksesori perjalanan</translation> +<translation id="5244732203286792411">Memuat... + Mungkin perlu waktu beberapa saat.</translation> <translation id="5250209940322997802">"Sambungkan ke jaringan"</translation> <translation id="52517543715119994">Pelajari fitur-fitur Chrome</translation> <translation id="5251803541071282808">Awan</translation> @@ -1858,7 +1854,6 @@ <translation id="5541086400771735334">Kotak surat 7</translation> <translation id="5541546772353173584">Tambahkan Email</translation> <translation id="5543722831081909240">180 derajat</translation> -<translation id="5545756402275714221">Artikel untuk Anda</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome memeriksa sandi Anda secara berkala berdasarkan daftar sandi yang telah diterbitkan secara online. Saat pemeriksaan dilakukan, sandi dan nama pengguna Anda dienkripsi, sehingga tidak dapat dibaca oleh siapa pun, termasuk Google.</translation> <translation id="5556459405103347317">Muat ulang</translation> @@ -2140,14 +2135,12 @@ <translation id="6266934640124581640">Hijau Kebiruan Terang</translation> <translation id="6272088941196661550">Lanjutkan perjalanan Anda untuk melihat aktivitas yang relevan di histori Chrome Anda</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Halaman dari daftar bacaan Anda muncul di sini</translation> <translation id="627746635834430766">Untuk membayar lebih cepat di pembelian selanjutnya, simpan kartu dan alamat penagihan ke Akun Google Anda.</translation> <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk menampilkan kursor</translation> <translation id="6280223929691119688">Tidak dapat mengirim ke alamat ini. Pilih alamat lain.</translation> <translation id="6284292079994426700">26 x 38 inci (66 x 96 cm)</translation> <translation id="6285507000506177184">Tombol Kelola download di Chrome, tekan Enter untuk mengelola file yang telah Anda download di Chrome</translation> <translation id="6289939620939689042">Warna Halaman</translation> -<translation id="6290238015253830360">Artikel yang disarankan ditampilkan di sini</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Menyimpan...</translation> @@ -2745,7 +2738,6 @@ <translation id="7696089921647603491">Musik rock klasik & lawas</translation> <translation id="769721561045429135">Sekarang, Anda memiliki beberapa kartu yang hanya dapat digunakan di perangkat ini. Klik Lanjutkan untuk meninjau kartu.</translation> <translation id="7698864304447945242">Update Layanan Google Play untuk AR?</translation> -<translation id="7699293099605015246">Artikel tidak tersedia untuk saat ini</translation> <translation id="7701040980221191251">Tidak ada</translation> <translation id="7701544340847569275">Update selesai dengan error</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Lanjutkan ke <ph name="SITE" /> (tidak aman)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_is.xtb b/components/strings/components_strings_is.xtb index b1978695..64e9e0d 100644 --- a/components/strings/components_strings_is.xtb +++ b/components/strings/components_strings_is.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Þú slóst inn aðgangsorðið þitt á síðu sem þitt fyrirtæki hefur ekki umsjón með. Til að vernda reikninginn þinn skaltu ekki nota sama aðgangsorð í öðrum forritum og á öðrum síðum.</translation> <translation id="1257553931232494454">aðdráttarstig</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ýttu á dálkalykilinn (Tab) og svo á Enter til að stjórna stillingum Chrome</translation> -<translation id="1263231323834454256">Leslisti</translation> <translation id="1264309058268477500">Annað</translation> <translation id="1264974993859112054">Íþróttir</translation> <translation id="1266469291454105242">Taka tæki úr lás</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bakki 8</translation> <translation id="1530707389502320859">Vefsvæðið sem þú varst að reyna að opna virðist vera falskt. Stundum herma tölvuþrjótar eftir vefsvæðum með því að gera litlar og illgreinanlegar breytingar á vefslóðinni.</translation> <translation id="1532118530259321453">Þessi síða segir</translation> -<translation id="153384715582417236">Það er allt og sumt í bili</translation> <translation id="1536390784834419204">Þýða síðu</translation> <translation id="1539840569003678498">Skýrsla send:</translation> <translation id="1549470594296187301">JavaScript verður að vera virkt til að hægt sé að nota þennan eiginleika.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Vafranum þínum er stjórnað</translation> <translation id="1746113442205726301">Y-færsla myndar</translation> <translation id="1746531169546376413">0 gráður</translation> -<translation id="17513872634828108">Opnir flipar</translation> <translation id="1752021286346845558">Pósthólf 8</translation> <translation id="1753068535428855445">Stefnumót og einkamál</translation> <translation id="1753706481035618306">Síðunúmer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prófaðu að keyra Windows-netgreiningu<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Nánar um huliðsstillingu í Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Opnir flipar birtast hér</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ýttu á Tab og svo á Enter til að stjórna upplýsingum, persónuvernd og öryggi á Google reikningnum þínum</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, margar aðgerðir eru í boði, ýttu á Tab til að fletta í gegnum þær</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Hópur</translation> <translation id="2576880857912732701">Hnappur til að stjórna öryggisstillingum, ýttu á Enter til að stjórna öruggri vefskoðun í stillingum Chrome</translation> <translation id="2586657967955657006">Klippiborð</translation> -<translation id="2587730715158995865">Frá <ph name="ARTICLE_PUBLISHER" />. Lestu þessa grein og <ph name="OTHER_ARTICLE_COUNT" /> í viðbót.</translation> <translation id="2587841377698384444">Auðkenni forritaskila möppu:</translation> <translation id="2594318783181750337">Skyndivefyfirlit:</translation> <translation id="2595719060046994702">Þessu tæki og þessum reikningi er ekki stjórnað af fyrirtæki eða félagi.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Rangt aðgangsorð</translation> <translation id="5051305769747448211">Uppistand</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Losaðu um pláss (<ph name="DISK_SPACE_SIZE" />) í tækinu þínu til að senda þessa skrá með nærdeilingu}one{Losaðu um pláss (<ph name="DISK_SPACE_SIZE" />) í tækinu þínu til að senda þessa skrá með nærdeilingu}other{Losaðu um pláss (<ph name="DISK_SPACE_SIZE" />) í tækinu þínu til að senda þessar skrár með nærdeilingu}}</translation> -<translation id="5056549851600133418">Greinar fyrir þig</translation> <translation id="5060483733937416656">Þú valdir að staðfesta með Windows Hello á vefsvæðum sem nota <ph name="PROVIDER_ORIGIN" />. Þessi þjónustuaðili kann að hafa vistað upplýsingar um greiðslumátann þinn, sem þú getur <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Áttirðu við <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Prentferill</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Hunsa</translation> <translation id="5239623327352565343">Staðsetning leyfð</translation> <translation id="5242889659037569123">Farangur og aukahlutir fyrir ferðalög</translation> +<translation id="5244732203286792411">Hleður... + Þetta gæti tekið smástund.</translation> <translation id="5250209940322997802">„Tengjast neti“</translation> <translation id="52517543715119994">Kynntu þér eiginleika Chrome</translation> <translation id="5251803541071282808">Skýið</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Pósthólf 7</translation> <translation id="5541546772353173584">Bæta við netfangi</translation> <translation id="5543722831081909240">180 gráður</translation> -<translation id="5545756402275714221">Greinar fyrir þig</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome athugar aðgangsorðin þín reglulega og ber þau saman við lista sem hafa verið birtir á netinu. Meðan á þessu stendur eru aðgangsorðin þín og notandanöfn dulkóðuð svo enginn geti lesið þau, þ.m.t. ekki Google.</translation> <translation id="5556459405103347317">Endurhlaða</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Ljósgrænblár</translation> <translation id="6272088941196661550">Haltu ferðinni áfram til að sjá viðkomandi virkni í Chrome ferlinum</translation> <translation id="6272383483618007430">Google uppfærslur</translation> -<translation id="6276112860590028508">Síður úr leslistanum þínum birtast hér</translation> <translation id="627746635834430766">Til að greiða hraðar næst geturðu vistað kortið og heimilisfang greiðanda á Google reikningnum.</translation> <translation id="6279183038361895380">Ýttu á |<ph name="ACCELERATOR" />| til að sýna bendilinn</translation> <translation id="6280223929691119688">Ekki er hægt að senda á þetta heimilisfang. Veldu annað heimilisfang.</translation> <translation id="6284292079994426700">26 x 38 to.</translation> <translation id="6285507000506177184">Hnappur til að stjórna niðurhali í Chrome, ýttu á Enter til að stjórna skrám sem þú hefur sótt í Chrome</translation> <translation id="6289939620939689042">Síðulitur</translation> -<translation id="6290238015253830360">Tillögur að greinum birtast hér</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Vistar...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Sígilt rokk og gullaldartónlist</translation> <translation id="769721561045429135">Eins og er ertu með kort sem aðeins er hægt að nota í þessu tæki Smelltu á „Halda áfram“ til að yfirfara kort.</translation> <translation id="7698864304447945242">Uppfæra Google Play þjónustur fyrir AR?</translation> -<translation id="7699293099605015246">Greinar eru ekki í boði núna</translation> <translation id="7701040980221191251">Ekkert</translation> <translation id="7701544340847569275">Uppfærslu lokið með villum</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Halda áfram á <ph name="SITE" /> (ekki öruggt)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb index b95eaa8..4124d51 100644 --- a/components/strings/components_strings_it.xtb +++ b/components/strings/components_strings_it.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Hai inserito la password su un sito non gestito dalla tua organizzazione. Per proteggere il tuo account, non riutilizzare la password su altri siti e app.</translation> <translation id="1257553931232494454">livelli di zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, premi Tab e poi Invio per gestire le tue impostazioni di Chrome</translation> -<translation id="1263231323834454256">Elenco di lettura</translation> <translation id="1264309058268477500">Alterno</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Sblocco dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Vassoio 8</translation> <translation id="1530707389502320859">Il sito che stai provando a visitare risulta contraffatto. A volte i malintenzionati imitano i siti modificando leggermente e in modo poco evidente l'URL.</translation> <translation id="1532118530259321453">Questa pagina dice</translation> -<translation id="153384715582417236">Per il momento è tutto</translation> <translation id="1536390784834419204">Traduci pagina</translation> <translation id="1539840569003678498">Data invio ultimo rapporto:</translation> <translation id="1549470594296187301">JavaScript deve essere attivato per utilizzare questa funzione.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Il browser in uso è gestito</translation> <translation id="1746113442205726301">Spostamento Y immagine</translation> <translation id="1746531169546376413">0 gradi</translation> -<translation id="17513872634828108">Schede aperte</translation> <translation id="1752021286346845558">Mailbox 8</translation> <translation id="1753068535428855445">Appuntamenti e annunci personali</translation> <translation id="1753706481035618306">Numero di pagina</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prova a eseguire lo strumento Diagnostica di rete Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Scopri di più sulla modalità di navigazione in incognito in Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Le tue schede aperte vengono visualizzate qui</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, premi Tab e poi Invio per gestire le tue informazioni, la privacy e la sicurezza nel tuo Account Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, sono disponibili diverse azioni; premi Tab per scorrerle</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Gruppo</translation> <translation id="2576880857912732701">Pulsante Gestisci le impostazioni di sicurezza, premi Invio per gestire la funzionalità Navigazione sicura e altre opzioni nelle impostazioni di Chrome</translation> <translation id="2586657967955657006">Appunti</translation> -<translation id="2587730715158995865">Da <ph name="ARTICLE_PUBLISHER" />. Leggi questo e altri <ph name="OTHER_ARTICLE_COUNT" /> articoli.</translation> <translation id="2587841377698384444">ID API Directory:</translation> <translation id="2594318783181750337">Visualizzazione web rapida:</translation> <translation id="2595719060046994702">Il dispositivo e l'account in uso non sono gestiti da un'azienda o da un'altra organizzazione.</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">Password non corretta</translation> <translation id="5051305769747448211">Commedie dal vivo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Per inviare questo file tramite Condivisione nelle vicinanze, libera spazio (<ph name="DISK_SPACE_SIZE" />) sul tuo dispositivo}other{Per inviare questi file tramite Condivisione nelle vicinanze, libera spazio (<ph name="DISK_SPACE_SIZE" />) sul tuo dispositivo}}</translation> -<translation id="5056549851600133418">Articoli per te</translation> <translation id="5060483733937416656">Hai scelto di eseguire la verifica con Windows Hello sui siti web che utilizzano <ph name="PROVIDER_ORIGIN" />. Questo fornitore potrebbe aver memorizzato informazioni sul tuo metodo di pagamento, che puoi <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Forse cercavi: <ph name="LOOKALIKE_DOMAIN" /></translation> <translation id="5066056036849835175">Cronologia di stampa</translation> @@ -1856,7 +1850,6 @@ <translation id="5541086400771735334">Mailbox 7</translation> <translation id="5541546772353173584">Aggiungi email</translation> <translation id="5543722831081909240">180 gradi</translation> -<translation id="5545756402275714221">Articoli per te</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome confronta periodicamente le tue password con gli elenchi pubblicati online. Durante questa operazione, le tue password e i tuoi nomi utente vengono criptati, quindi non possono essere letti da nessuno, Google compresa.</translation> <translation id="5556459405103347317">Ricarica</translation> @@ -2137,14 +2130,12 @@ <translation id="6266934640124581640">Verde acqua</translation> <translation id="6272088941196661550">Riprendi il percorso per visualizzare le attività pertinenti nella tua cronologia di Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Le pagine del tuo elenco di lettura vengono visualizzate qui</translation> <translation id="627746635834430766">Per pagare più velocemente la prossima volta, salva la carta e l'indirizzo di fatturazione sul tuo Account Google.</translation> <translation id="6279183038361895380">Premi |<ph name="ACCELERATOR" />| per mostrare il puntatore</translation> <translation id="6280223929691119688">Impossibile consegnare all'indirizzo specificato. Seleziona un indirizzo diverso.</translation> <translation id="6284292079994426700">66,0 × 96,5 cm</translation> <translation id="6285507000506177184">Pulsante Gestisci i download in Chrome, premi Invio per gestire i file che hai scaricato in Chrome</translation> <translation id="6289939620939689042">Colore pagina</translation> -<translation id="6290238015253830360">Gli articoli suggeriti vengono visualizzati qui</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Salvataggio in corso...</translation> @@ -2744,7 +2735,6 @@ <translation id="7696089921647603491">Rock classico e oldies</translation> <translation id="769721561045429135">Al momento hai carte che possono essere utilizzate solo su questo dispositivo. Fai clic su Continua per controllare le carte.</translation> <translation id="7698864304447945242">Vuoi aggiornare Google Play Services per AR?</translation> -<translation id="7699293099605015246">Gli articoli non sono al momento disponibili</translation> <translation id="7701040980221191251">Nulla</translation> <translation id="7701544340847569275">Aggiornamento completato con errori</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Procedi su <ph name="SITE" /> (non sicuro)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb index bbc541f..0756caf54 100644 --- a/components/strings/components_strings_iw.xtb +++ b/components/strings/components_strings_iw.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">הזנת את הסיסמה באתר שאינו מנוהל על-ידי הארגון שלך. כדי להגן על החשבון, אין לעשות שימוש חוזר בסיסמה באפליקציות ובאתרים אחרים.</translation> <translation id="1257553931232494454">רמות מרחק מהתצוגה</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, מקישים על Tab ואז על Enter כדי לנהל את הגדרות Chrome</translation> -<translation id="1263231323834454256">רשימת קריאה</translation> <translation id="1264309058268477500">חלופי</translation> <translation id="1264974993859112054">ספורט</translation> <translation id="1266469291454105242">ביטול נעילת המכשיר</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">מגש 8</translation> <translation id="1530707389502320859">האתר שניסית לבקר בו נראה כמו אתר מזויף. תוקפים שמחקים אתרים לפעמים משתמשים בכתובת ה-URL של האתר המקורי ועושים בה שינויים קלים ביותר כדי שיהיה קשה להבחין בהבדל.</translation> <translation id="1532118530259321453">הדף הזה אומר</translation> -<translation id="153384715582417236">זה הכול בינתיים</translation> <translation id="1536390784834419204">תרגום הדף</translation> <translation id="1539840569003678498">הדוח נשלח:</translation> <translation id="1549470594296187301">JavaScript צריך להיות מופעל כדי להשתמש בתכונה זו.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">הדפדפן שלך מנוהל</translation> <translation id="1746113442205726301">הזזת תמונה על ציר Y</translation> <translation id="1746531169546376413">0 מעלות</translation> -<translation id="17513872634828108">כרטיסיות פתוחות</translation> <translation id="1752021286346845558">תיבת דואר 8</translation> <translation id="1753068535428855445">שידוכים והכרויות</translation> <translation id="1753706481035618306">מספר דף</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />יש לנסות להפעיל את אבחון הרשת של Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />מידע נוסף על מצב פרטי ב-Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">כאן מופיעות הכרטיסיות שפתחת</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, צריך להקיש על Tab ואז על Enter כדי לנהל את המידע, הפרטיות והאבטחה בחשבון Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ניתן לבצע כמה פעולות, יש להקיש על Tab כדי לעבור ביניהן</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">קבוצה</translation> <translation id="2576880857912732701">הלחצן 'ניהול הגדרות האבטחה', יש להקיש על Enter כדי לנהל את הגלישה הבטוחה ועוד בהגדרות Chrome</translation> <translation id="2586657967955657006">לוח</translation> -<translation id="2587730715158995865">מאת <ph name="ARTICLE_PUBLISHER" />. לקריאת כתבה זו ועוד <ph name="OTHER_ARTICLE_COUNT" /> כתבות נוספות.</translation> <translation id="2587841377698384444">מזהה Directory API:</translation> <translation id="2594318783181750337">תצוגה מהירה באינטרנט:</translation> <translation id="2595719060046994702">המכשיר והחשבון לא מנוהלים על-ידי חברה או ארגון אחר.</translation> @@ -1668,7 +1663,6 @@ <translation id="5045550434625856497">סיסמה שגויה</translation> <translation id="5051305769747448211">מופעי קומדיה</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{כדי לשלוח את הקובץ הזה באמצעות 'שיתוף בקרבת מקום', צריך לפנות שטח אחסון (<ph name="DISK_SPACE_SIZE" />) במכשיר}one{כדי לשלוח את הקבצים האלה באמצעות 'שיתוף בקרבת מקום', צריך לפנות שטח אחסון (<ph name="DISK_SPACE_SIZE" />) במכשיר}two{כדי לשלוח את הקבצים האלה באמצעות 'שיתוף בקרבת מקום', צריך לפנות שטח אחסון (<ph name="DISK_SPACE_SIZE" />) במכשיר}other{כדי לשלוח את הקבצים האלה באמצעות 'שיתוף בקרבת מקום', צריך לפנות שטח אחסון (<ph name="DISK_SPACE_SIZE" />) במכשיר}}</translation> -<translation id="5056549851600133418">מאמרים שעשויים לעניין אותך</translation> <translation id="5060483733937416656">בחרת לבצע אימות באמצעות Windows Hello באתרים שמשתמשים ב-<ph name="PROVIDER_ORIGIN" />. יכול להיות שהספק הזה אחסן מידע על אמצעי התשלום שלך, שאותו אפשר <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">האם התכוונת ל-<ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">היסטוריית הדפסות</translation> @@ -1866,7 +1860,6 @@ <translation id="5541086400771735334">תיבת דואר 7</translation> <translation id="5541546772353173584">הוספת כתובת אימייל</translation> <translation id="5543722831081909240">180 מעלות</translation> -<translation id="5545756402275714221">מאמרים שעשויים לעניין אותך</translation> <translation id="5551890439174915351">100x200 מ"מ</translation> <translation id="5552137475244467770">מערכת Chrome בודקת מדי פעם את הסיסמאות שלך ומשווה אותן לרשימות שהתפרסמו באינטרנט. כשהפעולה הזו מבוצעת, הסיסמאות ושמות המשתמש מוצפנים, כך שאיש לא יוכל לקרוא אותם, כולל Google.</translation> <translation id="5556459405103347317">טעינה מחדש</translation> @@ -2148,14 +2141,12 @@ <translation id="6266934640124581640">כחול-ירקרק בהיר</translation> <translation id="6272088941196661550">חזרה לתהליך כדי להציג את הפעילות הרלוונטית בהיסטוריה ב-Chrome</translation> <translation id="6272383483618007430">עדכוני Google</translation> -<translation id="6276112860590028508">דפים מרשימת הקריאה שלך מופיעים כאן</translation> <translation id="627746635834430766">כדי לשלם מהר יותר בפעם הבאה, אפשר לשמור בחשבון Google את פרטי הכרטיס ואת הכתובת לחיוב.</translation> <translation id="6279183038361895380">יש להקיש על |<ph name="ACCELERATOR" />| כדי להציג את הסמן</translation> <translation id="6280223929691119688">לא ניתן לבצע מסירה בכתובת זו. עליך לבחור כתובת אחרת.</translation> <translation id="6284292079994426700">26x38 אינץ'</translation> <translation id="6285507000506177184">הלחצן לניהול הורדות ב-Chrome, מקישים על Enter לניהול הקבצים שהורדת ב-Chrome</translation> <translation id="6289939620939689042">צבע הדף</translation> -<translation id="6290238015253830360">הצעות של מאמרים עבורך מופיעות כאן</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">בתהליך שמירה...</translation> @@ -2755,7 +2746,6 @@ <translation id="7696089921647603491">רוק קלאסי ואולדיז</translation> <translation id="769721561045429135">יש לך כרגע כרטיסים שאפשר להשתמש בהם רק במכשיר הזה. כדי לעיין בכרטיסים יש ללחוץ על 'המשך'.</translation> <translation id="7698864304447945242">לעדכן את Google Play Services למציאות רבודה?</translation> -<translation id="7699293099605015246">לא ניתן להציג כרגע מאמרים</translation> <translation id="7701040980221191251">אין</translation> <translation id="7701544340847569275">העדכון הושלם עם שגיאות</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />המשך אל <ph name="SITE" /> (לא בטוח)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index 8ea7b80..8da0ce0 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">組織が管理していないサイトでパスワードを入力しました。アカウントを保護するには、他のアプリやサイトでパスワードを再使用しないでください。</translation> <translation id="1257553931232494454">ズームレベル</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。Tab、Enter キーの順に押すと、Chrome の設定を管理します</translation> -<translation id="1263231323834454256">リーディング リスト</translation> <translation id="1264309058268477500">代替</translation> <translation id="1264974993859112054">スポーツ</translation> <translation id="1266469291454105242">デバイスのロック解除</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">トレイ 8</translation> <translation id="1530707389502320859">アクセスしようとしたサイトは偽装サイトのようです。不正なユーザーが URL のごく一部を一目ではわからないように改変してサイトを偽装する場合があります。</translation> <translation id="1532118530259321453">このページの内容</translation> -<translation id="153384715582417236">現在、コンテンツはありません</translation> <translation id="1536390784834419204">ページを翻訳</translation> <translation id="1539840569003678498">レポートの送信日時:</translation> <translation id="1549470594296187301">この機能を使用するには JavaScript を有効にする必要があります。</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">ご使用のブラウザは管理されています</translation> <translation id="1746113442205726301">画像の Y 軸移動</translation> <translation id="1746531169546376413">0°</translation> -<translation id="17513872634828108">開いているタブ</translation> <translation id="1752021286346845558">用紙受け 8</translation> <translation id="1753068535428855445">出会い</translation> <translation id="1753706481035618306">ページ番号</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows ネットワーク診断ツールを実行してみてください<ph name="END_LINK" />。</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium のシークレット モードについて<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">最近開いたタブがここに表示されます</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。Tab キー、Enter キーの順に押すと、Google アカウントで情報、プライバシー、セキュリティを管理します</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" /> です。複数の操作が可能で、Tab キーを押すと操作が切り替わります</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">グループ化</translation> <translation id="2576880857912732701">[セキュリティ設定を管理する] ボタンです。Enter キーを押すと、Chrome の設定でセーフ ブラウジングなどを管理できます</translation> <translation id="2586657967955657006">クリップボード</translation> -<translation id="2587730715158995865">公開元: <ph name="ARTICLE_PUBLISHER" />。この記事と他 <ph name="OTHER_ARTICLE_COUNT" /> 件の記事を読むことができます。</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">高速ウェブビュー:</translation> <translation id="2595719060046994702">このデバイスとアカウントは、会社またはその他の組織によって管理されていません。</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">パスワードが正しくありません</translation> <translation id="5051305769747448211">お笑いライブ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ニアバイシェアを使用してこのファイルを送信するには、デバイスの空き容量を増やしてください(<ph name="DISK_SPACE_SIZE" /> 必要です)}other{ニアバイシェアを使用してこれらのファイルを送信するには、デバイスの空き容量を増やしてください(<ph name="DISK_SPACE_SIZE" /> 必要です)}}</translation> -<translation id="5056549851600133418">おすすめの記事</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> を使用するウェブサイトで Windows Hello による確認を行うよう選択しています。このプロバイダにお支払い方法に関する情報が保存されている可能性があります。その場合、<ph name="LINK_TEXT" /> を行うことができます。</translation> <translation id="5061227663725596739">もしかして: <ph name="LOOKALIKE_DOMAIN" /></translation> <translation id="5066056036849835175">印刷履歴</translation> @@ -1861,7 +1855,6 @@ <translation id="5541086400771735334">用紙受け 7</translation> <translation id="5541546772353173584">メールの追加</translation> <translation id="5543722831081909240">180°</translation> -<translation id="5545756402275714221">おすすめの記事</translation> <translation id="5551890439174915351">100x200 mm</translation> <translation id="5552137475244467770">Chrome では、定期的にパスワードをオンライン上の公開リストと照合し、確認しています。その際、パスワードとユーザー名は Google を含め誰も読み取ることができないよう暗号化されます。</translation> <translation id="5556459405103347317">再読み込み</translation> @@ -2143,14 +2136,12 @@ <translation id="6266934640124581640">ライトティール</translation> <translation id="6272088941196661550">ジャーニーを再開して、Chrome 履歴で関連するアクティビティを確認します</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">リーディング リストに登録されたページがここに表示されます</translation> <translation id="627746635834430766">カードと請求先住所を Google アカウントに保存すると、次回のお支払いが簡単になります。</translation> <translation id="6279183038361895380">カーソルを表示するには |<ph name="ACCELERATOR" />| を押します</translation> <translation id="6280223929691119688">この住所には配達できません。別の住所を選択してください。</translation> <translation id="6284292079994426700">26x38 インチ</translation> <translation id="6285507000506177184">[Chrome でのダウンロードを管理] ボタンです。Enter キーを押すと、Chrome でダウンロードしたファイルを管理できます</translation> <translation id="6289939620939689042">ページの色</translation> -<translation id="6290238015253830360">おすすめの記事がここに表示されます</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">保存しています...</translation> @@ -2750,7 +2741,6 @@ <translation id="7696089921647603491">クラシック ロック、オールディーズ</translation> <translation id="769721561045429135">現在、このデバイスでのみ使用できるカードがあります。カードを確認するには [続行] をクリックしてください。</translation> <translation id="7698864304447945242">Google Play 開発者サービス(AR)を更新しますか?</translation> -<translation id="7699293099605015246">記事は現在利用できません</translation> <translation id="7701040980221191251">なし</translation> <translation id="7701544340847569275">更新は完了しましたが、エラーが発生しました</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> にアクセスする(安全ではありません)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ka.xtb b/components/strings/components_strings_ka.xtb index f2aed61..577f9b6 100644 --- a/components/strings/components_strings_ka.xtb +++ b/components/strings/components_strings_ka.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">თქვენ შეიყვანეთ პაროლი საიტზე, რომელსაც არ მართავს თქვენი ორგანიზაცია. თქვენი ანგარიშის დასაცავად არ გამოიყენოთ იგივე პაროლი სხვა აპებსა და საიტებზე.</translation> <translation id="1257553931232494454">მასშტაბირების დონეები</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome პარამეტრების სამართავად დააჭირეთ კლავიშს Tab, შემდეგ კი Enter-ს</translation> -<translation id="1263231323834454256">საკითხავი სია</translation> <translation id="1264309058268477500">ალტერნატიული</translation> <translation id="1264974993859112054">სპორტი</translation> <translation id="1266469291454105242">მოწყობილობის განბლოკვის მეთოდი</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ლანგარი 8</translation> <translation id="1530707389502320859">როგორც ჩანს, საიტი, რომლის მონახულებასაც ეს-ესაა ცდილობდით, ყალბია. თავდამსხმელები, ზოგჯერ, ახდენენ საიტების იმიტირებას URL-ში მცირე, რთულად შესამჩნევი ცვლილებების შეტანით.</translation> <translation id="1532118530259321453">ეს გვერდი იუწყება:</translation> -<translation id="153384715582417236">ამ დროისთვის სულ ეს არის</translation> <translation id="1536390784834419204">გვერდის თარგმნა</translation> <translation id="1539840569003678498">მოხსენება გაიგზავნა:</translation> <translation id="1549470594296187301">ამ ფუნქციის გამოსაყენებლად, JavaScript ჩართული უნდა იყოს.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">თქვენი ბრაუზერი მართულია</translation> <translation id="1746113442205726301">სურათის წანაცვლება Y ღერძზე</translation> <translation id="1746531169546376413">0 გრადუსი</translation> -<translation id="17513872634828108">გახსნილი ჩანართები</translation> <translation id="1752021286346845558">საფოსტო ყუთი 8</translation> <translation id="1753068535428855445">პაემნები და გაცნობა</translation> <translation id="1753706481035618306">გვერდის ნომერი</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />სცადეთ Windows-ის ქსელის დიაგნოსტიკის ხელსაწყოს გაშვება<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი ინკოგნიტო რეჟიმის შესახებ Chromium-ში<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">აქ გამოჩნდება თქვენი გახსნილი ჩანართები</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, თქვენს Google ანგარიშში თქვენი ინფორმაციის, კონფიდენციალურობისა და უსაფრთხოების სამართავად დააჭირეთ კლავიშს Tab, შემდეგ კი Enter-ს</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, შესაძლებელია რამდენიმე მოქმედება, დააჭირეთ Tab-ს მათ სანახავად</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">ჯგუფი</translation> <translation id="2576880857912732701">უსაფრთხოების პარამეტრების მართვის ღილაკი, Safe Browsing-ისა და სხვა ფუნქციების Chrome-ის პარამეტრებიდან სამართავად დააჭირეთ კლავიშს Enter</translation> <translation id="2586657967955657006">გაცვლის ბუფერი</translation> -<translation id="2587730715158995865">წყარო: <ph name="ARTICLE_PUBLISHER" />. წაიკითხეთ ეს და <ph name="OTHER_ARTICLE_COUNT" /> სხვა სტატია.</translation> <translation id="2587841377698384444">კატალოგის API-ის ID:</translation> <translation id="2594318783181750337">სწრაფი ვებ-ხედი:</translation> <translation id="2595719060046994702">ამ მოწყობილობასა და ანგარიშს არ მართავს კომპანია თუ სხვა ტიპის ორგანიზაცია.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">არასწორი პაროლი</translation> <translation id="5051305769747448211">ლაივკომედია</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ეს ფაილი მახლობლად გაზიარების მეშვეობით რომ გაგზავნოთ, გაათავისუფლეთ სივრცე (<ph name="DISK_SPACE_SIZE" />) თქვენს მოწყობილობაზე}other{ეს ფაილები მახლობლად გაზიარების მეშვეობით რომ გაგზავნოთ, გაათავისუფლეთ სივრცე (<ph name="DISK_SPACE_SIZE" />) თქვენს მოწყობილობაზე}}</translation> -<translation id="5056549851600133418">თქვენთვის განკუთვნილი სტატიები</translation> <translation id="5060483733937416656">თქვენ აირჩიეთ Windows Hello-ს მეშვეობით დადასტურება ვებსაიტებზე, რომელთა მიერაც გამოიყენება <ph name="PROVIDER_ORIGIN" />. ამ პროვაიდერს შეიძლებოდა შეენახა ინფორმაცია თქვენი გადახდის მეთოდის შესახებ. სურვილისამებრ, შეგიძლიათ <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> ხომ არ იგულისხმეთ?</translation> <translation id="5066056036849835175">ბეჭდვის ისტორია</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">გაუქმება</translation> <translation id="5239623327352565343">მდებარეობაზე წვდომა დაშვებულია</translation> <translation id="5242889659037569123">სამგზავრო ჩანთები და სამოგზაურო აქსესუარები</translation> +<translation id="5244732203286792411">მიმდინარეობს ჩატვირთვა... + ამას შეიძლება ერთი წუთი დასჭირდეს.</translation> <translation id="5250209940322997802">„დაუკავშირდით ქსელს“</translation> <translation id="52517543715119994">Chrome-ის ფუნქციების შესახებ</translation> <translation id="5251803541071282808">ღრუბლოვანი</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">საფოსტო ყუთი 7</translation> <translation id="5541546772353173584">დაამატეთ ელფოსტის მისამართი</translation> <translation id="5543722831081909240">180 გრადუსი</translation> -<translation id="5545756402275714221">თქვენთვის განკუთვნილი სტატიები</translation> <translation id="5551890439174915351">100 x 200 მმ</translation> <translation id="5552137475244467770">Chrome პერიოდულად შეამოწმებს თქვენს პაროლებს ვებში გამოქვეყნებულ სიებში. აღნიშნული ქმედებისას თქვენი პაროლები და მომხმარებლის სახელები დაშიფრული იქნება, რაც ნიშნავს, რომ მათ ვერავინ (მათ შორის, ვერც Google) წაიკითხავს.</translation> <translation id="5556459405103347317">ხელახლა ჩატვირთვა</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">ღია ზურმუხტისფერი</translation> <translation id="6272088941196661550">გააგრძელეთ თქვენი პროცესი, თქვენს Chrome-ის ისტორიაში შესაბამისი აქტივობა რომ იხილოთ</translation> <translation id="6272383483618007430">Google განახლება</translation> -<translation id="6276112860590028508">აქ გამოჩნდება გვერდები თქვენი საკითხავი სიიდან</translation> <translation id="627746635834430766">შემდგომი გადახდების დასაჩქარებლად შეგიძლიათ შეინახოთ თქვენი ბარათის მონაცემები და ბილინგის მისამართი თქვენს Google ანგარიშში.</translation> <translation id="6279183038361895380">კურსორის საჩვენებლად, დააჭირეთ კლავიშზე |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">ამ მისამართზე მიწოდება ვერ მოხერხდება. აირჩიეთ სხვა მისამართი.</translation> <translation id="6284292079994426700">26 x 38 დუიმი</translation> <translation id="6285507000506177184">Chrome-ის მეშვეობით ჩამოტვირთული ფაილების მართვის ღილაკი, Chrome-ის მეშვეობით ჩამოტვირთული ფაილების სამართავად დააჭირეთ კლავიშს Enter</translation> <translation id="6289939620939689042">გვერდის ფერი</translation> -<translation id="6290238015253830360">აქ გამოჩნდება თქვენთვის შემოთავაზებული სტატიები</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">ბარათის დადასტურების კოდი (CVC):</translation> <translation id="6295855836753816081">მიმდინარეობს შენახვა…</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">კლასიკური როკი და ძველი ჰიტები</translation> <translation id="769721561045429135">ამჟამად თქვენ გაქვთ ბარათები, რომელთა გამოყენებაც შეგიძლიათ მხოლოდ ამ მოწყობილობაზე. ბარათების გადასახედად დააწკაპუნეთ „გაგრძელებაზე“.</translation> <translation id="7698864304447945242">გსურთ, განაახლოთ Google Play Services AR-ისთვის?</translation> -<translation id="7699293099605015246">სტატიები ამჟამად მიუწვდომელია</translation> <translation id="7701040980221191251">არცერთი</translation> <translation id="7701544340847569275">განახლება დასრულდა შეცდომებით</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />გადასვლა <ph name="SITE" />-ზე (არასაიმედო)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_kk.xtb b/components/strings/components_strings_kk.xtb index 9e039969..a7722ae9 100644 --- a/components/strings/components_strings_kk.xtb +++ b/components/strings/components_strings_kk.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Құпия сөзіңізді ұйымыңыз басқармайтын сайтта енгіздіңіз. Аккаунтты қорғау үшін құпия сөзді басқа қолданбалар мен сайттарда қолданбаңыз.</translation> <translation id="1257553931232494454">масштабтау деңгейлері</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome параметрлерін басқару үшін Tab, содан кейін Enter пернесін басыңыз.</translation> -<translation id="1263231323834454256">Оқу тізімі</translation> <translation id="1264309058268477500">Басқа</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Құрылғының құлпын ашу</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8-науа</translation> <translation id="1530707389502320859">Жаңа ғана кірген сайт жалған сияқты. Кейде хакерлер белгілі бір сайттарды көшіріп, олардың URL сілтемесіне сіз байқамайтын өзгерістер енгізіп қояды.</translation> <translation id="1532118530259321453">Бұл беттегі сұрау</translation> -<translation id="153384715582417236">Әзірге бары осы</translation> <translation id="1536390784834419204">Бетті аудару</translation> <translation id="1539840569003678498">Есеп жіберілді:</translation> <translation id="1549470594296187301">Бұл мүмкіндікті пайдалану үшін JavaScript қосылуы керек.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Браузеріңіз басқарылады.</translation> <translation id="1746113442205726301">Кескіннің Y осі бойынша ығысуы</translation> <translation id="1746531169546376413">0 градус</translation> -<translation id="17513872634828108">Ашық қойындылар</translation> <translation id="1752021286346845558">8-ші пошта жәшігі</translation> <translation id="1753068535428855445">Танысу және оған қатысты хабарландырулар</translation> <translation id="1753706481035618306">Бет нөмірі</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows Network Diagnostics құралын пайдаланып көріңіз<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium браузеріндегі инкогнито режимі туралы толығырақ<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Ашық қойынды осы жерден шығады</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google аккаунтыңыздағы ақпаратты, құпиялықты және қауіпсіздікті басқару үшін Tab, содан кейін Enter пернесін басыңыз.</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Бірнеше әрекет қолжетімді, оларды қарап шығу үшін Tab пернесін басыңыз.</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Виртуалдық карта мәліметтері</translation> <translation id="1803020234906945288">Дұрыс тамақтану</translation> <translation id="1803351196216024260">Сайттар микрофоныңызды қолдануға рұқсат сұрай алады</translation> +<translation id="1806174020048213474">Бұл қолданба Wi-Fi тіркелу деректерін орнату рұқсатын сұрауда. Реттеуден кейін, <ph name="DEVICE_TYPE" /> құрылғысы қатысатын Wi-Fi желілеріне автоматты түрде қосылады. Осы тіркелу деректерін өшіру үшін қолданбаны жойыңыз.</translation> <translation id="1807246157184219062">Ашық</translation> <translation id="1807528111851433570">Бастапқы парақ</translation> <translation id="180991881384371158">CVC коды картаңыздың артқы жағында. Бұл – қолтаңба ұясының жоғарғы оң жағындағы соңғы 3 цифр.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Топ</translation> <translation id="2576880857912732701">"Қауіпсіздік параметрлерін басқару" түймесі. Chrome параметрлерінен Safe Browsing қорғанысын және т.б. басқару үшін Enter пернесін басыңыз.</translation> <translation id="2586657967955657006">Буфер</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> ұсынады. Осы және басқа <ph name="OTHER_ARTICLE_COUNT" /> мақаланы оқыңыз.</translation> <translation id="2587841377698384444">Каталогтің API идентификаторы:</translation> <translation id="2594318783181750337">Жылдам веб-көрініс:</translation> <translation id="2595719060046994702">Құрылғы мен аккаунтты компания не басқа ұйым басқармайды.</translation> @@ -1340,6 +1336,7 @@ <translation id="4270541775497538019">6-жинастырушы</translation> <translation id="4274173425554582601">Компьютер және электроника</translation> <translation id="4275830172053184480">Құрылғыңызды қайта іске қосу</translation> +<translation id="4276974990916607331">Жоқ, рақмет</translation> <translation id="4277028893293644418">Құпия сөзді қайта орнату</translation> <translation id="4277937682389409325">Жергілікті мекенжай</translation> <translation id="4278390842282768270">Рұқсат етілген</translation> @@ -1663,7 +1660,6 @@ <translation id="5045550434625856497">Құпия сөз дұрыс емес</translation> <translation id="5051305769747448211">Жанды комедия</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Бұл файлды Nearby Share арқылы жіберу үшін құрылғыңыздан орын (<ph name="DISK_SPACE_SIZE" />) босатыңыз.}other{Бұл файлдарды Nearby Share арқылы жіберу үшін құрылғыңыздан орын (<ph name="DISK_SPACE_SIZE" />) босатыңыз.}}</translation> -<translation id="5056549851600133418">Сізге арналған мақалалар</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> қызметін пайдаланатын веб-сайттарда Windows Hello арқылы растау нұсқасын таңдадыңыз. Бұл провайдерде төлеу әдісіңіз туралы сақталған ақпарат болуы мүмкін, оны <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> деп жазғыңыз келді ме?</translation> <translation id="5066056036849835175">Басып шығару тарихы</translation> @@ -1701,6 +1697,7 @@ <translation id="5129534298163637277">Растау диалогтік терезесі</translation> <translation id="5135404736266831032">Мекенжайларды басқару...</translation> <translation id="5136841603454277753">Дұрыс код енгізіңіз.</translation> +<translation id="5137761395480718572">Бұл қолданба Wi-Fi тіркелу деректерін орнату рұқсатын сұрауда. Реттеуден кейін, <ph name="DEVICE_TYPE" /> құрылғысы қатысатын Wi-Fi желілеріне автоматты түрде қосылады. Осы тіркелу деректерін өшіру үшін қолданбаны жойыңыз. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Қазір виртуалдық карта қолжетімсіз. Банкіңізге хабарласыңыз.</translation> <translation id="5138227688689900538">Жию</translation> <translation id="5145883236150621069">Қате коды саясат жауабында көрсетіледі</translation> @@ -1757,6 +1754,7 @@ <translation id="5273881944177595304">Веб-қолданбалар және онлайн құралдар</translation> <translation id="5274025349362408263">Кітап және әдебиет</translation> <translation id="5279286380302340275">Жүктеп алынғандарды басқару</translation> +<translation id="5279453600310613955">Жоқ, рақмет</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Құжаттың сипаттары</translation> <translation id="528468243742722775">Соңы</translation> @@ -1860,7 +1858,6 @@ <translation id="5541086400771735334">7-ші пошта жәшігі</translation> <translation id="5541546772353173584">Электрондық пошта мекенжайын енгізу</translation> <translation id="5543722831081909240">180 градус</translation> -<translation id="5545756402275714221">Сізге арналған мақалалар</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Chrome браузері құпия сөздеріңізді онлайн жарияланған тізімдермен салыстырып тексереді. Тексеру кезінде құпия сөздер мен пайдаланушылар аты шифрланады. Сондықтан оларды ешқандай Google пайдаланушылары оқи алмайды.</translation> <translation id="5556459405103347317">Қайта жүктеу</translation> @@ -2142,14 +2139,12 @@ <translation id="6266934640124581640">Ашық көкшіл жасыл</translation> <translation id="6272088941196661550">Chrome тарихынан сәйкес сұрауларды көру үшін шарлауды жалғастыру</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Оқу тізіміндегі беттер осы жерге шығады</translation> <translation id="627746635834430766">Келесіде жылдамырақ төлеу үшін картаны және төлем мекенжайын Google аккаунтына сақтаңыз.</translation> <translation id="6279183038361895380">Курсорды көрсету үшін |<ph name="ACCELERATOR" />| басыңыз</translation> <translation id="6280223929691119688">Бұл мекенжайға жеткізілмейді. Басқа мекенжайды таңдаңыз.</translation> <translation id="6284292079994426700">26 x 38 дюйм</translation> <translation id="6285507000506177184">"Chrome браузерінде жүктеп алынған файлдарды басқару" түймесі. Chrome браузерінде жүктеп алған файлдарыңызды басқару үшін Enter пернесін басыңыз.</translation> <translation id="6289939620939689042">Бет түсі</translation> -<translation id="6290238015253830360">Сізге ұсынылған мақалалар осы жерге шығады.</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Сақталуда…</translation> @@ -2252,6 +2247,7 @@ <translation id="6529173248185917884">Жетінші орам</translation> <translation id="6529602333819889595">Жоюды &қайталау</translation> <translation id="6535751101619004418">Валюталар және шетел валютасы</translation> +<translation id="6536221421038631327"><ph name="DEVICE_TYPE" /> құрылғысынан Passpoint жазылымын өшіру әрекеті байланысты желілерді өшіреді. Жазылым жоспарыңызға өзгерістер жасау үшін "<ph name="FRIENDLY_NAME" />" дегенге хабарласыңыз. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Инвестициялық жарна қорлары</translation> <translation id="6545864417968258051">Bluetooth құрылғыларын іздеу</translation> <translation id="6547208576736763147">Сол жағын екі рет тесу</translation> @@ -2749,7 +2745,6 @@ <translation id="7696089921647603491">Классикалық рок және ескі туындылар</translation> <translation id="769721561045429135">Осы құрылғыда ғана пайдаланылатын карталар бар. Карталарды қарап шығу үшін "Жалғастыру" түймесін басыңыз.</translation> <translation id="7698864304447945242">Google Play Services for AR қолданбасын жаңарту керек пе?</translation> -<translation id="7699293099605015246">Дәл қазір мақалалар жоқ</translation> <translation id="7701040980221191251">Жоқ</translation> <translation id="7701544340847569275">Жаңарту қателермен аяқталды</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> сайтына өту (қауіпті)<ph name="END_LINK" /></translation> @@ -3348,6 +3343,7 @@ <translation id="9219103736887031265">Кескіндер</translation> <translation id="922152298093051471">Chrome-ды реттеу</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385"><ph name="APP_NAME" /> қолданбасының Wi-Fi желілерін реттеуіне мүмкіндік беру керек пе?</translation> <translation id="936602727769022409">Google аккаунтыңызға кіре алмай қалуыңыз мүмкін. Chromium құпия сөзді қазір өзгертуге кеңес береді. Сонан соң аккаунтқа кіру сұралады.</translation> <translation id="937457230470581909">Хайуанаттар бағы, аквариумдер мен қорықтар</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Пайдаланылатын деректер:<ph name="END_BOLD" /> жарнама тақырыптары браузерді қолдану тарихына, осы құрылғыда Chrome көмегімен кірген сайттар тізіміне негізделген.</translation>
diff --git a/components/strings/components_strings_km.xtb b/components/strings/components_strings_km.xtb index da4f93f..aef34d44f 100644 --- a/components/strings/components_strings_km.xtb +++ b/components/strings/components_strings_km.xtb
@@ -121,7 +121,6 @@ <translation id="1257286744552378071">អ្នកបានបញ្ចូលពាក្យសម្ងាត់របស់អ្នកនៅលើទំព័រដែលមិនបានគ្រប់គ្រងដោយស្ថាប័នរបស់អ្នក។ ដើម្បីការពារគណនីរបស់អ្នក សូមកុំប្រើពាក្យសម្ងាត់របស់អ្នកម្តងទៀតនៅលើកម្មវិធី និងទំព័រផ្សេង។</translation> <translation id="1257553931232494454">កម្រិតពង្រីកបង្រួម</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ចុច "Tab" រួចចុច "Enter" ដើម្បីគ្រប់គ្រងការកំណត់ Chrome របស់អ្នក</translation> -<translation id="1263231323834454256">បញ្ជីអាន</translation> <translation id="1264309058268477500">ជំនួស</translation> <translation id="1264974993859112054">កីឡា</translation> <translation id="1266469291454105242">ការដោះសោឧបករណ៍</translation> @@ -252,7 +251,6 @@ <translation id="1529789484829130889">ទម្រទី 8</translation> <translation id="1530707389502320859">គេហទំព័រដែលអ្នកទើបតែបានព្យាយាមចូលមើល ហាក់ដូចជាក្លែងក្លាយ។ ជួនកាល អ្នកវាយប្រហារក្លែងបន្លំគេហទំព័រដោយធ្វើការផ្លាស់ប្ដូរតិចតួច ដែលពិបាកសម្គាល់ចំពោះ URL ។</translation> <translation id="1532118530259321453">ទំព័រនេះនិយាយថា</translation> -<translation id="153384715582417236">មានតែប៉ុណ្ណឹងទេ</translation> <translation id="1536390784834419204">បកប្រែទំព័រ</translation> <translation id="1539840569003678498">បានផ្ញើរបាយការណ៍៖</translation> <translation id="1549470594296187301">ត្រូវបើកដំណើរការ JavaScript ដើម្បីប្រើលក្ខណៈពិសេសនេះ។</translation> @@ -349,7 +347,6 @@ <translation id="1745880797583122200">កម្មវិធីរុករកតាមអ៊ីនធឺណិតរបស់អ្នកត្រូវបានគ្រប់គ្រង</translation> <translation id="1746113442205726301">ការប្ដូររូបភាព Y</translation> <translation id="1746531169546376413">0 ដឺក្រេ</translation> -<translation id="17513872634828108">បើកផ្ទាំង</translation> <translation id="1752021286346845558">ប្រអប់សំបុត្រទី 8</translation> <translation id="1753068535428855445">ការណាត់ជួប និងការផ្សាយពាណិជ្ជកម្មផ្ទាល់ខ្លួន</translation> <translation id="1753706481035618306">លេខទំព័រ</translation> @@ -362,7 +359,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />សាកល្បងដំណើរការការវិភាគបណ្តាញ Windows<ph name="END_LINK" /></translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែមអំពីមុខងារឯកជននៅក្នុង Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ផ្ទាំងដែលអ្នកបានបើកបង្ហាញនៅទីនេះ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ចុច Tab រួចចុច Enter ដើម្បីគ្រប់គ្រងព័ត៌មាន ឯកជនភាព និងសុវត្ថិភាពរបស់អ្នកនៅក្នុងគណនី Google របស់អ្នក</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, អាចធ្វើសកម្មភាពបានច្រើន សូមចុច Tab ដើម្បីរុករកសកម្មភាពទាំងនោះ</translation> @@ -370,6 +366,7 @@ <translation id="1801812870656502108">ព័ត៌មានលម្អិតអំពីកាតនិម្មិត</translation> <translation id="1803020234906945288">ការពិសាអាហារដែលល្អចំពោះសុខភាព</translation> <translation id="1803351196216024260">អាចស្នើសុំប្រើមីក្រូហ្វូនរបស់អ្នក</translation> +<translation id="1806174020048213474">កម្មវិធីនេះកំពុងស្នើសុំការអនុញ្ញាត ដើម្បីដំឡើងព័ត៌មានផ្ទៀងផ្ទាត់ Wi-Fi។ បន្ទាប់ពីរៀបចំរួច <ph name="DEVICE_TYPE" /> របស់អ្នកនឹងភ្ជាប់ដោយស្វ័យប្រវត្តិទៅបណ្ដាញ Wi-Fi ដែលចូលរួម។ ដើម្បីដកព័ត៌មានផ្ទៀងផ្ទាត់ទាំងនេះចេញ សូមលុបកម្មវិធី។</translation> <translation id="1807246157184219062">ភ្លឺ</translation> <translation id="1807528111851433570">សន្លឹកចាប់ផ្ដើម</translation> <translation id="180991881384371158">CVC របស់អ្នកស្ថិតនៅផ្នែកខាងក្រោយនៃកាតរបស់អ្នក។ វាជាលេខ 3 ខ្ទង់ចុងក្រោយនៅខាងស្ដាំផ្នែកខាងលើប្រអប់ហត្ថលេខា។</translation> @@ -673,7 +670,6 @@ <translation id="257674075312929031">ដាក់ជាក្រុម</translation> <translation id="2576880857912732701">ប៊ូតុង "គ្រប់គ្រងការកំណត់សុវត្ថិភាព" ចុច Enter ដើម្បីគ្រប់គ្រងការរុករកដោយសុវត្ថិភាពរបស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅក្នុងការកំណត់ Chrome</translation> <translation id="2586657967955657006">អង្គចងចាំ</translation> -<translation id="2587730715158995865">ពី <ph name="ARTICLE_PUBLISHER" /> ។ សូមអានអត្ថបទនេះ និងអត្ថបទ <ph name="OTHER_ARTICLE_COUNT" /> ផ្សេងទៀត។</translation> <translation id="2587841377698384444">API ID ថតផ្ទុកឯកសារ៖</translation> <translation id="2594318783181750337">ការមើលបណ្ដាញរហ័ស៖</translation> <translation id="2595719060046994702">ឧបករណ៍ និងគណនីនេះមិនស្ថិតក្រោមការគ្រប់គ្រងរបស់ក្រុមហ៊ុនណាមួយ ឬស្ថាប័នផ្សេងទៀតឡើយ។</translation> @@ -1344,6 +1340,7 @@ <translation id="4270541775497538019">ទម្រគំនរទី 6</translation> <translation id="4274173425554582601">កុំព្យូទ័រ និងគ្រឿងអេឡិចត្រូនិក</translation> <translation id="4275830172053184480">ចាប់ផ្តើមឧបករណ៍របស់អ្នកឡើងវិញ</translation> +<translation id="4276974990916607331">ទេ អរគុណ</translation> <translation id="4277028893293644418">កំណត់ពាក្យសម្ងាត់ឡើងវិញ</translation> <translation id="4277937682389409325">អាសយដ្ឋានក្នុងតំបន់</translation> <translation id="4278390842282768270">បានអនុញ្ញាត</translation> @@ -1668,7 +1665,6 @@ <translation id="5045550434625856497">ពាក្យសម្ងាត់មិនត្រឹមត្រូវ</translation> <translation id="5051305769747448211">រឿងកំប្លែងបន្តផ្ទាល់</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ដើម្បីផ្ញើឯកសារនេះដោយប្រើការចែករំលែកនៅជិត សូមបង្កើនទំហំផ្ទុក (<ph name="DISK_SPACE_SIZE" />) នៅលើឧបករណ៍របស់អ្នក}other{ដើម្បីផ្ញើឯកសារទាំងនេះដោយប្រើការចែករំលែកនៅជិត សូមបង្កើនទំហំផ្ទុក (<ph name="DISK_SPACE_SIZE" />) នៅលើឧបករណ៍របស់អ្នក}}</translation> -<translation id="5056549851600133418">អត្ថបទសម្រាប់អ្នក</translation> <translation id="5060483733937416656">អ្នកបានជ្រើសរើសផ្ទៀងផ្ទាត់ដោយប្រើ Windows Hello នៅលើគេហទំព័រដែលប្រើប្រាស់ <ph name="PROVIDER_ORIGIN" />។ ក្រុមហ៊ុនផ្ដល់សេវានេះប្រហែលជាបានរក្សាទុកព័ត៌មានអំពីវិធីបង់ប្រាក់របស់អ្នក ដែលអ្នកអាច<ph name="LINK_TEXT" />។</translation> <translation id="5061227663725596739">តើអ្នកចង់មានន័យថា <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">ប្រវត្តិបោះពុម្ព</translation> @@ -1706,6 +1702,7 @@ <translation id="5129534298163637277">ប្រអប់បញ្ជាក់</translation> <translation id="5135404736266831032">គ្រប់គ្រងអាសយដ្ឋាន...</translation> <translation id="5136841603454277753">បញ្ចូលលេខកូដដែលត្រឹមត្រូវ</translation> +<translation id="5137761395480718572">កម្មវិធីនេះកំពុងស្នើសុំការអនុញ្ញាត ដើម្បីដំឡើងព័ត៌មានផ្ទៀងផ្ទាត់ Wi-Fi។ បន្ទាប់ពីរៀបចំរួច <ph name="DEVICE_TYPE" /> របស់អ្នកនឹងភ្ជាប់ដោយស្វ័យប្រវត្តិទៅបណ្ដាញ Wi-Fi ដែលចូលរួម។ ដើម្បីដកព័ត៌មានផ្ទៀងផ្ទាត់ទាំងនេះចេញ សូមលុបកម្មវិធី។ <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">មិនអាចប្រើកាតនិម្មិតនៅពេលនេះបានទេ សូមទាក់ទងធនាគាររបស់អ្នក</translation> <translation id="5138227688689900538">បង្ហាញតិច</translation> <translation id="5145883236150621069">លេខកូដកំហុសឆ្គងបង្ហាញនៅក្នុងការឆ្លើយតបគោលការណ៍</translation> @@ -1762,6 +1759,7 @@ <translation id="5273881944177595304">ឧបករណ៍លើអ៊ីនធឺណិត និងកម្មវិធីលើអ៊ីនធឺណិត</translation> <translation id="5274025349362408263">សៀវភៅ និងអក្សរសាស្ត្រ</translation> <translation id="5279286380302340275">គ្រប់គ្រងការទាញយក</translation> +<translation id="5279453600310613955">ទេ អរគុណ</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">លក្ខណៈសម្បត្តិរបស់ឯកសារ</translation> <translation id="528468243742722775">បញ្ចប់</translation> @@ -1800,6 +1798,7 @@ <translation id="5344579389779391559">ទំព័រនេះអាចនឹងព្យាយាមគិតប្រាក់ពីអ្នក</translation> <translation id="5347645913823149105">ប៊ូតុង "ប្ដូរពុម្ពអក្សរតាមបំណងនៅក្នុង Chrome" ចុច Enter ដើម្បីប្ដូរទំហំពុម្ពអក្សរ និងពុម្ពអក្សរនៅក្នុង Chrome</translation> <translation id="5355557959165512791">អ្នកមិនអាចចូលទៅកាន់ <ph name="SITE" /> ឥឡូវនេះបានទេ ដោយសារតែវិញ្ញាបនបត្ររបស់វាត្រូវបានដកហូតហើយ។ ជាទូទៅបញ្ហាបណ្តាញ ឬការវាយប្រហារកើតឡើងជាបណ្តោះអាសន្ន ដូច្នេះទំព័រនេះនឹងដំណើរការល្អឡើងវិញនៅពេលក្រោយ។</translation> +<translation id="5356345925629253198">អ្នកអាចប្រើអាសយដ្ឋានដែលបានរក្សាទុកនៅលើផលិតផល Google។ អាសយដ្ឋាននេះនឹងត្រូវបានរក្សាទុកនៅក្នុងគណនី Google (<ph name="ACCOUNT" />) របស់អ្នក។</translation> <translation id="5357848622083956825">សិល្បៈគំនូរ និងការរចនា</translation> <translation id="536296301121032821">បានបរាជ័យក្នុងការស្តារការកំណត់គោលការណ៍នេះ</translation> <translation id="5363309033720083897">រន្ធស៊េរីដែលបានអនុញ្ញាតដោយអ្នកគ្រប់គ្រងរបស់អ្នក</translation> @@ -1865,7 +1864,6 @@ <translation id="5541086400771735334">ប្រអប់សំបុត្រទី 7</translation> <translation id="5541546772353173584">បញ្ចូលអ៊ីមែល</translation> <translation id="5543722831081909240">180 ដឺក្រេ</translation> -<translation id="5545756402275714221">អត្ថបទសម្រាប់អ្នក</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome ពិនិត្យពាក្យសម្ងាត់របស់អ្នកជាទៀងទាត់ ធៀបទៅនឹងបញ្ជីពាក្យសម្ងាត់ដែលបានបោះផ្សាយនៅលើអ៊ីនធឺណិត។ នៅពេលធ្វើការពិនិត្យនេះ ឈ្មោះអ្នកប្រើប្រាស់ និងពាក្យសម្ងាត់របស់អ្នកត្រូវបានអ៊ីនគ្រីប ដើម្បីកុំឱ្យអ្នកដទៃ រួមទាំង Google អាចមើលឃើញ។</translation> <translation id="5556459405103347317">ដំណើរការឡើងវិញ</translation> @@ -2147,14 +2145,12 @@ <translation id="6266934640124581640">បៃតងស្រាល</translation> <translation id="6272088941196661550">បន្តការស្វែងរករបស់អ្នក ដើម្បីមើលសកម្មភាពដែលពាក់ព័ន្ធនៅក្នុងប្រវត្តិ Chrome របស់អ្នក</translation> <translation id="6272383483618007430">Google បច្ចុប្បន្នភាព</translation> -<translation id="6276112860590028508">ទំព័រពីបញ្ជីអានរបស់អ្នកបង្ហាញនៅទីនេះ</translation> <translation id="627746635834430766">ដើម្បីបង់ប្រាក់លឿនជាងនេះនៅពេលក្រោយ សូមរក្សាទុកបណ្ណ និងអាសយដ្ឋានចេញវិក្កយបត្ររបស់អ្នកទៅក្នុងគណនី Google របស់អ្នក។</translation> <translation id="6279183038361895380">ចុច |<ph name="ACCELERATOR" />| ដើម្បីបង្ហាញទស្សន៍ទ្រនិចរបស់អ្នក</translation> <translation id="6280223929691119688">មិនអាចដឹកជញ្ជូនផ្ទាល់ទៅអាសយដ្ឋាននេះបានទេ។ សូមជ្រើសរើសអាសយដ្ឋានផ្សេង។</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">ប៊ូតុង "គ្រប់គ្រងការទាញយកនៅក្នុង Chrome" ចុច Enter ដើម្បីគ្រប់គ្រងឯកសារដែលអ្នកបានទាញយកនៅក្នុង Chrome</translation> <translation id="6289939620939689042">ពណ៌ទំព័រ</translation> -<translation id="6290238015253830360">អត្ថបទដែលបានផ្តល់យោបល់របស់អ្នកបង្ហាញនៅទីនេះ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC៖</translation> <translation id="6295855836753816081">កំពុងរក្សាទុក…</translation> @@ -2257,6 +2253,7 @@ <translation id="6529173248185917884">ដុំទីប្រាំពីរ</translation> <translation id="6529602333819889595">ធ្វើការលុបវិញ</translation> <translation id="6535751101619004418">អត្រាប្ដូរប្រាក់បរទេស និងរូបិយបណ្ណ</translation> +<translation id="6536221421038631327">ការដកការជាវ Passpoint ចេញពី <ph name="DEVICE_TYPE" /> របស់អ្នកនឹងដកបណ្ដាញដែលពាក់ព័ន្ធចេញ។ សូមទាក់ទងទៅ "<ph name="FRIENDLY_NAME" />" ដើម្បីធ្វើការផ្លាស់ប្ដូរគម្រោងជាវរបស់អ្នក។ <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">សង្គហធន</translation> <translation id="6545864417968258051">ការស្កេនប៊្លូធូស</translation> <translation id="6547208576736763147">ចោះពីររន្ធខាងឆ្វេង</translation> @@ -2755,7 +2752,6 @@ <translation id="7696089921647603491">រ៉ុកស៊េរីចាស់ និងអូលឌី</translation> <translation id="769721561045429135">ឥឡូវនេះ អ្នកមានបណ្ណដែលអាចប្រើបានតែនៅលើឧបករណ៍នេះប៉ុណ្ណោះ។ សូមចុច "បន្ត" ដើម្បីពិនិត្យមើលបណ្ណ។</translation> <translation id="7698864304447945242">ដំឡើងកំណែសេវាកម្ម Google Play សម្រាប់ AR ឬ?</translation> -<translation id="7699293099605015246">មិនមានអត្ថបទនៅពេលនេះទេ</translation> <translation id="7701040980221191251">គ្មាន</translation> <translation id="7701544340847569275">បានបញ្ចប់ការធ្វើបច្ចុប្បន្នភាពដោយមានបញ្ហា</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />បន្តទៅ <ph name="SITE" /> (មិនមានសុវត្ថិភាព)<ph name="END_LINK" /></translation> @@ -3355,6 +3351,7 @@ <translation id="9219103736887031265">រូបភាព</translation> <translation id="922152298093051471">ប្ដូរ Chrome តាមបំណង</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">អនុញ្ញាតឱ្យកម្មវិធី <ph name="APP_NAME" /> រៀបចំបណ្ដាញ Wi-Fi ឬ?</translation> <translation id="936602727769022409">អ្នកអាចបាត់បង់សិទ្ធិចូលប្រើគណនី Google របស់អ្នក។ Chromium ណែនាំឱ្យប្ដូរពាក្យសម្ងាត់របស់អ្នកឥឡូវនេះ។ អ្នកនឹងត្រូវបានស្នើឱ្យចូលគណនី។</translation> <translation id="937457230470581909">សួនសត្វ ជលវប្បដ្ឋាន និងតំបន់អភិរក្ស</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />ទិន្នន័យអ្វីត្រូវបានប្រើប្រាស់៖<ph name="END_BOLD" /> ប្រធានបទនៃការផ្សាយពាណិជ្ជកម្មរបស់អ្នកគឺផ្អែកលើប្រវត្តិរុករកតាមអ៊ីនធឺណិតរបស់អ្នកក្នុងពេលថ្មីៗ បញ្ជីគេហទំព័រដែលអ្នកបានចូលមើលដោយប្រើ Chrome នៅលើឧបករណ៍នេះ។</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb index f63acc24..2887462 100644 --- a/components/strings/components_strings_kn.xtb +++ b/components/strings/components_strings_kn.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">ನೀವು ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ನಿರ್ವಹಣೆ ಮಾಡದ ಸೈಟ್ನಲ್ಲಿ ನಮೂದಿಸಿದ್ದೀರಿ. ನಿಮ್ಮ ಖಾತೆಯನ್ನು ರಕ್ಷಿಸಲು, ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳಲ್ಲಿ ಮತ್ತು ಸೈಟ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ಮರುಬಳಕೆ ಮಾಡಬೇಡಿ.</translation> <translation id="1257553931232494454">ಝೂಮ್ ಹಂತಗಳು</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ನಿಮ್ಮ Chrome ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು Tab ಒತ್ತಿ, ನಂತರ Enter ಒತ್ತಿ</translation> -<translation id="1263231323834454256">ಓದುವ ಪಟ್ಟಿ</translation> <translation id="1264309058268477500">ಪರ್ಯಾಯ</translation> <translation id="1264974993859112054">ಕ್ರೀಡೆ</translation> <translation id="1266469291454105242">ಸಾಧನದ ಅನ್ಲಾಕ್</translation> @@ -250,7 +249,6 @@ <translation id="1529789484829130889">ಟ್ರೇ 8</translation> <translation id="1530707389502320859">ನೀವು ಇದೀಗ ಭೇಟಿ ನೀಡಲು ಪ್ರಯತ್ನಿಸಿದ ವೆಬ್ಸೈಟ್ ನಕಲಿ ವೆಬ್ಸೈಟ್ನಂತೆ ಕಾಣುತ್ತದೆ. ದಾಳಿಕೋರರು ಕೆಲವೊಮ್ಮೆ ವೆಬ್ಸೈಟ್ಗಳನ್ನು ನಕಲಿಸುತ್ತಾರೆ ಮತ್ತು URL ನಲ್ಲಿ ಸಣ್ಣ ಪ್ರಮಾಣದ ಅಥವಾ ಗುರುತಿಸಲು ಸಾಧ್ಯವಾಗದ ರೀತಿಯಲ್ಲಿ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡುತ್ತಾರೆ.</translation> <translation id="1532118530259321453">ಈ ಪುಟವು ಹೀಗೆ ಹೇಳುತ್ತದೆ</translation> -<translation id="153384715582417236">ಇದುವರೆಗೂ ಇಷ್ಟೇ</translation> <translation id="1536390784834419204">ಪುಟವನ್ನು ಅನುವಾದಿಸಿ</translation> <translation id="1539840569003678498">ವರದಿಯನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ:</translation> <translation id="1549470594296187301">ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು JavaScript ಸಕ್ರಿಯಗೊಳಿಸಬೇಕು.</translation> @@ -347,7 +345,6 @@ <translation id="1745880797583122200">ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ನಿರ್ವಹಿಸಲಾಗಿದೆ</translation> <translation id="1746113442205726301">ಚಿತ್ರ Y ಶಿಫ್ಟ್</translation> <translation id="1746531169546376413">0 ಡಿಗ್ರಿಗಳು</translation> -<translation id="17513872634828108">ತೆರೆದ ಟ್ಯಾಬ್ಗಳು</translation> <translation id="1752021286346845558">ಮೇಲ್ಬಾಕ್ಸ್ 8</translation> <translation id="1753068535428855445">ಡೇಟಿಂಗ್ ಮತ್ತು ಪರ್ಸನಲ್ಸ್</translation> <translation id="1753706481035618306">ಪುಟ ಸಂಖ್ಯೆ</translation> @@ -359,7 +356,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows ನೆಟ್ವರ್ಕ್ ಡಯಾಗ್ನಾಸ್ಟಿಕ್ಸ್ ರನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium ನಲ್ಲಿ ಅದೃಶ್ಯ ಮೋಡ್ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ನಿಮ್ಮ ತೆರೆಯಲಾದ ಟ್ಯಾಬ್ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತದೆ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ನಿಮ್ಮ ಮಾಹಿತಿ, ಗೌಪ್ಯತೆ ಮತ್ತು ಸುರಕ್ಷತೆಯನ್ನು ನಿರ್ವಹಿಸಲು Tab ಒತ್ತಿ, ನಂತರ Enter ಒತ್ತಿ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ಅನೇಕ ಕ್ರಿಯೆಗಳು ಲಭ್ಯವಿವೆ. ಅವುಗಳನ್ನು ಒಂದೊಂದಾಗಿ ನೋಡಲು ಟ್ಯಾಬ್ ಒತ್ತಿ</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">ಗುಂಪು</translation> <translation id="2576880857912732701">ಭದ್ರತಾ ಸೆಟ್ಟಿಂಗ್ಗಳ ಬಟನ್ ಅನ್ನು ನಿರ್ವಹಿಸಿ, Chrome ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನಿಮ್ಮ ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ನಿರ್ವಹಿಸಲು Enter ಒತ್ತಿರಿ</translation> <translation id="2586657967955657006">ಕ್ಲಿಪ್ಬೋರ್ಡ್</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> ಅವರಿಂದ. ಇದನ್ನು ಮತ್ತು ಇತರ <ph name="OTHER_ARTICLE_COUNT" /> ಸುದ್ದಿಗಳನ್ನು ಓದಿ.</translation> <translation id="2587841377698384444">ಡೈರೆಕ್ಟರಿ API ID:</translation> <translation id="2594318783181750337">ವೇಗದ ವೆಬ್ ವೀಕ್ಷಣೆ:</translation> <translation id="2595719060046994702">ಈ ಸಾಧನ ಮತ್ತು ಖಾತೆಯನ್ನು ಕಂಪನಿ ಅಥವಾ ಇತರ ಸಂಸ್ಥೆಯ ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗಿಲ್ಲ.</translation> @@ -790,7 +785,7 @@ <translation id="2918922650248459053">ಡೈವಿಂಗ್ ಮತ್ತು ನೀರೊಳಗಿನ ಚಟುವಟಿಕೆಗಳು</translation> <translation id="2922350208395188000">ಸರ್ವರ್ನ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಪರಿಶೀಲಿಸಲಾಗುವುದಿಲ್ಲ.</translation> <translation id="292371311537977079">Chrome ಸೆಟ್ಟಿಂಗ್ಗಳು</translation> -<translation id="2925673989565098301">ವಿತರಣೆ ವಿಧಾನ</translation> +<translation id="2925673989565098301">ಡೆಲಿವರಿ ವಿಧಾನ</translation> <translation id="2928905813689894207">ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸ</translation> <translation id="2929525460561903222">{SHIPPING_ADDRESS,plural, =0{<ph name="SHIPPING_ADDRESS_PREVIEW" />}=1{<ph name="SHIPPING_ADDRESS_PREVIEW" /> ಮತ್ತು <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ಇನ್ನಷ್ಟು}one{<ph name="SHIPPING_ADDRESS_PREVIEW" /> ಮತ್ತು <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ಇನ್ನಷ್ಟು}other{<ph name="SHIPPING_ADDRESS_PREVIEW" /> ಮತ್ತು <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" /> ಇನ್ನಷ್ಟು}}</translation> <translation id="2930577230479659665">ಪ್ರತಿ ಮುದ್ರಣಪ್ರತಿಯ ನಂತರ ಟ್ರಿಮ್ ಮಾಡಿ</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">ತಪ್ಪು ಪಾಸ್ವರ್ಡ್</translation> <translation id="5051305769747448211">ಲೈವ್ ಕಾಮಿಡಿ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್ ಅನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}one{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್ಗಳನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}other{Nearby ಶೇರ್ ಬಳಸಿಕೊಂಡು ಈ ಫೈಲ್ಗಳನ್ನು ಕಳುಹಿಸಲು, ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಸ್ಥಳಾವಕಾಶವನ್ನು (<ph name="DISK_SPACE_SIZE" />) ಮುಕ್ತಗೊಳಿಸಿ}}</translation> -<translation id="5056549851600133418">ನಿಮಗಾಗಿ ಲೇಖನಗಳು</translation> <translation id="5060483733937416656">ನೀವು <ph name="PROVIDER_ORIGIN" /> ಬಳಸುವ ವೆಬ್ಸೈಟ್ಗಳಲ್ಲಿ Windows Hello ಮೂಲಕ ದೃಢೀಕರಿಸುವ ಆಯ್ಕೆಯನ್ನು ಮಾಡಿದ್ದೀರಿ. ಈ ಪೂರೈಕೆದಾರರು ನಿಮ್ಮ ಪಾವತಿ ವಿಧಾನದ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಟ್ಟಿರಬಹುದು, ನೀವು ಅದನ್ನು <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">ನೀವು ಹುಡುಕುತ್ತಿರುವುದು <ph name="LOOKALIKE_DOMAIN" /> ತಾನೇ?</translation> <translation id="5066056036849835175">ಪ್ರಿಂಟಿಂಗ್ ಇತಿಹಾಸ</translation> @@ -1739,6 +1733,8 @@ <translation id="5234764350956374838">ವಜಾಗೊಳಿಸಿ</translation> <translation id="5239623327352565343">ಸ್ಥಳವನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="5242889659037569123">ಲಗೇಜ್ ಮತ್ತು ಪ್ರಯಾಣ ಆ್ಯಕ್ಸೆಸರಿಗಳು</translation> +<translation id="5244732203286792411">ಲೋಡ್ ಆಗುತ್ತಿದೆ... + ಇದಕ್ಕೆ ಒಂದು ನಿಮಿಷ ಕಾಲಾವಕಾಶ ಬೇಕಾಗಬಹುದು.</translation> <translation id="5250209940322997802">"ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಿ"</translation> <translation id="52517543715119994">Chrome ಫೀಚರ್ಗಳ ಕುರಿತು ತಿಳಿಯಿರಿ</translation> <translation id="5251803541071282808">ಕ್ಲೌಡ್</translation> @@ -1856,7 +1852,6 @@ <translation id="5541086400771735334">ಮೇಲ್ಬಾಕ್ಸ್ 7</translation> <translation id="5541546772353173584">ಇಮೇಲ್ ಸೇರಿಸಿ</translation> <translation id="5543722831081909240">180 ಡಿಗ್ರಿಗಳು</translation> -<translation id="5545756402275714221">ನಿಮಗಾಗಿ ಲೇಖನಗಳು</translation> <translation id="5551890439174915351">100 x 200 ಮಿಮೀ</translation> <translation id="5552137475244467770">Chrome, ನಿಯತಕಾಲಿಕವಾಗಿ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಆನ್ಲೈನ್ನಲ್ಲಿ ಪ್ರಕಟಿಸಲಾದ ಪಟ್ಟಿಗಳಿಗೆ ಹೋಲಿಸಿ ಪರಿಶೀಲಿಸುತ್ತದೆ. ಪರಿಶೀಲಿಸುವಾಗ, ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಮತ್ತು ಬಳಕೆದಾರರ ಹೆಸರುಗಳನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗುತ್ತದೆ, ಆದ್ದರಿಂದ ಅವುಗಳನ್ನು Google ಸೇರಿದಂತೆ ಯಾರಿಂದಲೂ ಓದಲು ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation> <translation id="5556459405103347317">ಮರುಲೋಡ್</translation> @@ -2137,14 +2132,12 @@ <translation id="6266934640124581640">ತಿಳಿ ಕೆನ್ನೀಲಿ</translation> <translation id="6272088941196661550">ನಿಮ್ಮ Chrome ಇತಿಹಾಸದಲ್ಲಿ ಸಂಬಂಧಿತ ಚಟುವಟಿಕೆಯನ್ನು ನೋಡಲು ನಿಮ್ಮ ಪ್ರಯಾಣವನ್ನು ಪುನರಾರಂಭಿಸಿ</translation> <translation id="6272383483618007430">Google ಅಪ್ಡೇಟ್</translation> -<translation id="6276112860590028508">ನಿಮ್ಮ ಓದುವ ಪಟ್ಟಿಯ ಪುಟಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ</translation> <translation id="627746635834430766">ಮುಂದಿನ ಬಾರಿ ವೇಗವಾಗಿ ಪಾವತಿಸಲು, ನಿಮ್ಮ ಕಾರ್ಡ್ ಮತ್ತು ಬಿಲ್ಲಿಂಗ್ ವಿಳಾಸವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಿ.</translation> <translation id="6279183038361895380">ನಿಮ್ಮ ಕರ್ಸರ್ ತೋರಿಸಲು |<ph name="ACCELERATOR" />| ಒತ್ತಿ</translation> <translation id="6280223929691119688">ಈ ವಿಳಾಸಕ್ಕೆ ತಲುಪಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಬೇರೊಂದು ವಿಳಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ.</translation> <translation id="6284292079994426700">26 x 38 ಇಂಚು</translation> <translation id="6285507000506177184">Chrome ಬಟನ್ನಲ್ಲಿ ಡೌನ್ಲೋಡ್ಗಳನ್ನು ನಿರ್ವಹಿಸಿ, ನೀವು Chrome ನಲ್ಲಿ ಡೌನ್ಲೋಡ್ ಮಾಡಿರುವ ಫೈಲ್ಗಳನ್ನು ನಿರ್ವಹಿಸಲು Enter ಒತ್ತಿರಿ</translation> <translation id="6289939620939689042">ಪುಟದ ಬಣ್ಣ</translation> -<translation id="6290238015253830360">ನೀವು ಸಲಹೆ ನೀಡಿರುವ ಲೇಖನಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">ಉಳಿಸಲಾಗುತ್ತಿದೆ...</translation> @@ -2483,7 +2476,7 @@ <translation id="7132939140423847331">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಈ ಡೇಟಾವನ್ನು ನಕಲಿಸದಂತೆ ನಿಷೇಧಿಸಿದ್ದಾರೆ.</translation> <translation id="7135130955892390533">ಕಾರ್ಯನೀತಿ ಸ್ಥಿತಿಯನ್ನು ತೋರಿಸಿ</translation> <translation id="7136009930065337683">ಅಜ್ಞಾತ ಮೋಡ್ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation> -<translation id="7138472120740807366">ವಿತರಣೆ ವಿಧಾನ</translation> +<translation id="7138472120740807366">ಡೆಲಿವರಿ ವಿಧಾನ</translation> <translation id="7139892792842608322">ಪ್ರಾಥಮಿಕ ಟ್ರೇ</translation> <translation id="7140087718106278457">ಪಾವತಿ ವಿಧಾನಗಳ ಪಟ್ಟಿಯನ್ನು ಮುಚ್ಚಲಾಗಿದೆ.</translation> <translation id="714064300541049402">ಅಂಚು 2 ಚಿತ್ರ X ಶಿಫ್ಟ್</translation> @@ -2744,7 +2737,6 @@ <translation id="7696089921647603491">ಕ್ಲಾಸಿಕ್ ರಾಕ್ ಮತ್ತು ಓಲ್ಡೀಸ್</translation> <translation id="769721561045429135">ಸದ್ಯಕ್ಕೆ, ಈ ಸಾಧನದಲ್ಲಿ ಬಳಸಬಹುದಾದ ಕಾರ್ಡ್ಗಳನ್ನು ಮಾತ್ರವೇ ನೀವು ಹೊಂದಿದ್ದೀರಿ. ಕಾರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಮುಂದುವರಿಸಿ ಕ್ಲಿಕ್ ಮಾಡಿ.</translation> <translation id="7698864304447945242">Google Play Services for AR ಗಾಗಿ ಅಪ್ಡೇಟ್ ಮಾಡಬೇಕೆ?</translation> -<translation id="7699293099605015246">ಲೇಖನಗಳು ಸದ್ಯಕ್ಕೆ ಲಭ್ಯವಿಲ್ಲ</translation> <translation id="7701040980221191251">ಯಾವುದೂ ಇಲ್ಲ</translation> <translation id="7701544340847569275">ದೋಷಗಳೊಂದಿಗೆ ಅಪ್ಡೇಟ್ ಪೂರ್ಣಗೊಂಡಿದೆ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ಗೆ (ಅಸುರಕ್ಷಿತ) ಮುಂದುವರೆಸು<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb index 2791bd59..9882c6d 100644 --- a/components/strings/components_strings_ko.xtb +++ b/components/strings/components_strings_ko.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">조직에서 관리하지 않는 사이트에 내 비밀번호를 입력했습니다. 계정을 안전하게 보호하려면 다른 앱과 사이트에서 동일한 비밀번호를 재사용하지 마세요.</translation> <translation id="1257553931232494454">확대/축소 수준</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab을 누른 다음 Enter를 눌러 Chrome 설정 관리</translation> -<translation id="1263231323834454256">읽기 목록</translation> <translation id="1264309058268477500">대체</translation> <translation id="1264974993859112054">스포츠</translation> <translation id="1266469291454105242">기기 잠금 해제</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">트레이 8</translation> <translation id="1530707389502320859">방문하려고 한 사이트가 허위 사이트로 보입니다. 일부 공격자는 사이트의 URL을 알아채기 어려울 정도로 약간 변경하여 다른 사이트를 모방합니다.</translation> <translation id="1532118530259321453">이 페이지 내용:</translation> -<translation id="153384715582417236">새 콘텐츠 없음</translation> <translation id="1536390784834419204">페이지 번역</translation> <translation id="1539840569003678498">보고 날짜:</translation> <translation id="1549470594296187301">이 기능을 이용하려면 자바스크립트를 사용하도록 설정해야 합니다.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">관리 대상 브라우저입니다</translation> <translation id="1746113442205726301">이미지 Y 시프트</translation> <translation id="1746531169546376413">0도</translation> -<translation id="17513872634828108">열린 탭</translation> <translation id="1752021286346845558">메일박스 8</translation> <translation id="1753068535428855445">데이트 및 결혼 정보</translation> <translation id="1753706481035618306">페이지 번호</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows 네트워크 진단 프로그램을 실행<ph name="END_LINK" />해 보세요.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium 시크릿 모드 자세히 알아보기<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">열린 탭이 여기에 표시됩니다.</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tab을 누른 다음 Enter를 눌러 Google 계정에서 정보, 개인 정보 보호 및 보안 설정 관리</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, 여러 작업 이용 가능, Tab을 눌러 작업 둘러보기</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">그룹화</translation> <translation id="2576880857912732701">보안 설정 관리 버튼, Chrome 설정에서 세이프 브라우징 등의 기능을 관리하려면 Enter를 누르세요</translation> <translation id="2586657967955657006">클립보드</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" />에서 제공한 기사입니다. <ph name="OTHER_ARTICLE_COUNT" />개의 다른 뉴스도 읽어 보세요.</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">빠른 웹 보기:</translation> <translation id="2595719060046994702">회사 또는 다른 조직에서 관리하지 않는 기기 및 계정입니다.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">비밀번호가 잘못되었습니다.</translation> <translation id="5051305769747448211">라이브 코미디</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby Share를 사용해 이 파일을 전송하려면 기기에서 여유 공간(<ph name="DISK_SPACE_SIZE" />)을 확보하세요.}other{Nearby Share를 사용해 파일을 전송하려면 기기에서 여유 공간(<ph name="DISK_SPACE_SIZE" />)을 확보하세요.}}</translation> -<translation id="5056549851600133418">추천 기사</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> 주소를 사용하는 웹사이트의 인증 방식으로 Windows Hello를 선택했습니다. 이 제공업체에서 내 결제 수단 정보를 저장했을 수 있으며 직접 <ph name="LINK_TEXT" />할 수 있습니다.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" />을(를) 찾으셨나요?</translation> <translation id="5066056036849835175">인쇄 기록</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">닫기</translation> <translation id="5239623327352565343">위치 허용됨</translation> <translation id="5242889659037569123">여행 가방 및 여행용품</translation> +<translation id="5244732203286792411">로드 중입니다. + 시간이 조금 걸릴 수 있습니다.</translation> <translation id="5250209940322997802">'네트워크에 연결'</translation> <translation id="52517543715119994">Chrome 기능 자세히 알아보기</translation> <translation id="5251803541071282808">클라우드</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">메일박스 7</translation> <translation id="5541546772353173584">이메일 추가</translation> <translation id="5543722831081909240">180도</translation> -<translation id="5545756402275714221">추천 기사</translation> <translation id="5551890439174915351">100x200mm</translation> <translation id="5552137475244467770">Chrome에서는 온라인에 게시된 비밀번호 목록에 사용자의 비밀번호가 포함되어 있는지를 주기적으로 확인합니다. 이렇게 하면 비밀번호 및 사용자 이름이 암호화되어 Google을 포함해 누구도 읽을 수 없습니다.</translation> <translation id="5556459405103347317">새로고침</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">연한 청록색</translation> <translation id="6272088941196661550">Chrome 방문 기록에서 관련 활동을 보려면 탐색 여정을 재개하세요.</translation> <translation id="6272383483618007430">Google 업데이트</translation> -<translation id="6276112860590028508">읽기 목록의 페이지가 여기에 표시됩니다.</translation> <translation id="627746635834430766">다음번에 더 빠르게 결제할 수 있도록 Google 계정에 카드와 청구서 수신 주소를 저장하세요.</translation> <translation id="6279183038361895380">|<ph name="ACCELERATOR" />|을(를) 눌러 커서 표시</translation> <translation id="6280223929691119688">이 주소로 배달할 수 없습니다. 다른 주소를 선택하세요.</translation> <translation id="6284292079994426700">26x38인치</translation> <translation id="6285507000506177184">Chrome 다운로드 관리 버튼, Chrome에서 다운로드한 파일을 관리하려면 Enter를 누르세요</translation> <translation id="6289939620939689042">페이지 색상</translation> -<translation id="6290238015253830360">추천 콘텐츠가 여기에 표시됩니다.</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">저장 중...</translation> @@ -2747,7 +2740,6 @@ <translation id="7696089921647603491">클래식 록 및 추억의 음악</translation> <translation id="769721561045429135">현재 이 기기에서만 사용할 수 있는 카드가 있습니다. 카드를 검토하려면 계속을 클릭하세요.</translation> <translation id="7698864304447945242">Google Play AR 서비스를 업데이트하시겠습니까?</translation> -<translation id="7699293099605015246">지금은 기사를 가져올 수 없음</translation> <translation id="7701040980221191251">없음</translation> <translation id="7701544340847569275">업데이트 완료됨(오류 발생)</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" />(안전하지 않음)<ph name="END_LINK" />(으)로 이동</translation>
diff --git a/components/strings/components_strings_ky.xtb b/components/strings/components_strings_ky.xtb index 9e1a165..978b273 100644 --- a/components/strings/components_strings_ky.xtb +++ b/components/strings/components_strings_ky.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Сырсөзүңүздү уюмуңуз тарабынан башкарылбаган сайтка киргиздиңиз. Аккаунтуңузду коргоо үчүн сырсөзүңүздү башка колдонмолор менен сайттарда колдонбоңуз.</translation> <translation id="1257553931232494454">чоңойтуп/кичирейтүү деңгээлдери</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome параметрлериңизди башкаруу үчүн Tab, андан кийин Enter баскычын басыңыз</translation> -<translation id="1263231323834454256">Окуу тизмеси</translation> <translation id="1264309058268477500">Кошумча</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Түзмөктүн кулпусун ачуу</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8-түпкүч</translation> <translation id="1530707389502320859">Сиз баш баккыңыз келген сайт жасалма окшойт. Чабуулчулар кээ бир учурларда URL'дерге кичинекей, көзгө көрүнбөгөн өзгөртүүлөрдү киргизип, сайттарды туурашат.</translation> <translation id="1532118530259321453">Бул баракча мындай дейт:</translation> -<translation id="153384715582417236">Азырынча ушул эле</translation> <translation id="1536390784834419204">Баракты которуу</translation> <translation id="1539840569003678498">Кабар жөнөтүлдү:</translation> <translation id="1549470594296187301">Бул функцияны пайдалануу үчүн JavaScript иштетилиши керек.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Серепчиңиз башкарылып жатат</translation> <translation id="1746113442205726301">Y сүрөтүн жылдыруу</translation> <translation id="1746531169546376413">0 градус</translation> -<translation id="17513872634828108">Ачык өтмөктөр</translation> <translation id="1752021286346845558">8-электрондук каттар кутусу</translation> <translation id="1753068535428855445">Таанышуу жана жуп табуу</translation> <translation id="1753706481035618306">Беттин номери</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows аркылуу Тармак мүчүлүштүгүн аныктоону иштетип көрүңүз<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium'дагы жашыруун өтмөк жөнүндө кеңири маалымат<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0 (1030mm x 1456mm)</translation> -<translation id="1787142507584202372">Ачылган өтмөктөр бул жерде көрүнөт</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Маалыматты, купуялыкты жана коопсуздукту Google аккаунтуңузда башкаруу үчүн Tab, андан кийин Enter баскычын басыңыз</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, бир нече аракет жеткиликтүү, Tab баскычын басып, аларды карап чыгыңыз</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Топ</translation> <translation id="2576880857912732701">Коопсуздук параметрлерин башкаруу баскычы, Chrome параметрлеринен Коопсуз серептөөнү жана башка нерселерди башкаруу үчүн Enter баскычын басыңыз</translation> <translation id="2586657967955657006">Алмашуу буфери</translation> -<translation id="2587730715158995865">Булагы: <ph name="ARTICLE_PUBLISHER" />. Башка макалалар дагы бар (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Каталогдун API'синин ID:</translation> <translation id="2594318783181750337">Ыкчам веб көрүнүшү:</translation> <translation id="2595719060046994702">Бул түзмөк менен аккаунт компания же башка уюм тарабынан башкарылган жок.</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">Сырсөз туура эмес</translation> <translation id="5051305769747448211">Түз берилүүчү комедия</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Бул файлды Nearby Share функциясы аркылуу жөнөтүү үчүн түзмөгүңүздө орун (<ph name="DISK_SPACE_SIZE" />) бошотуңуз}other{Бул файлдарды Nearby Share функциясы аркылуу жөнөтүү үчүн түзмөгүңүздө орун (<ph name="DISK_SPACE_SIZE" />) бошотуңуз}}</translation> -<translation id="5056549851600133418">Сизге ылайыктуу макалалар</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> вебсайттарында Windows Hello функциясын колдонууну тандагансыз. Бул провайдер төлөм ыкмаңызды сактап койгон болушу мүмкүн. Аны <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> эмес беле?</translation> <translation id="5066056036849835175">Басып чыгаруу таржымалы</translation> @@ -1858,7 +1852,6 @@ <translation id="5541086400771735334">7-электрондук каттар кутусу</translation> <translation id="5541546772353173584">Электрондук почта дарегин кошуу</translation> <translation id="5543722831081909240">180 градус</translation> -<translation id="5545756402275714221">Сизге ылайыктуу макалалар</translation> <translation id="5551890439174915351">100 x 200 мм.</translation> <translation id="5552137475244467770">Chrome Интернетке жарыяланган тизмелерден сырсөздөрүңүздү маал-маалы менен текшерип турат. Мындай учурда сырсөздөрүңүз менен колдонуучу аттарыңыз шифрленет. Аларды эч ким, анын ичинде Google да окуй албайт.</translation> <translation id="5556459405103347317">Кайра жүктөө</translation> @@ -2140,14 +2133,12 @@ <translation id="6266934640124581640">Мала көгүш жашыл</translation> <translation id="6272088941196661550">Chrome´до көрүлгөн вебсайттарыңыздын арасынан ылайыктууларын көрүү үчүн саякатты улантыңыз</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Окуу тизмеңиздеги барактар бул жерде көрүнөт</translation> <translation id="627746635834430766">Кийинки жолу тезирээк төлөө үчүн картаңыз менен эсептешүү дарегин Google аккаунтуңузга сактап коюңуз.</translation> <translation id="6279183038361895380">Курсоруңузду көрсөтүү үчүн |<ph name="ACCELERATOR" />| дегенди басыңыз</translation> <translation id="6280223929691119688">Бул дарекке жеткирүү мүмкүн эмес. Башка дарек тандаңыз.</translation> <translation id="6284292079994426700">26 x 38 дюйм</translation> <translation id="6285507000506177184">"Chrome'до жүктөлүп алынгандарды башкаруу" баскычы, Chrome'до жүктөлүп алынган файлдарды башкаруу үчүн Enter баскычын басыңыз</translation> <translation id="6289939620939689042">Барактын түсү</translation> -<translation id="6290238015253830360">Сунушталган макалалар ушул жерде көрүнөт</translation> <translation id="6293309776179964942">JIS B5 (182mm x 257mm)</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Сакталууда…</translation> @@ -2747,7 +2738,6 @@ <translation id="7696089921647603491">Классикалык рок жана эски хиттер</translation> <translation id="769721561045429135">Учурда карталарыңызды ушул түзмөктө гана колдонууга болот. Карталарды карап чыгуу үчүн "Улантуу" дегенди басыңыз.</translation> <translation id="7698864304447945242">AR үчүн Google Play кызматтары жаңыртылсынбы?</translation> -<translation id="7699293099605015246">Учурда макалалар жок</translation> <translation id="7701040980221191251">Эч бир</translation> <translation id="7701544340847569275">Жаңыртуу каталарсыз аяктады</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> Улантуу <ph name="SITE" /> (кооптуу)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_lo.xtb b/components/strings/components_strings_lo.xtb index 942eafe..6f0bff8 100644 --- a/components/strings/components_strings_lo.xtb +++ b/components/strings/components_strings_lo.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">ທ່ານໄດ້ປ້ອນລະຫັດຜ່ານຂອງທ່ານໃນເວັບໄຊທີ່ບໍ່ຖືກຈັດການໂດຍອົງການຈັດຕັ້ງຂອງທ່ານ. ເພື່ອປົກປ້ອງບັນຊີຂອງທ່ານ, ກະລຸນາຢ່ານຳລະຫັດຜ່ານຂອງທ່ານມາໃຊ້ໃໝ່ຢູ່ໃນແອັບ ແລະ ເວັບໄຊອື່ນ.</translation> <translation id="1257553931232494454">ລະດັບການຊູມ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ກົດ Tab ຈາກນັ້ນກົດ Enter ເພື່ອຈັດການການຕັ້ງຄ່າ Chrome ຂອງທ່ານ</translation> -<translation id="1263231323834454256">ລາຍການທີ່ຈະອ່ານ</translation> <translation id="1264309058268477500">ສຳຮອງ</translation> <translation id="1264974993859112054">ກິລາ</translation> <translation id="1266469291454105242">ການປົດລັອກອຸປະກອນ</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ຖາດ 8</translation> <translation id="1530707389502320859">ເວັບໄຊທີ່ທ່ານຫາກໍພະຍາຍາມເຂົ້າເບິ່ງປາກົດວ່າເປັນເວັບປອມ. ບາງຄັ້ງຜູ້ໂຈມຕີປອມເປັນເວັບໄຊຕ່າງໆໂດຍການເຮັດການປ່ຽນແປງນ້ອຍໆທີ່ເບິ່ງເຫັນໄດ້ຍາກຕໍ່ກັບ URL.</translation> <translation id="1532118530259321453">ໜ້ານີ້ບອກ</translation> -<translation id="153384715582417236">ໝົດແລ້ວສຳລັບຕອນນີ້</translation> <translation id="1536390784834419204">ແປໜ້າ</translation> <translation id="1539840569003678498">ສົ່ງລາຍງານແລ້ວ:</translation> <translation id="1549470594296187301">ຕ້ອງເປີດໃຊ້ງານ JavaScript ເພື່ອໃຊ້ຄຸນສົມບັດໃຊ້ງານນີ້.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">ມີການຈັດການໂປຣແກຣມທ່ອງເວັບຂອງທ່ານ</translation> <translation id="1746113442205726301">ປ່ຽນຕຳແໜ່ງຮູບພາບຕາມແກນ Y</translation> <translation id="1746531169546376413">0 ອົງສາ</translation> -<translation id="17513872634828108">ແຖບເປີດ</translation> <translation id="1752021286346845558">ກ່ອງຈົດໝາຍ 8</translation> <translation id="1753068535428855445">ການຊອກຄູ່ ແລະ ໂຄສະນາຊອກໝູ່</translation> <translation id="1753706481035618306">ເລກທີໜ້າ</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />ລອງເປີດໃຊ້ Windows Network Diagnostics<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມກ່ຽວກັບໂໝດບໍ່ເປີດເຜີຍຕົວຕົນໃນ Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ແຖບທີ່ເປີດຢູ່ຂອງທ່ານປາກົດຢູ່ບ່ອນນີ້</translation> <translation id="1791429645902722292">ລັອກອັດສະລິຍະ Google</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ກົດ Tab ຈາກນັ້ນກົດ Enter ເພື່ອຈັດການຂໍ້ມູນ, ຄວາມເປັນສ່ວນຕົວ ແລະ ຄວາມປອດໄພຂອງທ່ານໃນບັນຊີ Google ທ່ານ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ມີຫຼາຍຄຳສັ່ງພ້ອມໃຫ້ນຳໃຊ້, ກົດ Tab ເພື່ອເບິ່ງພວກມັນ</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">ກຸ່ມ</translation> <translation id="2576880857912732701">ຈັດການປຸ່ມການຕັ້ງຄ່າຄວາມປອດໄພ, ກົດ Enter ເພື່ອຈັດການ Safe Browsing ຂອງທ່ານ ແລະ ອື່ນໆໃນການຕັ້ງຄ່າ Chrome</translation> <translation id="2586657967955657006">ຄລິບບອດ</translation> -<translation id="2587730715158995865">ຈາກ <ph name="ARTICLE_PUBLISHER" />. ອ່ານຂ່າວນີ້ ແລະ ອີກ <ph name="OTHER_ARTICLE_COUNT" /> ຂ່າວອື່ນ.</translation> <translation id="2587841377698384444">ລະຫັດ API ຂອງໄດເຣັກທໍຣີ:</translation> <translation id="2594318783181750337">ມຸມມອງເວັບແບບດ່ວນ:</translation> <translation id="2595719060046994702">ອຸປະກອນ ແລະ ບັນຊີນີ້ບໍ່ຖືກຈັດການໂດຍບໍລິສັດ ຫຼື ອົງການຈັດຕັ້ງອື່ນ.</translation> @@ -1666,7 +1661,6 @@ <translation id="5045550434625856497">ລະຫັດຜ່ານບໍ່ຖືກຕ້ອງ</translation> <translation id="5051305769747448211">ການສະແດງຕະຫລົກສົດ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ເພື່ອສົ່ງໄຟລ໌ນີ້ໂດຍໃຊ້ການແບ່ງປັນໃກ້ຄຽງ, ໃຫ້ສ້າງພື້ນທີ່ຫວ່າງ (<ph name="DISK_SPACE_SIZE" />) ຢູ່ອຸປະກອນຂອງທ່ານກ່ອນ}other{ເພື່ອສົ່ງໄຟລ໌ເຫຼົ່ານີ້ໂດຍໃຊ້ການແບ່ງປັນໃກ້ຄຽງ, ໃຫ້ສ້າງພື້ນທີ່ຫວ່າງ (<ph name="DISK_SPACE_SIZE" />) ຢູ່ອຸປະກອນຂອງທ່ານກ່ອນ}}</translation> -<translation id="5056549851600133418">ບົດຄວາມສຳລັບທ່ານ</translation> <translation id="5060483733937416656">ທ່ານເລືອກທີ່ຈະຢັ້ງຢືນດ້ວຍ Windows Hello ຢູ່ເວັບໄຊທີ່ໃຊ້ <ph name="PROVIDER_ORIGIN" />. ຜູ້ໃຫ້ບໍລິການນີ້ອາດມີການຈັດເກັບຂໍ້ມູນກ່ຽວກັບວິທີການຈ່າຍເງິນຂອງທ່ານໄວ້, ເຊິ່ງທ່ານສາມາດ <ph name="LINK_TEXT" /> ໄດ້.</translation> <translation id="5061227663725596739">ທ່ານໝາຍເຖິງ <ph name="LOOKALIKE_DOMAIN" /> ບໍ?</translation> <translation id="5066056036849835175">ປະຫວັດການພິມ</translation> @@ -1745,6 +1739,8 @@ <translation id="5234764350956374838">ປ່ອຍໄປ</translation> <translation id="5239623327352565343">ອະນຸຍາດໃຫ້ເຂົ້າເຖິງສະຖານທີ່ແລ້ວ</translation> <translation id="5242889659037569123">ກະເປົາເດີນທາງ ແລະ ອຸປະກອນການເດີນທາງ</translation> +<translation id="5244732203286792411">ກຳລັງໂຫຼດ... + ຂັ້ນຕອນນີ້ອາດໃຊ້ເວລາໜ້ອຍໜຶ່ງ.</translation> <translation id="5250209940322997802">"ເຊື່ອມຕໍ່ກັບເຄືອຂ່າຍ"</translation> <translation id="52517543715119994">ສຶກສາເພີ່ມເຕີມກ່ຽວກັບຄຸນສົມບັດ Chrome</translation> <translation id="5251803541071282808">ຄລາວ</translation> @@ -1863,7 +1859,6 @@ <translation id="5541086400771735334">ກ່ອງຈົດໝາຍ 7</translation> <translation id="5541546772353173584">ເພີ່ມອີເມວ</translation> <translation id="5543722831081909240">180 ອົງສາ</translation> -<translation id="5545756402275714221">ບົດຄວາມສຳລັບທ່ານ</translation> <translation id="5551890439174915351">100 x 200 ມມ</translation> <translation id="5552137475244467770">Chrome ກວດລະຫັດຜ່ານຂອງທ່ານເປັນໄລຍະໂດຍທຽບກັບລາຍການທີ່ມີການເຜີຍແຜ່ທາງອອນລາຍ. ໃນເວລາເຮັດສິ່ງນີ້, ພວກເຮົາເຂົ້າລະຫັດຊື່ຜູ້ໃຊ້ ແລະ ລະຫັດຜ່ານຂອງທ່ານໄວ້ ເພື່ອບໍ່ໃຫ້ຜູ້ໃດ ຮວມທັງ Google ສາມາດອ່ານພວກມັນໄດ້.</translation> <translation id="5556459405103347317">ໂຫຼດຄືນໃໝ່</translation> @@ -2145,14 +2140,12 @@ <translation id="6266934640124581640">ສີຂຽວອົມຟ້າຈາງ</translation> <translation id="6272088941196661550">ສືບຕໍ່ບັນທຶກຂອງທ່ານເພື່ອເບິ່ງການເຄື່ອນໄຫວທີ່ກ່ຽວຂ້ອງໃນປະຫວັດ Chrome ຂອງທ່ານ</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">ໜ້າຈາກລາຍການທີ່ຈະອ່ານຂອງທ່ານປາກົດຢູ່ບ່ອນນີ້</translation> <translation id="627746635834430766">ເພື່ອຈ່າຍໄດ້ໄວກວ່າໃນຄັ້ງຕໍ່ໄປ, ກະລຸນາບັນທຶກບັດ ແລະ ທີ່ຢູ່ຮຽກເກັບເງິນຂອງທ່ານໄວ້ໃນບັນຊີ Google ຂອງທ່ານ.</translation> <translation id="6279183038361895380">ກົດ |<ph name="ACCELERATOR" />| ເພື່ອສະແດງເຄີເຊີຂອງທ່ານ</translation> <translation id="6280223929691119688">ບໍ່ສາມາດສົ່ງຫາທີ່ຢູ່ນີ້ໄດ້. ກະລຸນາເລືອກທີ່ຢູ່ອື່ນ.</translation> <translation id="6284292079994426700">26 x 38 ນິ້ວ</translation> <translation id="6285507000506177184">ປຸ່ມຈັດການການດາວໂຫຼດໃນ Chrome, ກົດ Enter ເພື່ອຈັດການໄຟລ໌ທີ່ທ່ານດາວໂຫຼດມາແລ້ວໃນ Chrome</translation> <translation id="6289939620939689042">ສີໜ້າເຈ້ຍ</translation> -<translation id="6290238015253830360">ບົດຄວາມທີ່ແນະນຳຂອງທ່ານຈະປາກົດຢູ່ບ່ອນນີ້</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">ກໍາລັງບັນທຶກ...</translation> @@ -2753,7 +2746,6 @@ <translation id="7696089921647603491">ຣັອກຄລາດສິກ ແລະ ເພງເກົ່າ</translation> <translation id="769721561045429135">ຕອນນີ້, ທ່ານມີບັດທີ່ສາມາດໃຊ້ໄດ້ຢູ່ໃນອຸປະກອນນີ້ເທົ່ານັ້ນ. ຄລິກສືບຕໍ່ເພື່ອກວດເບິ່ງບັດ.</translation> <translation id="7698864304447945242">ອັບເດດບໍລິການ Google Play ສຳລັບ AR ບໍ?</translation> -<translation id="7699293099605015246">ບົດຄວາມບໍ່ມີໃຫ້ໃນຕອນນີ້</translation> <translation id="7701040980221191251">ບໍ່ມີ</translation> <translation id="7701544340847569275">ອັບເດດສຳເລັດໂດຍມີຂໍ້ຜິດພາດ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ໄປຫາ<ph name="SITE" /> (ບໍ່ປອດໄພ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb index 2e326f2d..51da3d44 100644 --- a/components/strings/components_strings_lt.xtb +++ b/components/strings/components_strings_lt.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Įvedėte slaptažodį svetainėje, kurios netvarko jūsų organizacija. Kad apsaugotumėte paskyrą, nenaudokite to paties slaptažodžio kitose programose ir svetainėse.</translation> <translation id="1257553931232494454">mastelio keitimo lygiai</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, paspauskite tabuliavimo klavišą, tada – „Enter“, jei norite tvarkyti „Chrome“ nustatymus.</translation> -<translation id="1263231323834454256">Skaitymo sąrašas</translation> <translation id="1264309058268477500">Alternatyvus</translation> <translation id="1264974993859112054">Sportas</translation> <translation id="1266469291454105242">Įrenginio atrakinimo funkcija</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8 dėklas</translation> <translation id="1530707389502320859">Svetainė, kurioje ką tik bandėte apsilankyti, atrodo kaip suklastota svetainė. Užpuolėjai kartais sukuria svetainių kopijas ir atlieka nedidelius, sunkiai pastebimus URL pakeitimus.</translation> <translation id="1532118530259321453">Šiame puslapyje nurodyta:</translation> -<translation id="153384715582417236">Kol kas tiek</translation> <translation id="1536390784834419204">Versti puslapį</translation> <translation id="1539840569003678498">Ataskaita išsiųsta:</translation> <translation id="1549470594296187301">Norint naudoti šią funkciją, reikia įgalinti „JavaScript“.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Jūsų naršyklė tvarkoma</translation> <translation id="1746113442205726301">Sukti vaizdą pagal Y ašį</translation> <translation id="1746531169546376413">0 laipsnių</translation> -<translation id="17513872634828108">Atidaryti skirtukai</translation> <translation id="1752021286346845558">8 pašto dėžutė</translation> <translation id="1753068535428855445">Pažinčių ir asmeniniai skelbimai</translation> <translation id="1753706481035618306">Puslapio numeris</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Pabandykite paleisti „Windows Network Diagnostics“<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Sužinokite daugiau apie inkognito režimą naršyklėje „Chromium“<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Atidaryti skirtukai bus rodomi čia</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, paspauskite tabuliavimo klavišą, tada – „Enter“, jei norite tvarkyti savo informaciją, privatumo ir saugos nustatymus „Google“ paskyroje</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, galimi keli veiksmai, paspauskite skirtuką, norėdami juos perjungti</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupė</translation> <translation id="2576880857912732701">Mygtukas „Tvarkyti saugos nustatymus“; paspauskite „Enter“, jei norite tvarkyti Saugaus naršymo ir kitus duomenis „Chrome“ nustatymuose</translation> <translation id="2586657967955657006">Iškarpinė</translation> -<translation id="2587730715158995865">Nuo „<ph name="ARTICLE_PUBLISHER" />“. Skaitykite šią ir kitas istorijas (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Katalogo API ID:</translation> <translation id="2594318783181750337">Spartusis žiniatinklio rodinys:</translation> <translation id="2595719060046994702">Šio įrenginio ir paskyros netvarko įmonė ar kita organizacija.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Neteisingas slaptažodis</translation> <translation id="5051305769747448211">Komedija gyvai</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Jei norite siųsti šį failą naudodami funkciją „Bendrinimas netoliese“, atlaisvinkite vietos (<ph name="DISK_SPACE_SIZE" />) įrenginyje}one{Jei norite siųsti šiuos failus naudodami funkciją „Bendrinimas netoliese“, atlaisvinkite vietos (<ph name="DISK_SPACE_SIZE" />) įrenginyje}few{Jei norite siųsti šiuos failus naudodami funkciją „Bendrinimas netoliese“, atlaisvinkite vietos (<ph name="DISK_SPACE_SIZE" />) įrenginyje}many{Jei norite siųsti šiuos failus naudodami funkciją „Bendrinimas netoliese“, atlaisvinkite vietos (<ph name="DISK_SPACE_SIZE" />) įrenginyje}other{Jei norite siųsti šiuos failus naudodami funkciją „Bendrinimas netoliese“, atlaisvinkite vietos (<ph name="DISK_SPACE_SIZE" />) įrenginyje}}</translation> -<translation id="5056549851600133418">Jums skirti straipsniai</translation> <translation id="5060483733937416656">Svetainėse, kuriose naudojama <ph name="PROVIDER_ORIGIN" />, pasirinkote patvirtinti naudodami „Windows Hello“. Šis teikėjas galėjo išsaugoti informaciją apie jūsų mokėjimo metodą, ir galite <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Turėjote omenyje <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Spausdinimo istorija</translation> @@ -1743,6 +1737,8 @@ <translation id="5234764350956374838">Atsisakyti</translation> <translation id="5239623327352565343">Vietovė leidžiama</translation> <translation id="5242889659037569123">Bagažas ir kelionių priedai</translation> +<translation id="5244732203286792411">Įkeliama... + Tai gali šiek tiek užtrukti.</translation> <translation id="5250209940322997802">„Prisijungimas prie tinklo“</translation> <translation id="52517543715119994">Sužinokite apie „Chrome“ funkcijas</translation> <translation id="5251803541071282808">Debesis</translation> @@ -1860,7 +1856,6 @@ <translation id="5541086400771735334">7 pašto dėžutė</translation> <translation id="5541546772353173584">El. pašto adreso pridėjimas</translation> <translation id="5543722831081909240">180 laipsnių</translation> -<translation id="5545756402275714221">Jums skirti straipsniai</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">„Chrome“ periodiškai tikrina, ar jūsų slaptažodžiai nebuvo įtraukti į internete paskelbtus sąrašus. Tai atliekant, slaptažodžiai ir naudotojų vardai užšifruojami, kad niekas negalėtų jų perskaityti, įskaitant „Google“.</translation> <translation id="5556459405103347317">Įkelti iš naujo</translation> @@ -2142,14 +2137,12 @@ <translation id="6266934640124581640">Šviesi žalsvai mėlyna</translation> <translation id="6272088941196661550">Tęsti veiksmus, norint matyti atitinkamą veiklą „Chrome“ istorijoje</translation> <translation id="6272383483618007430">„Google“ naujinys</translation> -<translation id="6276112860590028508">Čia rodomi puslapiai iš skaitymo sąrašo</translation> <translation id="627746635834430766">Kad kitą kartą galėtumėte greičiau atlikti mokėjimą, išsaugokite kortelę ir atsiskaitymo adresą „Google“ paskyroje.</translation> <translation id="6279183038361895380">Paspauskite |<ph name="ACCELERATOR" />|, kad būtų rodomas žymeklis</translation> <translation id="6280223929691119688">Negalima pristatyti šiuo adresu. Pasirinkite kitą adresą.</translation> <translation id="6284292079994426700">26 x 38 col.</translation> <translation id="6285507000506177184">Mygtukas „Tvarkyti atsisiuntimus naršyklėje „Chrome“; paspauskite „Enter“, jei norite tvarkyti failus, kuriuos atsisiuntėte naršyklėje „Chrome“</translation> <translation id="6289939620939689042">Puslapio spalva</translation> -<translation id="6290238015253830360">Jūsų pasiūlyti straipsniai rodomi čia</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Kortelės patvirtinimo kodas CVC:</translation> <translation id="6295855836753816081">Išsaugoma...</translation> @@ -2749,7 +2742,6 @@ <translation id="7696089921647603491">Klasikinis rokas ir „Oldies“</translation> <translation id="769721561045429135">Šiuo metu turite kortelių, kurias galima naudoti tik šiuo įrenginiu. Jei norite peržiūrėti korteles, spustelėkite „Tęsti“.</translation> <translation id="7698864304447945242">Atnaujinti „Google Play“ paslaugas, skirtas AR?</translation> -<translation id="7699293099605015246">Straipsniai šiuo metu negalimi</translation> <translation id="7701040980221191251">Nėra</translation> <translation id="7701544340847569275">Atnaujinimas baigtas su klaidomis</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Eiti į svetainę <ph name="SITE" /> (nesaugu)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb index 151e544..ef9f6e38 100644 --- a/components/strings/components_strings_lv.xtb +++ b/components/strings/components_strings_lv.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Jūs ievadījāt paroli vietnē, kuru nepārvalda jūsu organizācija. Lai aizsargātu savu kontu, neizmantojiet šo paroli citās lietotnēs un vietnēs.</translation> <translation id="1257553931232494454">tālummaiņas līmeņi</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, lai pārvaldītu Chrome iestatījumus, nospiediet tabulēšanas taustiņu un pēc tam — taustiņu Enter</translation> -<translation id="1263231323834454256">Lasīšanas saraksts</translation> <translation id="1264309058268477500">Alternatīva</translation> <translation id="1264974993859112054">Sports</translation> <translation id="1266469291454105242">Ierīces atbloķēšana</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8. paplāte</translation> <translation id="1530707389502320859">Vietne, ko tikko mēģinājāt apmeklēt, šķiet viltota. Uzbrucēji dažkārt atdarina vietnes, veicot nelielas un grūti pamanāmas izmaiņas vietrādī URL.</translation> <translation id="1532118530259321453">Šajā lapā ir rakstīts</translation> -<translation id="153384715582417236">Pagaidām tas arī viss!</translation> <translation id="1536390784834419204">Tulkot lapu</translation> <translation id="1539840569003678498">Pārskata nosūtīšanas laiks:</translation> <translation id="1549470594296187301">Lai izmantotu šo funkciju, ir jābūt iespējotai valodai JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Jūsu pārlūks tiek pārvaldīts</translation> <translation id="1746113442205726301">Attēla nobīde uz Y ass</translation> <translation id="1746531169546376413">Par 0 grādiem</translation> -<translation id="17513872634828108">Atvērt cilnes</translation> <translation id="1752021286346845558">8. pastkaste</translation> <translation id="1753068535428855445">Randiņi un iepazīšanās sludinājumi</translation> <translation id="1753706481035618306">Lapas numurs</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Mēģiniet palaist Windows tīkla diagnostiku<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Uzzināt vairāk par inkognito režīmu pārlūkā Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Šeit tiks parādītas jūsu atvērtās cilnes</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Lai pārvaldītu savu informāciju, konfidencialitāti un drošību savā Google kontā, nospiediet tabulēšanas taustiņu un pēc tam — taustiņu Enter.</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ir pieejamas vairākas darbības. Lai pēc kārtas pārietu starp šīm darbībām, nospiediet tabulēšanas taustiņu.</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupa</translation> <translation id="2576880857912732701">Poga drošības iestatījumu pārvaldībai. Lai Chrome iestatījumos pārvaldītu funkciju “Droša pārlūkošana” un citas funkcijas, nospiediet taustiņu Enter.</translation> <translation id="2586657967955657006">Starpliktuve</translation> -<translation id="2587730715158995865">No: <ph name="ARTICLE_PUBLISHER" />. Lasiet šo un vēl <ph name="OTHER_ARTICLE_COUNT" /> rakstus.</translation> <translation id="2587841377698384444">Direktorija API ID:</translation> <translation id="2594318783181750337">Ātrais tīmekļa skats:</translation> <translation id="2595719060046994702">Šī ierīce un konts netiek pārvaldīts uzņēmumā vai citā organizācijā.</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">Nepareiza parole</translation> <translation id="5051305769747448211">Komiķu uzstāšanās</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Lai nosūtītu šo failu, izmantojot funkciju “Kopīgošana tuvumā”, atbrīvojiet vietu krātuvē (<ph name="DISK_SPACE_SIZE" />)}zero{Lai nosūtītu šos failus, izmantojot funkciju “Kopīgošana tuvumā”, atbrīvojiet vietu krātuvē (<ph name="DISK_SPACE_SIZE" />)}one{Lai nosūtītu šos failus, izmantojot funkciju “Kopīgošana tuvumā”, atbrīvojiet vietu krātuvē (<ph name="DISK_SPACE_SIZE" />)}other{Lai nosūtītu šos failus, izmantojot funkciju “Kopīgošana tuvumā”, atbrīvojiet vietu krātuvē (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Jums piemeklēti raksti</translation> <translation id="5060483733937416656">Jūs izvēlējāties veikt verifikāciju ar Windows Hello tīmekļa vietnēs, kas izmanto <ph name="PROVIDER_ORIGIN" /> pakalpojumus. Šis pakalpojumu sniedzējs, iespējams, ir saglabājis informāciju par jūsu maksājuma veidu, un jūs varat <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Vai domājāt <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Drukāšanas vēsture</translation> @@ -1858,7 +1852,6 @@ <translation id="5541086400771735334">7. pastkaste</translation> <translation id="5541546772353173584">E-pasta adreses pievienošana</translation> <translation id="5543722831081909240">Par 180 grādiem</translation> -<translation id="5545756402275714221">Ieteiktie raksti</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Pārlūkā Chrome tiek periodiski pārbaudītas jūsu paroles, salīdzinot tās ar tiešsaistē publicētiem sarakstiem. Šo pārbaužu laikā paroles un lietotājvārdi ir šifrēti, lai neviens tos nevarētu lasīt, tostarp Google.</translation> <translation id="5556459405103347317">Pārlādēt</translation> @@ -2140,14 +2133,12 @@ <translation id="6266934640124581640">Gaiši zilganzaļa</translation> <translation id="6272088941196661550">Atsāciet meklēšanas ceļu, lai skatītu atbilstošās darbības savā Chrome vēsturē</translation> <translation id="6272383483618007430">Google atjauninājums</translation> -<translation id="6276112860590028508">Šeit tiek rādītas lasīšanas sarakstā esošās lapas</translation> <translation id="627746635834430766">Lai nākamreiz veiktu maksājumu ātrāk, saglabājiet kartes datus un norēķinu adresi savā Google kontā.</translation> <translation id="6279183038361895380">Lai tiktu parādīts kursors, nospiediet |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Nevar piegādāt uz šo adresi. Atlasiet citu adresi.</translation> <translation id="6284292079994426700">26 x 38 collas</translation> <translation id="6285507000506177184">Poga lejupielāžu pārvaldībai pārlūkā Chrome. Lai pārvaldītu pārlūkā Chrome lejupielādētos failus, nospiediet taustiņu Enter.</translation> <translation id="6289939620939689042">Lapas krāsa</translation> -<translation id="6290238015253830360">Ieteiktie raksti tiek parādīti šeit</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Notiek saglabāšana...</translation> @@ -2747,7 +2738,6 @@ <translation id="7696089921647603491">Klasiskais roks un “vecie gabali”</translation> <translation id="769721561045429135">Pašlaik dažas kartes varat izmantot tikai šajā ierīcē. Lai pārskatītu kartes, noklikšķiniet uz Turpināt.</translation> <translation id="7698864304447945242">Vai atjaunināt Google Play PR pakalpojumus?</translation> -<translation id="7699293099605015246">Raksti pašlaik nav pieejami</translation> <translation id="7701040980221191251">Nav</translation> <translation id="7701544340847569275">Atjaunināšana pabeigta ar kļūdām</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Apmeklēt vietni <ph name="SITE" /> (nav droša)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_mk.xtb b/components/strings/components_strings_mk.xtb index 5160dfd..d28aa93 100644 --- a/components/strings/components_strings_mk.xtb +++ b/components/strings/components_strings_mk.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ја внесовте лозинката на сајт што не е управуван од организацијата. За да ја заштитите сметката, не користете ја лозинката повторно на други апликации и сајтови.</translation> <translation id="1257553931232494454">нивоа на зумирање</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, притиснете го копчето Tab, а потоа Enter за да управувате со поставките за Chrome</translation> -<translation id="1263231323834454256">Список за читање</translation> <translation id="1264309058268477500">Наизменична</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Отклучување уред</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Фиока 8</translation> <translation id="1530707389502320859">Сајтот којшто се обидовте да го посетите изгледа лажно. Напаѓачите понекогаш имитираат сајтови, така што вршат мали, тешко забележливи промени во URL-адресата.</translation> <translation id="1532118530259321453">Оваа страница вели</translation> -<translation id="153384715582417236">Тоа е сѐ засега</translation> <translation id="1536390784834419204">Преведи ја страницата</translation> <translation id="1539840569003678498">Извештајот е испратен на:</translation> <translation id="1549470594296187301">За да се користи функцијава, мора да биде овозможено JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Прелистувачот е управуван</translation> <translation id="1746113442205726301">Промена на сликата Y</translation> <translation id="1746531169546376413">0 степени</translation> -<translation id="17513872634828108">Отворени јазичиња</translation> <translation id="1752021286346845558">Поштенско сандаче 8</translation> <translation id="1753068535428855445">Услуги за состаноци и запознавање</translation> <translation id="1753706481035618306">Број на страница</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Обидете се да извршите дијагностика на мрежата на Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Дознајте повеќе за „Инкогнито“ во Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Отворените картички се појавуваат тука</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, притиснете го копчето Tab, а потоа копчето Enter за да управувате со податоците, приватноста и безбедноста на вашата сметка на Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, достапни се повеќе дејства, притискајте Tab за да ги менувате</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Група</translation> <translation id="2576880857912732701">Копче „Управувај со безбедносните поставки“, притиснете Enter за да управувате со безбедното прелистување и друго во поставките за Chrome</translation> <translation id="2586657967955657006">Табла со исечоци</translation> -<translation id="2587730715158995865">Од <ph name="ARTICLE_PUBLISHER" />. Прочитајте го овој и уште <ph name="OTHER_ARTICLE_COUNT" /> други написи.</translation> <translation id="2587841377698384444">ИД на директориумот API:</translation> <translation id="2594318783181750337">Брз преглед на интернет:</translation> <translation id="2595719060046994702">Со уредов и со сметкава не управува компанија или друга организација.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Погрешна лозинка</translation> <translation id="5051305769747448211">Комедија во живо</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{За да ја испратите датотекава преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}one{За да ги испратите датотекиве преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}other{За да ги испратите датотекиве преку „Споделување во близина“, ослободете простор (<ph name="DISK_SPACE_SIZE" />) на уредот}}</translation> -<translation id="5056549851600133418">Статии за вас</translation> <translation id="5060483733937416656">Избравте да потврдите со Windows Hello на веб-страници кои користат <ph name="PROVIDER_ORIGIN" />. Давателов на услуги можеби ги зачувал податоците за вашиот начин на плаќање и можете <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Дали мислевте на <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Историја на печатење</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Поштенско сандаче 7</translation> <translation id="5541546772353173584">Додајте е-пошта</translation> <translation id="5543722831081909240">180 степени</translation> -<translation id="5545756402275714221">Статии за вас</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome повремено ги споредува лозинките со списоци објавени онлајн. Кога го прави ова, вашите лозинки и кориснички имиња се шифрирани, па нив не може да ги прочита никој, вклучително и Google.</translation> <translation id="5556459405103347317">Повторно вчитај</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">Светла синозелена</translation> <translation id="6272088941196661550">Продолжете со патувањето за да ја прегледате релевантната активност во вашата „Историја на Chrome“</translation> <translation id="6272383483618007430">Ажурирање од Google</translation> -<translation id="6276112860590028508">Страниците од списокот за читање се појавуваат тука</translation> <translation id="627746635834430766">За да платите побрзо следниот пат, зачувајте ја картичката и адресата за наплата на вашата сметка на Google.</translation> <translation id="6279183038361895380">Притиснете |<ph name="ACCELERATOR" />| за да се покаже покажувачот</translation> <translation id="6280223929691119688">Не може да се достави на оваа адреса. Изберете друга.</translation> <translation id="6284292079994426700">26 x 38 инчи</translation> <translation id="6285507000506177184">Копче „Управувајте со преземањата во Chrome“, притиснете Enter за да управувате со датотеките што сте ги презеле во Chrome</translation> <translation id="6289939620939689042">Боја на страницата</translation> -<translation id="6290238015253830360">Предложените статии ќе се појавуваат тука</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Се зачувува…</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Класичен рок и стари песни</translation> <translation id="769721561045429135">Во моментов имате картички што може да се користат само на овој уред. Кликнете „Продолжи“ за да ги прегледате картичките.</translation> <translation id="7698864304447945242">Да се ажурираат „Услуги на Google Play за AR“?</translation> -<translation id="7699293099605015246">Нема достапни статии во моментов</translation> <translation id="7701040980221191251">Нема</translation> <translation id="7701544340847569275">Ажурирањето заврши со грешки</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Продолжете до <ph name="SITE" /> (небезбедно)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb index e1b16fc..22c3123 100644 --- a/components/strings/components_strings_ml.xtb +++ b/components/strings/components_strings_ml.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">നിങ്ങളുടെ സ്ഥാപനത്തിന് നിയന്ത്രണമില്ലാത്ത സൈറ്റിലാണ് പാസ്വേഡ് നൽകിയിരിക്കുന്നത്. നിങ്ങളുടെ അക്കൗണ്ട് പരിരക്ഷിക്കാൻ, മറ്റ് ആപ്പുകളിലും സൈറ്റുകളിലും നിങ്ങളുടെ പാസ്വേഡ് പുനരുപയോഗിക്കരുത്.</translation> <translation id="1257553931232494454">സൂം ലെവലുകൾ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, നിങ്ങളുടെ Chrome ക്രമീകരണം മാനേജ് ചെയ്യാൻ Tab അമർത്തുക, തുടർന്ന് Enter അമർത്തുക</translation> -<translation id="1263231323834454256">വായനാ ലിസ്റ്റ്</translation> <translation id="1264309058268477500">ഇതര ട്രേ</translation> <translation id="1264974993859112054">കായികം</translation> <translation id="1266469291454105242">ഉപകരണ അൺലോക്ക്</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ട്രേ 8</translation> <translation id="1530707389502320859">നിങ്ങൾ ഇപ്പോൾ സന്ദർശിക്കാൻ ശ്രമിച്ചത് വ്യാജ സൈറ്റാണെന്ന് തോന്നുന്നു. ചിലപ്പോൾ ചെറുതും കാണാൻ ബുദ്ധിമുട്ടുള്ളതുമായ മാറ്റങ്ങൾ URL-ൽ വരുത്തി ആക്രമണകാരികൾ സൈറ്റുകളുടെ അനുകരണ രൂപം സൃഷ്ടിക്കാറുണ്ട്.</translation> <translation id="1532118530259321453">ഈ പേജ് പറയുന്നത്:</translation> -<translation id="153384715582417236">ഇപ്പോൾ ഇത്രമാത്രം ലഭ്യം</translation> <translation id="1536390784834419204">പേജ് വിവർത്തനം ചെയ്യുക</translation> <translation id="1539840569003678498">റിപ്പോർട്ട് അയച്ചു:</translation> <translation id="1549470594296187301">ഈ ഫീച്ചർ ഉപയോഗിക്കാൻ JavaScript പ്രവർത്തനക്ഷമമാക്കിയിരിക്കണം.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">നിങ്ങളുടെ ബ്രൗസർ മാനേജ് ചെയ്യപ്പെട്ടിരിക്കുന്നു</translation> <translation id="1746113442205726301">ചിത്രം Y ഷിഫ്റ്റ്</translation> <translation id="1746531169546376413">0 ഡിഗ്രി</translation> -<translation id="17513872634828108">ഓപ്പൺ ടാബുകൾ</translation> <translation id="1752021286346845558">മെയിൽബോക്സ് 8</translation> <translation id="1753068535428855445">ഡേറ്റിംഗും വ്യക്തിപരമായ കാര്യങ്ങളും</translation> <translation id="1753706481035618306">പേജ് നമ്പർ</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows നെറ്റ്വർക്ക് ഡയഗണോസ്റ്റിക്സ് റൺ ചെയ്തുനോക്കൂ<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium-ലെ അദൃശ്യ മോഡിനെ കുറിച്ച് കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">നിങ്ങൾ നിലവിൽ തുറന്നിട്ടുള്ള ടാബുകൾ ഇവിടെ ദൃശ്യമാകും</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, നിങ്ങളുടെ Google അക്കൗണ്ടിലെ വിവരങ്ങളും സ്വകാര്യതയും സുരക്ഷയും മാനേജ് ചെയ്യാൻ Tab അമർത്തുക, തുടർന്ന് Enter അമർത്തുക</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ഒന്നിലധികം പ്രവർത്തനങ്ങൾ ലഭ്യമാണ്, ഒന്നിൽ നിന്ന് മറ്റൊന്നിലേക്ക് മാറാൻ 'Tab' അമർത്തുക</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">വെർച്വൽ കാർഡിന്റെ വിശദാംശങ്ങൾ</translation> <translation id="1803020234906945288">ആരോഗ്യകരമായ ഭക്ഷണശീലം</translation> <translation id="1803351196216024260">നിങ്ങളുടെ മൈക്രോഫോൺ ഉപയോഗിക്കാൻ ആവശ്യപ്പെടാം</translation> +<translation id="1806174020048213474">ഈ ആപ്പ്, വൈഫൈ ക്രെഡൻഷ്യലുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനുള്ള അനുമതി അഭ്യർത്ഥിക്കുന്നു. സജ്ജീകരിച്ചതിന് ശേഷം, ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കുകളിലേക്ക് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> സ്വയമേവ കണക്റ്റ് ചെയ്യും. ഈ ക്രെഡെൻഷ്യലുകൾ നീക്കം ചെയ്യാൻ ആപ്പ് അൺഇൻസ്റ്റാൾ ചെയ്യുക.</translation> <translation id="1807246157184219062">ലൈറ്റ്</translation> <translation id="1807528111851433570">ആദ്യ ഷീറ്റ്</translation> <translation id="180991881384371158">CVC നിങ്ങളുടെ കാർഡിന്റെ പിൻഭാഗത്താണുള്ളത്. ഒപ്പിടാനുള്ള ബോക്സിന്റെ മുകളിൽ വലതുവശത്തുള്ള അവസാന 3 അക്കമാണിത്.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">ഗ്രൂപ്പ്</translation> <translation id="2576880857912732701">'സുരക്ഷാ ക്രമീകരണം മാനേജ് ചെയ്യുക' ബട്ടൺ, Chrome ക്രമീകരണത്തിൽ നിങ്ങളുടെ സുരക്ഷിത ബ്രൗസിംഗും മറ്റും മാനേജ് ചെയ്യാൻ Enter അമർത്തുക</translation> <translation id="2586657967955657006">ക്ലിപ്പ്ബോർഡ്</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> എന്നയാളുടെ ലേഖനം. ഇതും മറ്റ് <ph name="OTHER_ARTICLE_COUNT" /> ലേഖനങ്ങളും വായിക്കുക.</translation> <translation id="2587841377698384444">ഡയറക്റ്ററി API ഐഡി:</translation> <translation id="2594318783181750337">വേഗത്തിലുള്ള വെബ് കാഴ്ച:</translation> <translation id="2595719060046994702">ഏതെങ്കിലും കമ്പനിയോ മറ്റ് സ്ഥാപനമോ മാനേജ് ചെയ്യുന്നതല്ല ഈ ഉപകരണവും അക്കൗണ്ടും.</translation> @@ -1340,6 +1336,7 @@ <translation id="4270541775497538019">സ്റ്റാക്കർ 6</translation> <translation id="4274173425554582601">കമ്പ്യൂട്ടറുകളും ഇലക്ട്രോണിക്സും</translation> <translation id="4275830172053184480">നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക</translation> +<translation id="4276974990916607331">വേണ്ട</translation> <translation id="4277028893293644418">പാസ്വേഡ് റീസെറ്റ് ചെയ്യുക</translation> <translation id="4277937682389409325">പ്രാദേശിക വിലാസം</translation> <translation id="4278390842282768270">അനുവദനീയം</translation> @@ -1663,7 +1660,6 @@ <translation id="5045550434625856497">പാസ്വേഡ് തെറ്റാണ്</translation> <translation id="5051305769747448211">തൽസമയ ഹാസ്യം</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{സമീപമുള്ള പങ്കിടൽ ഉപയോഗിച്ച് ഈ ഫയൽ അയയ്ക്കാൻ നിങ്ങളുടെ ഉപകരണത്തിൽ ഇടം (<ph name="DISK_SPACE_SIZE" />) സൃഷ്ടിക്കുക}other{സമീപമുള്ള പങ്കിടൽ ഉപയോഗിച്ച് ഈ ഫയലുകൾ അയയ്ക്കാൻ നിങ്ങളുടെ ഉപകരണത്തിൽ ഇടം (<ph name="DISK_SPACE_SIZE" />) സൃഷ്ടിക്കുക}}</translation> -<translation id="5056549851600133418">നിങ്ങൾക്കുള്ള ലേഖനങ്ങൾ</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> ഉപയോഗിക്കുന്ന വെബ്സൈറ്റുകളിൽ Windows Hello ഉപയോഗിച്ച് പരിശോധിച്ചുറപ്പിക്കാൻ നിങ്ങൾ തിരഞ്ഞെടുത്തു. നിങ്ങളുടെ പേയ്മെന്റ് രീതിയുമായി ബന്ധപ്പെട്ട വിവരങ്ങൾ ഈ ദാതാവ് സംഭരിച്ചിട്ടുണ്ടാകാം, നിങ്ങൾക്ക് ഇത് <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> ആണോ നിങ്ങൾ ഉദ്ദേശിച്ചത്?</translation> <translation id="5066056036849835175">പ്രിന്റിംഗ് ചരിത്രം</translation> @@ -1701,6 +1697,7 @@ <translation id="5129534298163637277">സ്ഥിരീകരണ ഡയലോഗ്</translation> <translation id="5135404736266831032">വിലാസങ്ങൾ മാനേജ് ചെയ്യുക...</translation> <translation id="5136841603454277753">ശരിയായ കോഡ് നൽകുക</translation> +<translation id="5137761395480718572">ഈ ആപ്പ്, വൈഫൈ ക്രെഡൻഷ്യലുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്നതിനുള്ള അനുമതി അഭ്യർത്ഥിക്കുന്നു. സജ്ജീകരിച്ചതിന് ശേഷം, ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കുകളിലേക്ക് നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> സ്വയമേവ കണക്റ്റ് ചെയ്യും. ഈ ക്രെഡൻഷ്യലുകൾ നീക്കം ചെയ്യാൻ ആപ്പ് അൺഇൻസ്റ്റാൾ ചെയ്യുക. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">വെർച്വൽ കാർഡ് ഇപ്പോൾ ലഭ്യമല്ല, നിങ്ങളുടെ ബാങ്കുമായി ബന്ധപ്പെടുക</translation> <translation id="5138227688689900538">കുറച്ച് കാണിക്കുക</translation> <translation id="5145883236150621069">നയ പ്രതികരണത്തിൽ പിശക് കോഡ് ഉണ്ട്</translation> @@ -1757,6 +1754,7 @@ <translation id="5273881944177595304">വെബ് ആപ്പുകളും ഓൺലൈൻ ടൂളുകളും</translation> <translation id="5274025349362408263">പുസ്തകങ്ങളും സാഹിത്യവും</translation> <translation id="5279286380302340275">ഡൗൺലോഡുകൾ മാനേജ് ചെയ്യുക</translation> +<translation id="5279453600310613955">വേണ്ട</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">ഡോക്യുമെന്റ് പ്രോപ്പർട്ടികൾ</translation> <translation id="528468243742722775">അവസാനിപ്പിക്കുക</translation> @@ -1860,7 +1858,6 @@ <translation id="5541086400771735334">മെയിൽബോക്സ് 7</translation> <translation id="5541546772353173584">ഇമെയില് ചേര്ക്കുക</translation> <translation id="5543722831081909240">180 ഡിഗ്രി</translation> -<translation id="5545756402275714221">നിങ്ങൾക്കുള്ള ലേഖനങ്ങൾ</translation> <translation id="5551890439174915351">100 x 200 മി.മീ</translation> <translation id="5552137475244467770">ഓൺലൈനിൽ പ്രസിദ്ധീകരിച്ച ലിസ്റ്റുകൾക്ക് അനുസൃതമായി Chrome ഇടയ്ക്കിടെ നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കുന്നു. ഇത് ചെയ്യുമ്പോൾ, നിങ്ങളുടെ പാസ്വേഡുകളും ഉപയോക്തൃനാമങ്ങളും എൻക്രിപ്റ്റ് ചെയ്ത നിലയിലായിരിക്കും, അതിനാൽ അവ Google ഉൾപ്പെടെ ആർക്കും വായിക്കാൻ കഴിയില്ല.</translation> <translation id="5556459405103347317">വീണ്ടും ലോഡ് ചെയ്യുക</translation> @@ -2142,14 +2139,12 @@ <translation id="6266934640124581640">ഇളം ടീൽ</translation> <translation id="6272088941196661550">നിങ്ങളുടെ Chrome ചരിത്രത്തിൽ പ്രസക്തമായ ആക്റ്റിവിറ്റി കാണാൻ ജേർണി പുനരാരംഭിക്കുക</translation> <translation id="6272383483618007430">Google അപ്ഡേറ്റ്</translation> -<translation id="6276112860590028508">നിങ്ങളുടെ വായന പട്ടികയിൽ നിന്നുള്ള പേജുകൾ ഇവിടെ ദൃശൃമാകും</translation> <translation id="627746635834430766">അടുത്ത പ്രാവശ്യം വേഗത്തിൽ പണമടയ്ക്കാൻ, നിങ്ങളുടെ Google അക്കൗണ്ടിൽ ഈ കാർഡും ബില്ലിംഗ് വിലാസവും സംരക്ഷിക്കുക.</translation> <translation id="6279183038361895380">നിങ്ങളുടെ കഴ്സർ കാണിക്കാൻ |<ph name="ACCELERATOR" />| അമർത്തുക</translation> <translation id="6280223929691119688">ഈ വിലാസത്തിലേക്ക് ഡെലിവറി ചെയ്യാൻ കഴിയില്ല. മറ്റൊരു വിലാസം തിരഞ്ഞെടുക്കുക.</translation> <translation id="6284292079994426700">26 x 38 ഇഞ്ച്</translation> <translation id="6285507000506177184">'Chrome-ൽ ഡൗൺലോഡുകൾ മാനേജ് ചെയ്യുക' ബട്ടൺ, Chrome-ൽ നിങ്ങൾ ഡൗൺലോഡ് ചെയ്തിരിക്കുന്ന ഫയലുകൾ മാനേജ് ചെയ്യാൻ Enter അമർത്തുക</translation> <translation id="6289939620939689042">പേജിന്റെ നിറം</translation> -<translation id="6290238015253830360">നിങ്ങളുടെ നിർദ്ദേശിച്ച ലേഖനങ്ങൾ ഇവിടെ ദൃശ്യമാകും</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">സംരക്ഷിക്കുന്നു...</translation> @@ -2252,6 +2247,7 @@ <translation id="6529173248185917884">ഏഴാമത്തെ റോൾ</translation> <translation id="6529602333819889595">&ഇല്ലാതാക്കുന്നത് വീണ്ടും ചെയ്യുക</translation> <translation id="6535751101619004418">കറൻസികളും വിദേശ വിനിമയവും</translation> +<translation id="6536221421038631327">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഉപകരണത്തിൽ നിന്ന് Passpoint സബ്സ്ക്രിപ്ഷൻ നീക്കം ചെയ്താൽ അനുബന്ധ നെറ്റ്വർക്കുകളും നീക്കം ചെയ്യും. നിങ്ങളുടെ സബ്സ്ക്രിപ്ഷൻ പ്ലാനിൽ മാറ്റങ്ങൾ വരുത്താൻ "<ph name="FRIENDLY_NAME" />" എന്നതിനെ ബന്ധപ്പെടുക. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">മ്യൂച്ച്വൽ ഫണ്ടുകൾ</translation> <translation id="6545864417968258051">Bluetooth സ്കാനിംഗ്</translation> <translation id="6547208576736763147">ഇടതുവശത്ത് ഇരട്ട പഞ്ച് ചെയ്യുക</translation> @@ -2747,7 +2743,6 @@ <translation id="7696089921647603491">ക്ലാസിക് റോക്കുകളും പഴയവയും</translation> <translation id="769721561045429135">ഇപ്പോൾ, ഈ ഉപകരണത്തിൽ മാത്രം ഉപയോഗിക്കാനാവുന്ന കാർഡുകൾ നിങ്ങൾക്കുണ്ട്. കാർഡുകൾ അവലോകനം ചെയ്യാൻ, 'തുടരുക' ക്ലിക്ക് ചെയ്യുക.</translation> <translation id="7698864304447945242">Google Play Services for AR അപ്ഡേറ്റ് ചെയ്യണോ?</translation> -<translation id="7699293099605015246">ഇപ്പോൾ ലേഖനങ്ങൾ ലഭ്യമല്ല</translation> <translation id="7701040980221191251">ഒന്നുമില്ല</translation> <translation id="7701544340847569275">പിശകുകളോടെ അപ്ഡേറ്റ് പൂർത്തിയായി</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> എന്നതിലേക്ക് പോകുക (സുരക്ഷിതമല്ല)<ph name="END_LINK" /></translation> @@ -3346,6 +3341,7 @@ <translation id="9219103736887031265">Images</translation> <translation id="922152298093051471">Chrome ഇഷ്ടാനുസൃതമാക്കുക</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">വൈഫൈ നെറ്റ്വർക്കുകൾ സജ്ജീകരിക്കാൻ <ph name="APP_NAME" /> ആപ്പിനെ അനുവദിക്കണോ?</translation> <translation id="936602727769022409">നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്കുള്ള ആക്സസ് നഷ്ടപ്പെടാനിടയുണ്ട്. ഇപ്പോൾ തന്നെ പാസ്വേഡ് മാറ്റാൻ Chromium ശുപാർശ ചെയ്യുന്നു. സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളോട് ആവശ്യപ്പെടും.</translation> <translation id="937457230470581909">മൃഗശാലകൾ, അക്വേറിയങ്ങൾ, വന്യമൃഗസങ്കേതം</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />എന്തൊക്കെ ഡാറ്റ ഉപയോഗിക്കുന്നു:<ph name="END_BOLD" /> ഈ ഉപകരണത്തിൽ Chrome ഉപയോഗിച്ച് നിങ്ങൾ സന്ദർശിച്ച സൈറ്റുകളുടെ ലിസ്റ്റായ, അടുത്തിടെയുള്ള ബ്രൗസിംഗ് ചരിത്രത്തെ അടിസ്ഥാനമാക്കിയുള്ളതാണ് നിങ്ങളുടെ പരസ്യ വിഷയങ്ങൾ.</translation>
diff --git a/components/strings/components_strings_mn.xtb b/components/strings/components_strings_mn.xtb index cda782a3..fb344ba 100644 --- a/components/strings/components_strings_mn.xtb +++ b/components/strings/components_strings_mn.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Та нууц үгээ танай байгууллагын удирддаггүй сайтад оруулсан байна. Бүртгэлээ хамгаалахын тулд бусад апп болон сайтад нууц үгээ дахин бүү ашиглана уу.</translation> <translation id="1257553931232494454">томруулалтын түвшин</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome-н тохиргоогоо удирдахын тулд эхлээд Tab, дараа нь Enter дээр дарна уу</translation> -<translation id="1263231323834454256">Унших жагсаалт</translation> <translation id="1264309058268477500">Өөр</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Төхөөрөмжийн түгжээг тайлах</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Гарах цаасны тавиур 8</translation> <translation id="1530707389502320859">Таны дөнгөж сая зочлохыг оролдсон сайт хуурамч юм шиг харагдаж байна. Халдагч этгээдүүд заримдаа харахад хэцүү, бага зэргийн өөрчлөлтийг URL-д оруулах замаар сайтыг дуурайдаг.</translation> <translation id="1532118530259321453">Энэ хуудас хэлэхдээ</translation> -<translation id="153384715582417236">Дууслаа</translation> <translation id="1536390784834419204">Хуудсыг орчуулах</translation> <translation id="1539840569003678498">Тайланг илгээсэн:</translation> <translation id="1549470594296187301">JavaScript энэ онцлогийг ашиглахын тулд идэвхжсэн байх ёстой.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Таны хөтчийг удирдаж байна</translation> <translation id="1746113442205726301">Y тэнхлэгийн дагуу зураг шилжүүлэх</translation> <translation id="1746531169546376413">0 хэм</translation> -<translation id="17513872634828108">Нээлттэй цонх</translation> <translation id="1752021286346845558">Шуудангийн хайрцаг 8</translation> <translation id="1753068535428855445">Болзоо, танилцах зар</translation> <translation id="1753706481035618306">Хуудaсны дугаар</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows сүлжээний оношилгоог ажиллуулж үзнэ үү<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium дахь Нууцлалтай горимын талаар нэмэлт мэдээлэл авах<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Таны нээлттэй таб энд харагдана</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Бүртгэлийнхээ мэдээлэл, нууцлал болон аюулгүй байдлыг удирдахын тулд эхлээд Tab, дараа нь Enter дээр дарна уу</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, олон үйлдэл хийх боломжтой, үйлдэл хооронд шилжихийн тулд Таб дээр дарна уу</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Бүлэг</translation> <translation id="2576880857912732701">Аюулгүй байдлын тохиргоог удирдах товчлуур, Chrome-н тохиргоонд Аюулгүй үзэх болон бусад тохиргоогоо удирдахын тулд Enter дээр дарна уу</translation> <translation id="2586657967955657006">Түр санах ой</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" />-н энэ болон бусад <ph name="OTHER_ARTICLE_COUNT" /> нийтлэлийг уншина уу.</translation> <translation id="2587841377698384444">Хадгалалтын сангийн API ID:</translation> <translation id="2594318783181750337">Вебийн шуурхай харагдац:</translation> <translation id="2595719060046994702">Энэ төхөөрөмж болон бүртгэлийг компани эсвэл бусад байгууллагаас удирдаагүй байна.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Буруу нууц үг</translation> <translation id="5051305769747448211">Шууд хошин шог</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ойролцоо хуваалцахыг ашиглан энэ файлыг илгээхийн тулд төхөөрөмж дээрээ сул зай (<ph name="DISK_SPACE_SIZE" />) гаргана уу}other{Ойролцоо хуваалцахыг ашиглан эдгээр файлыг илгээхийн тулд төхөөрөмж дээрээ сул зай (<ph name="DISK_SPACE_SIZE" />) гаргана уу}}</translation> -<translation id="5056549851600133418">Танд зориулсан нийтлэл</translation> <translation id="5060483733937416656">Та <ph name="PROVIDER_ORIGIN" />-г ашигладаг вебсайтууд дээр Windows Hello-р баталгаажуулахаар сонгосон. Энэ үйлчилгээ үзүүлэгч таны төлбөрийн хэрэгслийн талаарх мэдээллийг хадгалсан байж болзошгүй бөгөөд та <ph name="LINK_TEXT" /> боломжтой.</translation> <translation id="5061227663725596739">Та <ph name="LOOKALIKE_DOMAIN" />-г хайсан уу?</translation> <translation id="5066056036849835175">Хэвлэлийн түүх</translation> @@ -1743,6 +1737,8 @@ <translation id="5234764350956374838">Хэрэгсэхгүй болго</translation> <translation id="5239623327352565343">Байршлыг зөвшөөрсөн</translation> <translation id="5242889659037569123">Ачаа тээш, аяллын хэрэгсэл</translation> +<translation id="5244732203286792411">Ачаалж байна... + Үүнд нэг минут шаардаж магадгүй.</translation> <translation id="5250209940322997802">"Сүлжээнд холбогдох"</translation> <translation id="52517543715119994">Chrome-н онцлогуудын талаар мэдэж аваарай</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1860,7 +1856,6 @@ <translation id="5541086400771735334">Шуудангийн хайрцаг 7</translation> <translation id="5541546772353173584">Имэйл нэмэх</translation> <translation id="5543722831081909240">180 хэм</translation> -<translation id="5545756402275714221">Танд зориулсан нийтлэл</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Chrome нь таны нууц үгийг онлайнаар нийтэлсэн жагсаалтуудтай үе үе харьцуулж шалгадаг. Үүнийг хийх үед таны нууц үг болон хэрэглэгчийн нэр кодчилогдсон байх бөгөөд ингэснээр Google-г оролцуулаад хэн ч тэдгээрийг унших боломжгүй болно.</translation> <translation id="5556459405103347317">Дахин ачаал</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Цайвар номин ногоон</translation> <translation id="6272088941196661550">Chrome-н түүхдээ хамааралтай үйл ажиллагааг харахын тулд аяллаа үргэлжлүүлнэ үү</translation> <translation id="6272383483618007430">Google Шинэчлэл</translation> -<translation id="6276112860590028508">Таны унших жагсаалтын хуудас энд харагдана</translation> <translation id="627746635834430766">Дараагийн удаа төлбөрөө хурдан төлөхийн тулд Google Бүртгэлдээ карт болон тооцооны хаягаа хадгална уу.</translation> <translation id="6279183038361895380">Курсороо харуулахын тулд |<ph name="ACCELERATOR" />|-г дарна уу</translation> <translation id="6280223929691119688">Энэ хаяг руу хүргэх боломжгүй тул өөр хаяг сонгоно уу.</translation> <translation id="6284292079994426700">26 x 38 инч</translation> <translation id="6285507000506177184">Chrome-д таталтуудыг удирдах товчлуур, Chrome-д татсан файлуудаа удирдахын тулд Enter дээр дарна уу</translation> <translation id="6289939620939689042">Хуудасны өнгө</translation> -<translation id="6290238015253830360">Таны санал болгосон нийтлэл энд харагдана</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Хадгалж байна...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Сонгодог рок, хуучны хөгжим</translation> <translation id="769721561045429135">Одоогоор танд зөвхөн энэ төхөөрөмж дээр ашиглах боломжтой карт байна. Картыг шалгахын тулд Үргэлжлүүлэх сонголтыг дарна уу.</translation> <translation id="7698864304447945242">Google Play Services for AR-г шинэчлэх үү?</translation> -<translation id="7699293099605015246">Нийтлэл одоогоор боломжгүй байна</translation> <translation id="7701040980221191251">Тодорхойгүй</translation> <translation id="7701544340847569275">Шинэчлэлт алдаатайгаар дууссан</translation> <translation id="7704050614460855821"><ph name="SITE" /> (аюултай) <ph name="BEGIN_LINK" />руу үгрэлжлүүлэх<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index 828422c..6d807e4 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">तुमच्या संस्थेद्वारे व्यवस्थापित केल्या न जाणाऱ्या साइटवर तुम्ही तुमचा पासवर्ड एंटर केला आहे. तुमचे खाते संरक्षित करण्यासाठी इतर अॅप्स आणि साइटवर तुमच्या पासवर्डचा पुन्हा वापर करू नका.</translation> <translation id="1257553931232494454">झूम स्तर</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, तुमची Chrome सेटिंग्ज व्यवस्थापित करण्यासाठी, टॅब प्रेस करून एंटर प्रेस करा</translation> -<translation id="1263231323834454256">वाचन सूची</translation> <translation id="1264309058268477500">पर्यायी</translation> <translation id="1264974993859112054">क्रीडा</translation> <translation id="1266469291454105242">डिव्हाइस अनलॉक</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ट्रे ८</translation> <translation id="1530707389502320859">तुम्ही नुकतेच भेट देण्याचा प्रयत्न करत असलेली साइट बनावट असल्याची दिसते. आक्रमणकर्ते काहीवेळा URL मध्ये छोटे व पाहण्यासाठी कठीण असलेले बदल करून बनावट साइट बनवतात.</translation> <translation id="1532118530259321453">या पेजचे म्हणणे हे आहे की</translation> -<translation id="153384715582417236">सध्या इतकेच</translation> <translation id="1536390784834419204">पेजचे भाषांतर करायचे आहे</translation> <translation id="1539840569003678498">अहवाल पाठवला:</translation> <translation id="1549470594296187301">हे वैशिष्ट्य वापरण्यासाठी JavaScript सक्षम करणे आवश्यक आहे.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">तुमचा ब्राउझर व्यवस्थापित केला आहे</translation> <translation id="1746113442205726301">इमेज Y शिफ्ट</translation> <translation id="1746531169546376413">० अंश</translation> -<translation id="17513872634828108">खुले टॅब</translation> <translation id="1752021286346845558">मेलबॉक्स ८</translation> <translation id="1753068535428855445">डेटिंग आणि वैयक्तिक गोष्टी</translation> <translation id="1753706481035618306">पृष्ठ क्रमांक</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows नेटवर्क निदान चालवून पहा<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium मधील गुप्त मोड याबद्दल अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">तुमचे खुले टॅब येथे दिसतात</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, तुमच्या Google खाते मध्ये तुमची माहिती, गोपनीयता आणि सुरक्षा व्यवस्थापित करण्यासाठी टॅब व त्यानंतर एंटर प्रेस करा</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, एकाहून अधिक कृती उपलब्ध आहेत, प्रत्येकावर जाण्यासाठी टॅब प्रेस करा</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">गट</translation> <translation id="2576880857912732701">सुरक्षा सेटिंग्ज व्यवस्थापित करा बटण, Chrome सेटिंग्जमध्ये तुमचे सुरक्षित ब्राउझिंग आणि आणखी बरेच काही व्यवस्थापित करण्यासाठी एंटर प्रेस करा</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> कडील. हे आणि अन्य <ph name="OTHER_ARTICLE_COUNT" /> कथा वाचा.</translation> <translation id="2587841377698384444">शब्दकोश API आयडी:</translation> <translation id="2594318783181750337">जलद वेब दृश्य:</translation> <translation id="2595719060046994702">हे डिव्हाइस आणि खाते कंपनीद्वारे किंवा इतर संस्थेद्वारे व्यवस्थापित केले जात नाही.</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">चुकीचा पासवर्ड</translation> <translation id="5051305769747448211">लाइव्ह विनोदी कार्यक्रम</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby सह शेअरिंग वापरून ही फाइल पाठवण्यासाठी, तुमच्या डिव्हाइसवरील (<ph name="DISK_SPACE_SIZE" />) जागा मोकळी करा}other{Nearby सह शेअरिंग वापरून या फाइल पाठवण्यासाठी, तुमच्या डिव्हाइसवरील (<ph name="DISK_SPACE_SIZE" />) जागा मोकळी करा}}</translation> -<translation id="5056549851600133418">तुमच्यासाठी लेख</translation> <translation id="5060483733937416656">तुम्ही <ph name="PROVIDER_ORIGIN" /> वापरणाऱ्या वेबसाइटवर Windows Hello वापरून पडताळणी करण्याचे निवडले आहे. या पुरवठादाराने तुमच्या पेमेंट पद्धतीविषयी माहिती स्टोअर केलेली असू शकते, जी तुम्ही <ph name="LINK_TEXT" /> करू शकता.</translation> <translation id="5061227663725596739">तुम्हाला <ph name="LOOKALIKE_DOMAIN" />असे म्हणायचे होते का?</translation> <translation id="5066056036849835175">प्रिंटिंग इतिहास</translation> @@ -1741,6 +1735,8 @@ <translation id="5234764350956374838">डिसमिस करा</translation> <translation id="5239623327352565343">स्थानाला अनुमती आहे</translation> <translation id="5242889659037569123">सामान आणि प्रवासाशी संबंधित ॲक्सेसरी</translation> +<translation id="5244732203286792411">लोड करत आहे… + यासाठी एखादा मिनिट लागू शकतो.</translation> <translation id="5250209940322997802">"नेटवर्कशी कनेक्ट करा"</translation> <translation id="52517543715119994">Chrome च्या वैशिष्ट्यांविषयी जाणून घ्या</translation> <translation id="5251803541071282808">क्लाउड</translation> @@ -1858,7 +1854,6 @@ <translation id="5541086400771735334">मेलबॉक्स ७</translation> <translation id="5541546772353173584">ईमेल जोडा</translation> <translation id="5543722831081909240">१८० अंश</translation> -<translation id="5545756402275714221">तुमच्यासाठी लेख</translation> <translation id="5551890439174915351">१०० x २०० मिमी</translation> <translation id="5552137475244467770">ऑनलाइन प्रकाशित केलेल्या सूचींनुसार Chrome ठरावीक काळाने तुमचे पासवर्ड तपासते. हे करत असताना, तुमचे पासवर्ड आणि वापरकर्ता नावे एंक्रिप्ट केली जातात जेणेकरून Google च्या समावेशासह इतर कोणाकडून ती वाचली जाऊ नयेत.</translation> <translation id="5556459405103347317">रीलोड करा</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">फिकट हिरवट निळा</translation> <translation id="6272088941196661550">तुमच्या Chrome इतिहासामध्ये संबंधित अॅक्टिव्हिटी पाहण्यासाठी तुमचा प्रवास पुन्हा सुरू करा</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">आपल्या वाचन सूचीमधील पेज येथे दिसतात</translation> <translation id="627746635834430766">पुढील वेळी जलद पेमेंट देण्यासाठी, तुमच्या Google खात्यावर तुमचे कार्ड आणि बिलिंग पत्ता सेव्ह करा.</translation> <translation id="6279183038361895380">तुमचा कर्सर दर्शविण्यासाठी |<ph name="ACCELERATOR" />| प्रेस करा</translation> <translation id="6280223929691119688">या पत्त्यावर देऊ शकत नाही. वेगळा पत्ता निवडा.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Chrome मधील डाउनलोड व्यवस्थापित करा बटण, तुम्ही Chrome मध्ये डाउनलोड केलेल्या फाइल व्यवस्थापित करण्यासाठी, एंटर प्रेस करा</translation> <translation id="6289939620939689042">पेजचा रंग</translation> -<translation id="6290238015253830360">तुम्ही सुचविलेले लेख येथे दिसतील</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">सेव्ह करत आहे...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">क्लासिक रॉक आणि जुनी गाणी</translation> <translation id="769721561045429135">सध्या, तुमच्याकडे अशी कार्डे आहेत जी फक्त या डिव्हाइसवर वापरली जाऊ शकतात. कार्डांचे पुनरावलोकन करण्यासाठी सुरू ठेवा क्लिक करा.</translation> <translation id="7698864304447945242">Google Play Services for AR अपडेट करायचे आहे का?</translation> -<translation id="7699293099605015246">लेख आत्ता उपलब्ध नाहीत</translation> <translation id="7701040980221191251">काहीही नाही</translation> <translation id="7701544340847569275">अपडेट हे एररसह पूर्ण झाले</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> (असुरक्षित) वर सुरू ठेवा<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb index c024bce2..b55e29c9 100644 --- a/components/strings/components_strings_ms.xtb +++ b/components/strings/components_strings_ms.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Anda memasukkan kata laluan pada tapak yang tidak diurus oleh organisasi anda. Untuk melindungi akaun anda, jangan gunakan semula kata laluan anda pada apl dan tapak lain.</translation> <translation id="1257553931232494454">tahap zum</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Tekan Tab kemudian Enter untuk mengurus tetapan Chrome anda</translation> -<translation id="1263231323834454256">Senarai bacaan</translation> <translation id="1264309058268477500">Alternatif</translation> <translation id="1264974993859112054">Sukan</translation> <translation id="1266469291454105242">Buka kunci peranti</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Dulang 8</translation> <translation id="1530707389502320859">Tapak yang baru sahaja anda cuba lawati kelihatan seperti tapak palsu. Penyerang kadangkala meniru tapak dengan melakukan perubahan kecil yang sukar untuk dikesan pada URL.</translation> <translation id="1532118530259321453">Halaman ini menyatakan</translation> -<translation id="153384715582417236">Itu sahaja buat masa ini</translation> <translation id="1536390784834419204">Terjemahkan halaman</translation> <translation id="1539840569003678498">Laporan dihantar:</translation> <translation id="1549470594296187301">JavaScript mesti didayakan untuk menggunakan ciri ini.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Penyemak imbas anda diurus</translation> <translation id="1746113442205726301">Anjakan Y imej</translation> <translation id="1746531169546376413">0 darjah</translation> -<translation id="17513872634828108">Buka tab</translation> <translation id="1752021286346845558">Peti mel 8</translation> <translation id="1753068535428855445">Dating & peribadi</translation> <translation id="1753706481035618306">Nombor halaman</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Cuba jalankan Diagnostik Rangkaian Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Ketahui lebih lanjut tentang Inkognito dalam Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tab yang dibuka dipaparkan di sini</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, tekan kekunci Tab kemudian Enter untuk mengurus maklumat, privasi dan keselamatan anda dalam Google Account anda</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pelbagai tindakan tersedia, tekan Tab untuk pergi ke setiap tindakan</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Kumpulan</translation> <translation id="2576880857912732701">Butang urus tetapan keselamatan, tekan Enter untuk mengurus Penyemakan Imbas Selamat anda dan pelbagai lagi dalam tetapan Chrome</translation> <translation id="2586657967955657006">Papan Keratan</translation> -<translation id="2587730715158995865">Daripada <ph name="ARTICLE_PUBLISHER" />. Baca artikel ini dan <ph name="OTHER_ARTICLE_COUNT" /> cerita lain.</translation> <translation id="2587841377698384444">ID API Direktori:</translation> <translation id="2594318783181750337">Paparan web pantas:</translation> <translation id="2595719060046994702">Peranti dan akaun ini tidak diurus oleh syarikat atau organisasi lain.</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">Kata laluan tidak sah</translation> <translation id="5051305769747448211">Jenaka langsung</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Untuk menghantar fail ini menggunakan Kongsi Berdekatan, kosongkan ruang (<ph name="DISK_SPACE_SIZE" />) pada peranti anda}other{Untuk menghantar fail ini menggunakan Kongsi Berdekatan, kosongkan ruang (<ph name="DISK_SPACE_SIZE" />) pada peranti anda}}</translation> -<translation id="5056549851600133418">Artikel untuk anda</translation> <translation id="5060483733937416656">Anda memilih untuk mengesahkan dengan Windows Hello pada laman web yang menggunakan <ph name="PROVIDER_ORIGIN" />. Pembekal ini mungkin telah menyimpan maklumat tentang kaedah pembayaran anda, yang boleh anda <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Adakah anda maksudkan <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Sejarah pencetakan</translation> @@ -1743,6 +1737,8 @@ <translation id="5234764350956374838">Ketepikan</translation> <translation id="5239623327352565343">Lokasi dibenarkan</translation> <translation id="5242889659037569123">Bagasi & aksesori perjalanan</translation> +<translation id="5244732203286792411">Memuatkan... + Proses ini mungkin mengambil masa seketika.</translation> <translation id="5250209940322997802">"Sambung kepada rangkaian"</translation> <translation id="52517543715119994">Ketahui tentang ciri Chrome</translation> <translation id="5251803541071282808">Awan</translation> @@ -1860,7 +1856,6 @@ <translation id="5541086400771735334">Peti mel 7</translation> <translation id="5541546772353173584">Tambahkan E-mel</translation> <translation id="5543722831081909240">180 darjah</translation> -<translation id="5545756402275714221">Artikel untuk Anda</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome menyemak kata laluan anda secara berkala pada senarai yang telah diterbitkan dalam talian. Apabila melakukan tindakan ini, kata laluan dan nama pengguna anda akan disulitkan supaya data ini tidak dapat dibaca oleh sesiapa termasuk Google.</translation> <translation id="5556459405103347317">Muat Semula</translation> @@ -2142,14 +2137,12 @@ <translation id="6266934640124581640">Hijau Kebiruan Cerah</translation> <translation id="6272088941196661550">Sambung semula perjalanan anda untuk melihat aktiviti yang berkaitan dalam sejarah Chrome anda</translation> <translation id="6272383483618007430">Kemas Kini Google</translation> -<translation id="6276112860590028508">Halaman daripada senarai bacaan anda dipaparkan di sini</translation> <translation id="627746635834430766">Untuk membayar dengan lebih cepat selepas ini, simpan kad dan alamat pengebilan anda ke Akaun Google.</translation> <translation id="6279183038361895380">Tekan |<ph name="ACCELERATOR" />| untuk memaparkan kursor anda</translation> <translation id="6280223929691119688">Tidak dapat menghantar ke alamat ini. Pilih alamat lain.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Butang urus muat turun dalam Chrome, tekan Enter untuk mengurus fail yang telah anda muat turun dalam Chrome</translation> <translation id="6289939620939689042">Warna Halaman</translation> -<translation id="6290238015253830360">Artikel cadangan anda dipaparkan di sini</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Menyimpan...</translation> @@ -2749,7 +2742,6 @@ <translation id="7696089921647603491">Rock klasik & lagu lama</translation> <translation id="769721561045429135">Sekarang, anda mempunyai kad yang boleh digunakan pada peranti ini sahaja. Klik Teruskan untuk menyemak kad.</translation> <translation id="7698864304447945242">Kemas kini Google Play Services for AR?</translation> -<translation id="7699293099605015246">Artikel tidak tersedia sekarang</translation> <translation id="7701040980221191251">Tiada</translation> <translation id="7701544340847569275">Kemaskinian selesai dengan ralat</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Teruskan ke <ph name="SITE" /> (tidak selamat)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_my.xtb b/components/strings/components_strings_my.xtb index 41cf7934..bd64172 100644 --- a/components/strings/components_strings_my.xtb +++ b/components/strings/components_strings_my.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">သင့်အဖွဲ့အစည်းက စီမံခန့်ခွဲခြင်းမရှိသည့် ဝဘ်ဆိုက်တွင် သင်၏ စကားဝှက်ကို ထည့်ထားပါသည်။ သင့်အကောင့်ကို ကာကွယ်ရန် အခြားအက်ပ်နှင့် ဝဘ်ဆိုက်များတွင် သင့်စကားဝှက်ကို ပြန်မသုံးပါနှင့်။</translation> <translation id="1257553931232494454">ဇူးမ်အဆင့်များ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />၊ Chrome ဆက်တင်များ စီမံရန် ‘တဘ်ခလုတ်’ ပြီးနောက် Enter နှိပ်ပါ</translation> -<translation id="1263231323834454256">ဖတ်ရန် စာရင်း</translation> <translation id="1264309058268477500">အရန်</translation> <translation id="1264974993859112054">အားကစား</translation> <translation id="1266469291454105242">စက်လော့ခ်ဖွင့်ခြင်း</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ဗန်း ၈</translation> <translation id="1530707389502320859">သင်ဝင်ကြည့်လိုသော ဝဘ်ဆိုက်က အတုဖြစ်ပုံရသည်။ URL တွင် သေးငယ်ပြီး မြင်ရန်ခက်ခဲသော အပြောင်းအလဲများ ပြုလုပ်ခြင်းဖြင့် တိုက်ခိုက်သူများက တစ်ခါတစ်ရံ ဝဘ်ဆိုက်များကို ပုံတူပြုလုပ်ပါသည်။</translation> <translation id="1532118530259321453">ဤစာမျက်နှာက ဆိုထားသည်မှာ</translation> -<translation id="153384715582417236">ယခုအတွက်တော့ ဒီလောက်ပါပဲ</translation> <translation id="1536390784834419204">စာမျက်နှာကို ဘာသာပြန်ရန်</translation> <translation id="1539840569003678498">အစီရင်ခံစာ ပို့ပြီးပြီ-</translation> <translation id="1549470594296187301">ဤလုပ်ဆောင်ချက်အား ပြုလုပ်နိုင်ရန် JavaScript အား ဖွင့်ထားရမည်ဖြစ်၏။</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">သင်၏ဘရောင်ဇာကို စီမံခန့်ခွဲထားသည်</translation> <translation id="1746113442205726301">ပုံဒေါင်လိုက် အရွှေ့</translation> <translation id="1746531169546376413">၀ ဒီဂရီ</translation> -<translation id="17513872634828108">တဲဘ်များ ဖွင့်ရန်</translation> <translation id="1752021286346845558">စာတိုက်ပုံး ၈</translation> <translation id="1753068535428855445">ချိန်းတွေ့ခြင်းနှင့် ပုဂ္ဂိုလ်ရေးရာများ</translation> <translation id="1753706481035618306">စာမျက်နှာ နံပါတ်</translation> @@ -361,7 +358,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />ဝင်းဒိုးကွန်ရက်ပြဿနာရှာဖွေမှုကို ပြုလုပ်ကြည့်ပါ<ph name="END_LINK" />။</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium ရှိ ရုပ်ဖျက်မုဒ်အကြောင်း ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">သင်ဖွင့်ထားသည့်တဘ်များ ဤနေရာတွင် ပေါ်ပါမည်</translation> <translation id="1791429645902722292">Google ကစမတ်သော့ခတ်</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />၊ သင်၏ Google Account တွင် သင့်အချက်အလက်၊ ပုဂ္ဂိုလ်ရေးနှင့် လုံခြုံရေးဆိုင်ရာများကို စီမံရန် ‘တဘ်’ နှိပ်ပြီးနောက် Enter ခလုတ် နှိပ်ပါ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />၊ လုပ်ဆောင်ချက် အများအပြား ရရှိနိုင်သည်၊ ၎င်းတို့ကိုပတ်ကြည့်ရန် Tab နှိပ်ပါ</translation> @@ -369,6 +365,7 @@ <translation id="1801812870656502108">ပကတိအသွင်ကတ် အသေးစိတ်</translation> <translation id="1803020234906945288">ကျန်းမာသော စားသောက်မှုပုံစံ</translation> <translation id="1803351196216024260">သင့်မိုက်ခရိုဖုန်းသုံးရန် ခွင့်တောင်းနိုင်သည်</translation> +<translation id="1806174020048213474">ဤအက်ပ်က Wi-Fi အထောက်အထားများ ထည့်သွင်းရန် ခွင့်ပြုချက်တောင်းဆိုနေသည်။ စနစ်ထည့်သွင်းပြီးနောက် သင်၏ <ph name="DEVICE_TYPE" /> သည် ပါဝင်သည့် Wi-Fi ကွန်ရက်များကို အလိုအလျောက်ချိတ်ဆက်မည်။ ဤအထောက်အထားများဖယ်ရှားရန် အက်ပ်ကို ဖယ်ရှားပါ။</translation> <translation id="1807246157184219062">အလင်း</translation> <translation id="1807528111851433570">အစ စာမျက်နှာ</translation> <translation id="180991881384371158">သင့်ကတ်၏ နောက်ခြမ်းတွင် CVC ရှိသည်။ ၎င်းသည် လက်မှတ်အကွက်၏ ညာဘက်ထိပ်ရှိ ဂဏန်း ၃ လုံးပါကုဒ် ဖြစ်သည်။</translation> @@ -671,7 +668,6 @@ <translation id="257674075312929031">အုပ်စု</translation> <translation id="2576880857912732701">လုံခြုံရေးဆက်တင်များ စီမံရန် ခလုတ်၊ Chrome ဆက်တင်များတွင် သင်၏ ‘လုံခြုံစွာဖွင့်ကြည့်ခြင်း’ နှင့် အခြားအရာများကို စီမံရန် Enter နှိပ်ပါ</translation> <translation id="2586657967955657006">ကလစ်ဘုတ်</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> မှ။ ၎င်းနှင့် အခြားသတင်း <ph name="OTHER_ARTICLE_COUNT" /> ပုဒ်ကို ဖတ်ပါ။</translation> <translation id="2587841377698384444">လမ်းညွှန် API ID-</translation> <translation id="2594318783181750337">အမြန် ဝဘ်မြင်ကွင်း-</translation> <translation id="2595719060046994702">ဤကိရိယာနှင့် အကောင့်ကို ကုမ္ပဏီ သို့မဟုတ် အခြားအဖွဲ့အစည်းက စီမံခန့်ခွဲထားခြင်း မရှိပါ။</translation> @@ -1342,6 +1338,7 @@ <translation id="4270541775497538019">စီထည့်သည့်ပုံး ၆</translation> <translation id="4274173425554582601">ကွန်ပျူတာနှင့် အီလက်ထရောနစ်ပစ္စည်းများ</translation> <translation id="4275830172053184480">သင့်စက်ပစ္စည်းကို ပြန်လည် အစပြုပါ</translation> +<translation id="4276974990916607331">မလိုပါ</translation> <translation id="4277028893293644418">စကားဝှက် ပြင်ဆင်သတ်မှတ်ရန်</translation> <translation id="4277937682389409325">ဒေသတွင်းလိပ်စာ</translation> <translation id="4278390842282768270">ခွင့်ပြုထား</translation> @@ -1665,7 +1662,6 @@ <translation id="5045550434625856497">စကားဝှက် မမှန်ပါ</translation> <translation id="5051305769747448211">တိုက်ရိုက်လွှင့် ဟာသ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{‘အနီးတစ်ဝိုက် မျှဝေခြင်း’ သုံးပြီး ဤဖိုင်ကိုပို့ရန် သင်၏စက်တွင် နေရာလွတ် (<ph name="DISK_SPACE_SIZE" />) ပြုလုပ်ပါ}other{‘အနီးတစ်ဝိုက် မျှဝေခြင်း’ သုံးပြီး ဤဖိုင်များကိုပို့ရန် သင်၏စက်တွင် နေရာလွတ် (<ph name="DISK_SPACE_SIZE" />) ပြုလုပ်ပါ}}</translation> -<translation id="5056549851600133418">သင့်အတွက်ဆောင်းပါးများ</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> သုံးသည့် ဝဘ်ဆိုက်များတွင် Windows Hello ဖြင့် အတည်ပြုရန် သင်ရွေးထားသည်။ သင့်ငွေပေးချေနည်းလမ်း အချက်အလက်တွေကို ဤပံ့ပိုးသူက သိမ်းထားနိုင်ပြီး ၎င်းတို့ကို <ph name="LINK_TEXT" />နိုင်ပါသည်။</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" /> ကို ဆိုလိုခြင်းဖြစ်ပါသလား။</translation> <translation id="5066056036849835175">ပုံနှိပ်ထုတ်ယူမှု မှတ်တမ်း</translation> @@ -1703,6 +1699,7 @@ <translation id="5129534298163637277">အတည်ပြုခြင်း ဒိုင်ယာလော့</translation> <translation id="5135404736266831032">လိပ်စာများကို စီမံရန်...</translation> <translation id="5136841603454277753">မှန်ကန်သောကုဒ် ထည့်ပါ</translation> +<translation id="5137761395480718572">ဤအက်ပ်က Wi-Fi အထောက်အထားများ ထည့်သွင်းရန် ခွင့်ပြုချက်တောင်းဆိုနေသည်။ စနစ်ထည့်သွင်းပြီးနောက် သင်၏ <ph name="DEVICE_TYPE" /> သည် ပါဝင်သည့် Wi-Fi ကွန်ရက်များကို အလိုအလျောက်ချိတ်ဆက်မည်။ ဤအထောက်အထားများဖယ်ရှားရန် အက်ပ်ကို ဖယ်ရှားပါ။<ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">ပကတိအသွင်ကတ်ကို ယခု မရနိုင်ပါ။ သင်၏ဘဏ်ကို ဆက်သွယ်ပါ</translation> <translation id="5138227688689900538">လျှော့ပြရန်</translation> <translation id="5145883236150621069">ပေါ်လစီတုံ့ပြန်မှုတွင် အမှားကုဒ်ရှိသည်။</translation> @@ -1759,6 +1756,7 @@ <translation id="5273881944177595304">ဝဘ်အက်ပ်နှင့် အွန်လိုင်းတူးလ်များ</translation> <translation id="5274025349362408263">စာအုပ် စာပေ</translation> <translation id="5279286380302340275">ဒေါင်းလုဒ်များစီမံရန်</translation> +<translation id="5279453600310613955">မလိုပါ</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">မှတ်တမ်း သတ်မှတ်ချက်များ</translation> <translation id="528468243742722775">အဆုံး</translation> @@ -1862,7 +1860,6 @@ <translation id="5541086400771735334">စာတိုက်ပုံး ၇</translation> <translation id="5541546772353173584">အီးမေးလ် ထည့်ပါ</translation> <translation id="5543722831081909240">၁၈၀ ဒီဂရီ</translation> -<translation id="5545756402275714221">သင့်အတွက် သတင်းဆောင်းပါးများ</translation> <translation id="5551890439174915351">၁၀၀ x ၂၀၀ မီလီမီတာ</translation> <translation id="5552137475244467770">သင်၏စကားဝှက်များကို အွန်လိုင်းတွင်ထုတ်ဝေထားသော စာရင်းများနှင့်တိုက်၍ Chrome က အခါအားလျော်စွာ စစ်ဆေးပါသည်။ ဤသို့စစ်ဆေးသည့်အခါ သင်၏စကားဝှက်နှင့် အသုံးပြုသူအမည်များကို အသွင်ဝှက်ထားသောကြောင့် Google အပါအဝင် မည်သူမျှ ၎င်းတို့ကို ဖတ်၍မရပါ။</translation> <translation id="5556459405103347317">ပြန်တင်ရန်</translation> @@ -2143,14 +2140,12 @@ <translation id="6266934640124581640">စိမ်းပြာဖျော့</translation> <translation id="6272088941196661550">သင်၏ Chrome မှတ်တမ်းရှိ သက်ဆိုင်ရာလုပ်ဆောင်ချက်ကို ကြည့်ရန် သင့်ခရီးစဉ်ကို ဆက်လုပ်ပါ</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">ဖတ်ရန်စာရင်းမှ စာမျက်နှာများကို ဤနေရာတွင် တွေ့ရပါမည်</translation> <translation id="627746635834430766">နောင်တွင် မြန်ဆန်စွာပေးချေနိုင်ရန် သင်၏ကတ်နှင့် ငွေတောင်းခံလွှာပို့သော လိပ်စာကို သင့် Google အကောင့်တွင် သိမ်းပါ။</translation> <translation id="6279183038361895380">သင်၏ ညွှန်းမြားကို ပြပေးရန် |<ph name="ACCELERATOR" />ကို နှိပ်ပါ</translation> <translation id="6280223929691119688">ဤလိပ်စာသို့ ပို့၍မရပါ။ အခြားလိပ်စာတစ်ခုကို ရွေးပါ။</translation> <translation id="6284292079994426700">၂၆ x ၃၈ လက်မ</translation> <translation id="6285507000506177184">Chrome တွင် ဒေါင်းလုဒ်များ စီမံရန်ခလုတ်၊ Chrome တွင် ဒေါင်းလုဒ်လုပ်ခဲ့သည့်ဖိုင်များကို စီမံရန် Enter နှိပ်ပါ</translation> <translation id="6289939620939689042">စာမျက်နှာ အရောင်</translation> -<translation id="6290238015253830360">သင်အကြံပြုထားသည့် ဆောင်းပါးများ ဤနေရာတွင် ပေါ်ပါမည်</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC-</translation> <translation id="6295855836753816081">သိမ်းဆည်းနေသည်...</translation> @@ -2253,6 +2248,7 @@ <translation id="6529173248185917884">ခုနှစ်ခုမြောက်အလိပ်</translation> <translation id="6529602333819889595">&ဖျက်ရန်ကို ပြန်လုပ်ရန်</translation> <translation id="6535751101619004418">ငွေကြေးနှင့် နိုင်ငံခြားငွေလဲလှယ်ခြင်း</translation> +<translation id="6536221421038631327">သင်၏ <ph name="DEVICE_TYPE" /> မှ ‘ဖြတ်သန်းခွင့်ပြုမှတ်’ စာရင်းသွင်းမှုကို ဖယ်ရှားခြင်းဖြင့် ဆက်စပ်ကွန်ရက်များကို ဖယ်ရှားပါမည်။ သင်၏စာရင်းသွင်းမှုအစီအစဉ်ကို အပြောင်းအလဲပြုလုပ်ရန် “<ph name="FRIENDLY_NAME" />” ထံသို့ ဆက်သွယ်ပါ။ <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">ဝိုင်းဝန်း ရင်းနှီးမြှုပ်နှံငွေ</translation> <translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေခြင်း</translation> <translation id="6547208576736763147">ဘယ်ဘက်တွင် နှစ်ချက်ဖောက်ရန်</translation> @@ -2751,7 +2747,6 @@ <translation id="7696089921647603491">ဂန္ထဝင်ရော့ခ်နှင့် သီချင်းဟောင်းများ</translation> <translation id="769721561045429135">လက်ရှိတွင် ဤစက်ပစ္စည်းပေါ်၌ အသုံးပြုနိုင်သည့် ကတ်များသာရှိပါသည်။ ကတ်များ ပြန်စစ်ဆေးရန် 'ရှေ့ဆက်ရန်' ကိုနှိပ်ပါ။</translation> <translation id="7698864304447945242">AR အတွက် Google Play ဝန်ဆောင်မှုများကို အပ်ဒိတ်လုပ်မလား။</translation> -<translation id="7699293099605015246">သတင်းဆောင်းပါးများကို လောလောဆယ် မရနိုင်သေးပါ</translation> <translation id="7701040980221191251">မရှိ</translation> <translation id="7701544340847569275">အပ်ဒိတ်ပြီးသွားပြီး အမှားများပါဝင်သည်</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> သို့ ဆက်လုပ်ရန် (မလုံခြုံ)<ph name="END_LINK" /></translation> @@ -3351,6 +3346,7 @@ <translation id="9219103736887031265">ပုံများ</translation> <translation id="922152298093051471">Chrome ကို စိတ်ကြိုက်ပြင်ရန်</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385"><ph name="APP_NAME" /> အက်ပ်ကို Wi-Fi ကွန်ရက်များ စနစ်ထည့်သွင်းခွင့်ပြုမလား။</translation> <translation id="936602727769022409">သင်၏ Google အကောင့်ကို အသုံးပြုခွင့် ဆုံးရှုံးနိုင်သည်။ သင့်စကားဝှက်ကို ယခုပင်ပြောင်းရန် Chromium က အကြံပြုပါသည်။ သင့်အား လက်မှတ်ထိုးဝင်ခိုင်းပါမည်။</translation> <translation id="937457230470581909">တိရစ္ဆာန်ရုံ၊ ငါးပြတိုက်နှင့် ထိန်းသိမ်းထားရှိမှုများ</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />အသုံးပြုသည့် ဒေတာ-<ph name="END_BOLD" /> သင်၏ ကြော်ငြာအကြောင်းအရာများကို မကြာသေးမီက ကြည့်ရှုမှုမှတ်တမ်းအပေါ် အခြေခံထားသည်။ ၎င်းသည် ဤစက်တွင် Chrome ဖြင့် သင်ဝင်ကြည့်သည့်ဝဘ်ဆိုက်များ၏ စာရင်းဖြစ်သည်။</translation>
diff --git a/components/strings/components_strings_ne.xtb b/components/strings/components_strings_ne.xtb index fa58db2..46c9487 100644 --- a/components/strings/components_strings_ne.xtb +++ b/components/strings/components_strings_ne.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">तपाईंले आफ्नो संगठनले व्यवस्थापन नगरेको कुनै साइटमा आफ्नो पासवर्ड प्रविष्ट गर्नुभयो। आफ्नो खाता सुरक्षित गर्न, अन्य एप र साइटहरूमा तपाईंको पासवर्ड पुनः प्रयोग नगर्नुहोस्।</translation> <translation id="1257553931232494454">जुमका स्तरहरू</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome मा आफूले तय गरेका सेटिङ मिलाउन Tab थिच्नुहोस् अनि Enter थिच्नुहोस्</translation> -<translation id="1263231323834454256">पाठ्य सूची</translation> <translation id="1264309058268477500">वैकल्पिक</translation> <translation id="1264974993859112054">खेलकुद</translation> <translation id="1266469291454105242">डिभाइस अनलक</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ट्रे ८</translation> <translation id="1530707389502320859">तपाईंले भर्खरै भ्रमण गर्न खोज्नुभएको साइट नक्कली हो जस्तो छ। आक्रमणकारीहरूले कहिलेकाहीँ URL मा ससाना, स्पष्ट नदेखिने परिवर्तनहरू गरी नक्कली साइट सिर्जना गर्न सक्छन्।</translation> <translation id="1532118530259321453">यो पृष्ठले यसो भन्छ</translation> -<translation id="153384715582417236">अहिलेलाई यति मात्र!</translation> <translation id="1536390784834419204">यो पृष्ठ अनुवाद गर्नुहोस्</translation> <translation id="1539840569003678498">रिपोर्ट पठाइएको मिति र समय:</translation> <translation id="1549470594296187301">यो सुविधा प्रयोग गर्न JavaScript सक्रिय गर्नुपर्छ।</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">तपाईंको ब्राउजर व्यवस्थित छ</translation> <translation id="1746113442205726301">छविको Y सिफ्ट</translation> <translation id="1746531169546376413">० डिग्री</translation> -<translation id="17513872634828108">खुला ट्याबहरू</translation> <translation id="1752021286346845558">मेलबक्स ८</translation> <translation id="1753068535428855445">डेटिङ तथा व्यक्तिगत कुराहरू</translation> <translation id="1753706481035618306">पृष्ठ संख्या</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows नेटवर्क सम्बन्धी निदान चलाएर हेर्नुहोस्<ph name="END_LINK" />।</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium मा उपलब्ध इन्कोग्निटो मोडका बारेमा थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">तपाईंका खुला ट्याबहरू यहाँ देखा पर्छन्</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, आफ्नो Google खातामा गई तपाईंको जानकारी, गोपनीयता र सुरक्षाको व्यवस्थापन गर्न Tab थिच्नुहोस् अनि Enter थिच्नुहोस्</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, एकभन्दा बढी कार्य गर्न सकिन्छ, एक एक गरी प्रत्येक कार्य गर्न Tab थिच्नुहोस्</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">समूह</translation> <translation id="2576880857912732701">"सुरक्षासम्बन्धी सेटिङ मिलाउनुहोस्" नामक बटन, तपाईं Chrome का सेटिङमा गई Safe Browsing का सेटिङ तथा सुरक्षासम्बन्धी अन्य सेटिङ मिलाउन चाहनुहुन्छ भने Enter थिच्नुहोस्</translation> <translation id="2586657967955657006">क्लिपबोर्ड</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> बाट। यो र <ph name="OTHER_ARTICLE_COUNT" /> अन्य कथाहरू पढ्नुहोस्।</translation> <translation id="2587841377698384444">डाइरेक्ट्री API ID:</translation> <translation id="2594318783181750337">संक्षिप्त वेब भ्यू:</translation> <translation id="2595719060046994702">कुनै कम्पनी वा अन्य सङ्गठनले यो डिभाइस वा खाताको व्यवस्थापन गर्दैन।</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">गलत पासवर्ड</translation> <translation id="5051305769747448211">लाइभ कमेडी</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{नजिकैका डिभाइससँग सेयर गर्ने सुविधा प्रयोग गरी यो फाइल पठाउन आफ्नो डिभाइसको भण्डारणमा ठाउँ (<ph name="DISK_SPACE_SIZE" />) खाली गर्नुहोस्}other{नजिकैका डिभाइससँग सेयर गर्ने सुविधा प्रयोग गरी यी फाइलहरू पठाउन आफ्नो डिभाइसको भण्डारणमा ठाउँ (<ph name="DISK_SPACE_SIZE" />) खाली गर्नुहोस्}}</translation> -<translation id="5056549851600133418">तपाईँका लागि लेखहरू</translation> <translation id="5060483733937416656">तपाईंले <ph name="PROVIDER_ORIGIN" /> प्रयोग गर्ने वेबसाइटमा Windows Hello मार्फत पुष्टि गर्ने विकल्प छनौट गर्नुभएको छ। यो प्रदायकले तपाईंको भुक्तानी विधिसम्बन्धी जानकारी भण्डारण गरेको हुन सक्छ, तपाईं सो जानकारी <ph name="LINK_TEXT" /> गर्न सक्नुहुन्छ।</translation> <translation id="5061227663725596739">तपाईंले <ph name="LOOKALIKE_DOMAIN" /> भन्न चाहनुभएको हो?</translation> <translation id="5066056036849835175">विगतमा प्रिन्ट गरिएका कुराहरू</translation> @@ -1739,6 +1733,8 @@ <translation id="5234764350956374838">खारेज गर्नुहोस्</translation> <translation id="5239623327352565343">लोकेसन प्रयोग गर्ने अनुमति दिइएको छ</translation> <translation id="5242889659037569123">झोला तथा यात्रासम्बन्धी सामग्रीहरू</translation> +<translation id="5244732203286792411">लोड गरिँदै छ... + यो कार्य पूरा हुन केही बेर लाग्न सक्छ।</translation> <translation id="5250209940322997802">"नेटवर्कमा कनेक्ट गर्नुहोस्"</translation> <translation id="52517543715119994">Chrome का सुविधाहरूका बारेमा जान्नुहोस्</translation> <translation id="5251803541071282808">क्लाउड</translation> @@ -1856,7 +1852,6 @@ <translation id="5541086400771735334">मेलबक्स ७</translation> <translation id="5541546772353173584">इमेल थप्नुहोस्</translation> <translation id="5543722831081909240">१८० डिग्री</translation> -<translation id="5545756402275714221">तपाईंका लागि सुझाव दिइएका लेखहरू</translation> <translation id="5551890439174915351">१०० x २०० मिलिमिटर</translation> <translation id="5552137475244467770">Chrome ले तपाईंका पासवर्डहरू अनलाइनमा प्रकाशित सूचीमा परेका छन् कि छैनन् भनी आवधिक रूपमा जाँच गर्छ। यसो गर्दा, Google लगायत कसैले पनि तपाईंका पासवर्ड र प्रयोगकर्ता नामहरू पढ्न नसकून् भन्नाका लागि तिनलाई इन्क्रिप्ट गरिन्छ।</translation> <translation id="5556459405103347317">पुन: लोड गर्नुहोस्</translation> @@ -2138,14 +2133,12 @@ <translation id="6266934640124581640">हल्का निलो र हरियो</translation> <translation id="6272088941196661550">तपाईं Chrome को ब्राउजिङ इतिहासमा सान्दर्भिक गतिविधि हेर्न चाहनुहुन्छ भने खोज्ने क्रम सुचारु गर्नुहोस्</translation> <translation id="6272383483618007430">Google अपडेट</translation> -<translation id="6276112860590028508">तपाईंको पाठ्य सूचीका पृष्ठहरू यहाँ देखिन्छन्</translation> <translation id="627746635834430766">अर्को पटक अझ छिटो भुक्तानी गर्न आफ्नो Google खातामा आफ्नो कार्ड र बिलिङ ठेगाना सेभ गर्नुहोस्।</translation> <translation id="6279183038361895380">तपाईंको कर्सर देखाउन |<ph name="ACCELERATOR" />| लाई थिच्नुहोस्</translation> <translation id="6280223929691119688">यो ठेगानामा डेलिभर गर्न सकिँदैन। कुनै अर्को ठेगाना चयन गर्नुहोस्।</translation> <translation id="6284292079994426700">२६ x ३८ इन्च</translation> <translation id="6285507000506177184">Chrome मा डाउनलोडहरू व्यवस्थापन गर्नुहोस्, तपाईं आफूले Chrome मा डाउनलोड गरेका फाइल व्यवस्थापन गर्न चाहनुहुन्छ भने Enter थिच्नुहोस्</translation> <translation id="6289939620939689042">पृष्ठको रङ</translation> -<translation id="6290238015253830360">तपाईंका सुझाव गरिएका लेखहरू यहाँ देखिन्छन्</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">सुरक्षित गर्दै...</translation> @@ -2745,7 +2738,6 @@ <translation id="7696089921647603491">क्लासिक रक तथा ओल्डिज</translation> <translation id="769721561045429135">यस बेला, तपाईंसँग यस यन्त्रमा मात्र प्रयोग गर्न मिल्ने कार्डहरू छन्। कार्डहरूको समीक्षा गर्न जारी राख्नुहोस् नामक बटनमा क्लिक गर्नुहोस्।</translation> <translation id="7698864304447945242">Google Play Services for AR अपडेट गर्ने हो?</translation> -<translation id="7699293099605015246">अहिले लेखहरू उपलब्ध छैनन्</translation> <translation id="7701040980221191251">कुनै पनि होइन</translation> <translation id="7701544340847569275">अपडेट गर्ने कार्य त्रुटिसहित सम्पन्न भएको छ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /> <ph name="SITE" /> मा अगाडि बढ्नु (असुरक्षित छ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb index 2ba7b036..f4d58d06 100644 --- a/components/strings/components_strings_nl.xtb +++ b/components/strings/components_strings_nl.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Je hebt je wachtwoord ingevoerd op een site die niet door je organisatie wordt beheerd. Hergebruik je wachtwoord niet voor andere apps en sites om je account te beschermen.</translation> <translation id="1257553931232494454">zoomniveaus</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk op Tab en daarna op Enter om je Chrome-instellingen te beheren</translation> -<translation id="1263231323834454256">Leeslijst</translation> <translation id="1264309058268477500">Alternatief</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Apparaatontgrendeling</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Lade 8</translation> <translation id="1530707389502320859">De site die je zojuist probeerde te bezoeken, lijkt nep te zijn. Aanvallers maken sites soms na door kleine wijzigingen in de URL aan te brengen die je moeilijk kunt zien.</translation> <translation id="1532118530259321453">Deze pagina meldt het volgende</translation> -<translation id="153384715582417236">Dat is voorlopig alles</translation> <translation id="1536390784834419204">Pagina vertalen</translation> <translation id="1539840569003678498">Melding gestuurd:</translation> <translation id="1549470594296187301">JavaScript moet aanstaan om deze functie te kunnen gebruiken.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Je browser wordt beheerd</translation> <translation id="1746113442205726301">Beeldverschuiving Y</translation> <translation id="1746531169546376413">0 graden</translation> -<translation id="17513872634828108">Geopende tabbladen</translation> <translation id="1752021286346845558">Mailbox 8</translation> <translation id="1753068535428855445">Dating en contactadvertenties</translation> <translation id="1753706481035618306">Paginanummer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Voer Windows Netwerkcontrole uit<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Meer informatie over incognito in Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Je geopende tabbladen zie je hier</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk op Tab en daarna op Enter om je gegevens, privacy en beveiliging te beheren in je Google-account</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, er zijn meerdere acties beschikbaar, druk op 'Tab' om erdoorheen te bladeren</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Gegevens van virtuele kaart</translation> <translation id="1803020234906945288">Gezond eten</translation> <translation id="1803351196216024260">Kan vragen of deze site je microfoon mag gebruiken</translation> +<translation id="1806174020048213474">Deze app wil rechten om wifi-inloggegevens te installeren. Na het instellen maakt je <ph name="DEVICE_TYPE" /> automatisch verbinding met deelnemende wifi-netwerken. Verwijder de app om deze inloggegevens te verwijderen.</translation> <translation id="1807246157184219062">Licht</translation> <translation id="1807528111851433570">Startblad</translation> <translation id="180991881384371158">De CVC-code staat achter op je kaart. Het zijn de laatste 3 cijfers rechtsboven in het handtekeningvak.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Groep</translation> <translation id="2576880857912732701">De knop Beveiligingsinstellingen beheren, druk op Enter om Safe Browsing en meer te beheren in de Chrome-instellingen</translation> <translation id="2586657967955657006">Klembord</translation> -<translation id="2587730715158995865">Van <ph name="ARTICLE_PUBLISHER" />. Lees dit en <ph name="OTHER_ARTICLE_COUNT" /> andere artikelen.</translation> <translation id="2587841377698384444">Directory API-ID:</translation> <translation id="2594318783181750337">Snelle webweergave:</translation> <translation id="2595719060046994702">Dit apparaat en dit account worden niet beheerd door een bedrijf of andere organisatie.</translation> @@ -1336,6 +1332,7 @@ <translation id="4270541775497538019">Stapeleenheid 6</translation> <translation id="4274173425554582601">Computers en elektronica</translation> <translation id="4275830172053184480">Je apparaat opnieuw opstarten</translation> +<translation id="4276974990916607331">Nee, bedankt</translation> <translation id="4277028893293644418">Wachtwoord opnieuw instellen</translation> <translation id="4277937682389409325">Lokaal adres</translation> <translation id="4278390842282768270">Toegestaan</translation> @@ -1659,7 +1656,6 @@ <translation id="5045550434625856497">Onjuist wachtwoord</translation> <translation id="5051305769747448211">Stand-up comedy</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Als je dit bestand wilt sturen met Dichtbij delen, moet je ruimte (<ph name="DISK_SPACE_SIZE" />) op je apparaat vrijmaken}other{Als je deze bestanden wilt sturen met Dichtbij delen, moet je ruimte (<ph name="DISK_SPACE_SIZE" />) op je apparaat vrijmaken}}</translation> -<translation id="5056549851600133418">Artikelen voor jou</translation> <translation id="5060483733937416656">Je hebt ervoor gekozen om te verifiëren met Windows Hello op websites die <ph name="PROVIDER_ORIGIN" /> gebruiken. Deze provider heeft misschien informatie over je betaalmethode opgeslagen. Hiervoor kun je <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Bedoelde je <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Afdrukgeschiedenis</translation> @@ -1697,6 +1693,7 @@ <translation id="5129534298163637277">Bevestigingsdialoogvenster</translation> <translation id="5135404736266831032">Adressen beheren...</translation> <translation id="5136841603454277753">Geef de juiste code op</translation> +<translation id="5137761395480718572">Deze app wil rechten om wifi-inloggegevens te installeren. Na het instellen maakt je <ph name="DEVICE_TYPE" /> automatisch verbinding met deelnemende wifi-netwerken. Verwijder de app om deze inloggegevens te verwijderen. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtuele kaart nu niet beschikbaar, neem contact op met je bank</translation> <translation id="5138227688689900538">Minder bekijken</translation> <translation id="5145883236150621069">Foutcode aanwezig in de beleidsreactie</translation> @@ -1737,6 +1734,8 @@ <translation id="5234764350956374838">Sluiten</translation> <translation id="5239623327352565343">Locatie toegestaan</translation> <translation id="5242889659037569123">Koffers en reisaccessoires</translation> +<translation id="5244732203286792411">Laden... + Dit kan even duren.</translation> <translation id="5250209940322997802">'Verbinding maken met netwerk'</translation> <translation id="52517543715119994">Meer informatie over Chrome-functies</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1751,6 +1750,7 @@ <translation id="5273881944177595304">Web-apps en online tools</translation> <translation id="5274025349362408263">Boeken en literatuur</translation> <translation id="5279286380302340275">Downloads beheren</translation> +<translation id="5279453600310613955">Nee, bedankt</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Documenteigenschappen</translation> <translation id="528468243742722775">Beëindigen</translation> @@ -1854,7 +1854,6 @@ <translation id="5541086400771735334">Mailbox 7</translation> <translation id="5541546772353173584">E-mailadres toevoegen</translation> <translation id="5543722831081909240">180 graden</translation> -<translation id="5545756402275714221">Artikelen voor jou</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome vergelijkt periodiek je wachtwoorden met lijsten die online zijn gepubliceerd. Als dit wordt gedaan, zijn je wachtwoorden en gebruikersnamen versleuteld, zodat ze door niemand (inclusief Google) kunnen worden gelezen.</translation> <translation id="5556459405103347317">Opnieuw laden</translation> @@ -2135,14 +2134,12 @@ <translation id="6266934640124581640">Lichtblauwgroen</translation> <translation id="6272088941196661550">Hervat je traject om relevante activiteit in je Chrome-geschiedenis te bekijken</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Pagina's uit je leeslijst zie je hier</translation> <translation id="627746635834430766">Sla je pas en factuuradres op in je Google-account zodat je de volgende keer sneller kunt betalen.</translation> <translation id="6279183038361895380">Druk op |<ph name="ACCELERATOR" />| om je cursor te bekijken</translation> <translation id="6280223929691119688">Kan niet bezorgen op dit adres. Selecteer een ander adres.</translation> <translation id="6284292079994426700">26 x 38 inch</translation> <translation id="6285507000506177184">De knop Downloads in Chrome beheren, druk op Enter om bestanden te beheren die je hebt gedownload in Chrome</translation> <translation id="6289939620939689042">Paginakleur</translation> -<translation id="6290238015253830360">Je voorgestelde artikelen zie je hier</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Opslaan...</translation> @@ -2245,6 +2242,7 @@ <translation id="6529173248185917884">7e rol</translation> <translation id="6529602333819889595">&Opnieuw verwijderen</translation> <translation id="6535751101619004418">Valuta en wisselkantoren</translation> +<translation id="6536221421038631327">Als je een Passpoint-abonnement van je <ph name="DEVICE_TYPE" /> verwijdert, worden de bijbehorende netwerken verwijderd. Neem contact op met <ph name="FRIENDLY_NAME" /> om wijzigingen aan te brengen in je abonnement. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Beleggingsfondsen</translation> <translation id="6545864417968258051">Bluetooth-scannen</translation> <translation id="6547208576736763147">Twee perforaties links</translation> @@ -2742,7 +2740,6 @@ <translation id="7696089921647603491">Classic rock en gouwe ouwe</translation> <translation id="769721561045429135">Je hebt momenteel passen die alleen op dit apparaat kunnen worden gebruikt. Klik op Doorgaan om de passen te bekijken.</translation> <translation id="7698864304447945242">Google Play-services voor AR updaten?</translation> -<translation id="7699293099605015246">Er zijn op dit moment geen artikelen beschikbaar</translation> <translation id="7701040980221191251">Geen</translation> <translation id="7701544340847569275">Update voltooid met fouten</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Doorgaan naar <ph name="SITE" /> (onveilig)<ph name="END_LINK" /></translation> @@ -3341,6 +3338,7 @@ <translation id="9219103736887031265">Afbeeldingen</translation> <translation id="922152298093051471">Chrome aanpassen</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Toestaan dat de <ph name="APP_NAME" />-app wifi-netwerken instelt?</translation> <translation id="936602727769022409">Je kunt de toegang tot je Google-account kwijtraken. Chromium raadt je aan je wachtwoord nu te wijzigen. Je wordt gevraagd in te loggen op je account.</translation> <translation id="937457230470581909">Dierentuinen, aquaria en natuurreservaten</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Welke gegevens worden gebruikt:<ph name="END_BOLD" /> Je advertentieonderwerpen zijn gebaseerd op je recente browsegeschiedenis, een lijst met sites die je via Chrome op dit apparaat hebt bezocht.</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb index ba7de61c..026d4a8 100644 --- a/components/strings/components_strings_no.xtb +++ b/components/strings/components_strings_no.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Du har skrevet inn passordet ditt på et nettsted som ikke administreres av organisasjonen din. For å beskytte kontoen din må du ikke bruke det samme passordet i andre apper eller på andre nettsteder.</translation> <translation id="1257553931232494454">zoomnivåer</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å administrere Chrome-innstillingene dine</translation> -<translation id="1263231323834454256">Leseliste</translation> <translation id="1264309058268477500">Alternativ skuff</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Enhetsopplåsing</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Skuff 8</translation> <translation id="1530707389502320859">Nettstedet du nettopp prøvde å besøke, ser falskt ut. Noen ganger etterligner angripere nettsteder ved å gjøre små endringer som er vanskelige å se, i nettadressen.</translation> <translation id="1532118530259321453">På denne siden står det</translation> -<translation id="153384715582417236">Det var alt for denne gangen</translation> <translation id="1536390784834419204">Oversett siden</translation> <translation id="1539840569003678498">Rapporten er sendt:</translation> <translation id="1549470594296187301">Denne funksjonen kan ikke brukes når JavaScript er slått av.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Nettleseren din administreres</translation> <translation id="1746113442205726301">Y-forskyvning av bilde</translation> <translation id="1746531169546376413">0 grader</translation> -<translation id="17513872634828108">Åpne faner</translation> <translation id="1752021286346845558">Postkasse 8</translation> <translation id="1753068535428855445">Stevnemøter og kontaktannonser</translation> <translation id="1753706481035618306">Sidenummer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Prøv å kjøre Windows Nettverksdiagnose<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Finn ut mer om Inkognito i Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">De åpne fanene dine vises her</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" /> – trykk på Tab og deretter på Enter for å administrere informasjon, personvern og sikkerhet i Google-kontoen din</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" /> – flere handlinger er tilgjengelige. Trykk på Tab for å bla gjennom dem</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Detaljer om virtuelt kort</translation> <translation id="1803020234906945288">Helsekost</translation> <translation id="1803351196216024260">Kan be om å få bruke mikrofonen din</translation> +<translation id="1806174020048213474">Denne appen ber om tillatelse til å installere wifi-legitimasjon. Etter konfigurering kobles <ph name="DEVICE_TYPE" /> automatisk til deltakende wifi-nettverk. For å fjerne denne legitimasjonen, avinstaller appen.</translation> <translation id="1807246157184219062">Lys</translation> <translation id="1807528111851433570">Startark</translation> <translation id="180991881384371158">CVC-koden står på baksiden av kortet. Det er de siste tre sifrene øverst til høyre i signaturfeltet.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Gruppér</translation> <translation id="2576880857912732701">Knappen «Administrer sikkerhetsinnstillinger» – trykk på Enter for å administrere Safe Browsing med mer i Chrome-innstillingene</translation> <translation id="2586657967955657006">Utklippstavle</translation> -<translation id="2587730715158995865">Fra <ph name="ARTICLE_PUBLISHER" />. Les denne og <ph name="OTHER_ARTICLE_COUNT" /> andre nyhetssaker.</translation> <translation id="2587841377698384444">ID for katalog-API:</translation> <translation id="2594318783181750337">Rask nettvisning:</translation> <translation id="2595719060046994702">Denne enheten og kontoen administreres ikke av et selskap eller en annen organisasjon.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">Hylle 6</translation> <translation id="4274173425554582601">Datamaskiner og elektronikk</translation> <translation id="4275830172053184480">Start enheten din på nytt</translation> +<translation id="4276974990916607331">Nei takk</translation> <translation id="4277028893293644418">Tilbakestill passordet</translation> <translation id="4277937682389409325">Lokal adresse</translation> <translation id="4278390842282768270">Tillatt</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Feil passord</translation> <translation id="5051305769747448211">Livekomedie</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{For å sende denne filen med nærdeling, frigjør plass (<ph name="DISK_SPACE_SIZE" />) på enheten}other{For å sende disse filene med nærdeling, frigjør plass (<ph name="DISK_SPACE_SIZE" />) på enheten}}</translation> -<translation id="5056549851600133418">Artikler for deg</translation> <translation id="5060483733937416656">Du har valgt å bekrefte med Windows Hello på nettsteder som bruker <ph name="PROVIDER_ORIGIN" />. Denne leverandøren kan ha lagret informasjon om betalingsmåten din, som du kan <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Mente du <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Utskriftslogg</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Dialogboks for bekreftelse</translation> <translation id="5135404736266831032">Adminstrer adresser…</translation> <translation id="5136841603454277753">Skriv inn riktig kode</translation> +<translation id="5137761395480718572">Denne appen ber om tillatelse til å installere wifi-legitimasjon. Etter konfigurering kobles <ph name="DEVICE_TYPE" /> automatisk til deltakende wifi-nettverk. For å fjerne denne legitimasjonen, avinstaller appen. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtuelt kort er ikke tilgjengelig akkurat nå – kontakt banken</translation> <translation id="5138227688689900538">Vis færre</translation> <translation id="5145883236150621069">Feilkode i responsen for enhetsinnstillinger</translation> @@ -1758,6 +1755,7 @@ <translation id="5273881944177595304">Nettapper og -verktøy</translation> <translation id="5274025349362408263">Bøker og litteratur</translation> <translation id="5279286380302340275">Administrer nedlastinger</translation> +<translation id="5279453600310613955">Nei takk</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Dokumentegenskaper</translation> <translation id="528468243742722775">Avslutt</translation> @@ -1861,7 +1859,6 @@ <translation id="5541086400771735334">Postkasse 7</translation> <translation id="5541546772353173584">Legg til e-post</translation> <translation id="5543722831081909240">180 grader</translation> -<translation id="5545756402275714221">Artikler for deg</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome sjekker passordene dine regelmessig mot lister som er lagt ut på nett. Når dette gjøres, er passordene og brukernavnene dine kryptert. Det betyr at ingen kan lese dem, ikke engang Google.</translation> <translation id="5556459405103347317">Last inn på nytt</translation> @@ -2143,14 +2140,12 @@ <translation id="6266934640124581640">Lys blågrønn</translation> <translation id="6272088941196661550">Fortsett reisen for å se relevant aktivitet i Chrome-loggen</translation> <translation id="6272383483618007430">Google Oppdatering</translation> -<translation id="6276112860590028508">Sider fra leselisten din vises her</translation> <translation id="627746635834430766">For å betale raskere neste gang, lagre kortet ditt og faktureringsadressen i Google-kontoen din.</translation> <translation id="6279183038361895380">Trykk på |<ph name="ACCELERATOR" />| for å se markøren</translation> <translation id="6280223929691119688">Kan ikke levere til denne adressen. Velg en annen adresse.</translation> <translation id="6284292079994426700">26 x 38 tommer</translation> <translation id="6285507000506177184">Knappen «Administrer nedlastinger i Chrome» – trykk på Enter for å administrere filer du har lastet ned i Chrome</translation> <translation id="6289939620939689042">Sidefarge</translation> -<translation id="6290238015253830360">De foreslåtte artiklene dine vises her</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Lagrer …</translation> @@ -2253,6 +2248,7 @@ <translation id="6529173248185917884">Sjuende rull</translation> <translation id="6529602333819889595">&Slett likevel</translation> <translation id="6535751101619004418">Valuta og veksling</translation> +<translation id="6536221421038631327">Hvis du fjerner et Passpoint-abonnement fra <ph name="DEVICE_TYPE" />, fjernes de tilknyttede nettverkene. Kontakt «<ph name="FRIENDLY_NAME" />» for å endre abonnementet ditt. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Aksjefond</translation> <translation id="6545864417968258051">Bluetooth-skanning</translation> <translation id="6547208576736763147">To hull venstre</translation> @@ -2749,7 +2745,6 @@ <translation id="7696089921647603491">Klassisk rock og slagere</translation> <translation id="769721561045429135">Akkurat nå har du kort som bare kan brukes på denne enheten. Klikk på Fortsett for å gå gjennom kortene.</translation> <translation id="7698864304447945242">Vil du oppdatere Google Play-tjenester for AR?</translation> -<translation id="7699293099605015246">Artikler er ikke tilgjengelige for øyeblikket</translation> <translation id="7701040980221191251">Ingen</translation> <translation id="7701544340847569275">Oppdateringen er fullført med feil</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsett til <ph name="SITE" /> (usikker side)<ph name="END_LINK" /></translation> @@ -3348,6 +3343,7 @@ <translation id="9219103736887031265">Bilder</translation> <translation id="922152298093051471">Tilpass Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Vil du tillate at <ph name="APP_NAME" />-appen konfigurerer wifi-nettverk?</translation> <translation id="936602727769022409">Du kan miste tilgangen til Google-kontoen din. Chromium anbefaler at du endrer passordet ditt nå. Du blir bedt om å logge på.</translation> <translation id="937457230470581909">Dyrehager, akvarier og reservater</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Disse dataene brukes:<ph name="END_BOLD" /> Annonseemnene dine er basert på den nylige nettleserloggen din, som er en liste over nettsteder du har besøkt med Chrome på denne enheten.</translation>
diff --git a/components/strings/components_strings_or.xtb b/components/strings/components_strings_or.xtb index 234643f4..e1dcf2ba 100644 --- a/components/strings/components_strings_or.xtb +++ b/components/strings/components_strings_or.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">ଆପଣ ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ଏପରି ଏକ ସାଇଟ୍ରେ ଲେଖିଛନ୍ତି ଯାହା ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ଵାରା ପରିଚାଳିତ ନୁହେଁ। ଆପଣଙ୍କ ଆକାଉଣ୍ଟକୁ ସୁରକ୍ଷିତ ରଖିବା ପାଇଁ, ଅନ୍ୟ ଆପ୍ ଓ ସାଇଟ୍ଗୁଡ଼ିକରେ ଆପଣଙ୍କର ପାସ୍ୱର୍ଡ ପୁନଃବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ।</translation> <translation id="1257553931232494454">ଜୁମ୍ ସ୍ତରଗୁଡ଼ିକ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ଆପଣଙ୍କ Chrome ସେଟିଂସକୁ ପରିଚାଳନା କରିବା ପାଇଁ Tab କରି Enter ଦବାନ୍ତୁ</translation> -<translation id="1263231323834454256">ପଢ଼ିବା ତାଲିକା</translation> <translation id="1264309058268477500">ବିକଳ୍ପ</translation> <translation id="1264974993859112054">ଖେଳଗୁଡିକ</translation> <translation id="1266469291454105242">ଡିଭାଇସ ଅନଲକ</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ଟ୍ରେ 8</translation> <translation id="1530707389502320859">ଆପଣ ଏବେ ଯେଉଁ ସାଇଟ୍କୁ ଯିବା ପାଇଁ ଚେଷ୍ଟା କରୁଛନ୍ତି ତାହା ନକଲି ଜଣାପଡୁଛି। URLରେ ଛୋଟ ପରିବର୍ତ୍ତନ କରି ଆକ୍ରମଣକାରୀମାନେ ବେଳେ ବେଳେ ସାଇଟ୍ଗୁଡ଼ିକର ନକଲ କରିଥାନ୍ତି ଯାହା ଜାଣିବା କଷ୍ଟକର ହୋଇଥାଏ।</translation> <translation id="1532118530259321453">ଏହି ପୃଷ୍ଠା ଏହା କୁହେ</translation> -<translation id="153384715582417236">ବର୍ତ୍ତମାନ ପାଇଁ ଏତିକି</translation> <translation id="1536390784834419204">ପୃଷ୍ଠାକୁ ଅନୁବାଦ କରନ୍ତୁ</translation> <translation id="1539840569003678498">ରିପୋର୍ଟ ପଠାଯାଇଛି:</translation> <translation id="1549470594296187301">ଏହି ବୈଶିଷ୍ଟ୍ୟକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ନିଶ୍ଚିତରୂପେ JavaScriptକୁ ସକ୍ଷମ କରାଯିବା ଉଚିତ।</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">ଆପଣଙ୍କର ବ୍ରାଉଜର୍ ପରିଚାଳିତ ହୋଇଛି</translation> <translation id="1746113442205726301">ଛବିର Y ସିଫ୍ଟ</translation> <translation id="1746531169546376413">0 ଡିଗ୍ରୀ</translation> -<translation id="17513872634828108">ଟାବ୍ଗୁଡ଼ିକ ଖୋଲନ୍ତୁ</translation> <translation id="1752021286346845558">ମେଲବକ୍ସ 8</translation> <translation id="1753068535428855445">ଡେଟିଂ ଏବଂ ପର୍ସନାଲ୍ସ</translation> <translation id="1753706481035618306">ପୃଷ୍ଠା ସଂଖ୍ୟା</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />ୱିଣ୍ଡୋ ନେଟ୍ୱର୍କ ଡାଇଗ୍ନୋଷ୍ଟିକ୍ସ ଚଲେଇବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ<ph name="END_LINK" />।</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromiumରେ ଇନକଗ୍ନିଟୋ ମୋଡ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ଆପଣଙ୍କର ଖୋଲାଥିବା ଟାବ୍ଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ଆପଣଙ୍କର ସୂଚନା, ଗୋପନୀୟତା ଏବଂ ସୁରକ୍ଷାକୁ ପରିଚାଳନା କରିବା ପାଇଁ Tab କରି Enter ଦବାନ୍ତୁ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ଏକାଧିକ କାର୍ଯ୍ୟ ଉପଲବ୍ଧ ଅଛି, ସେଗୁଡ଼ିକୁ ଗୋଟିଏ ଗୋଟିଏ କରି ଦେଖିବା ପାଇଁ Tab ଦବାନ୍ତୁ</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">ଗୋଷ୍ଠୀ</translation> <translation id="2576880857912732701">"ସୁରକ୍ଷା ସେଟିଂସକୁ ପରିଚାଳନା କରନ୍ତୁ" ବଟନ, Chrome ସେଟିଂସରେ ଆପଣଙ୍କ ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂ ଏବଂ ଆହୁରି ଅନେକ କିଛି ପରିଚାଳନା କରିବାକୁ Enter ଦବାନ୍ତୁ</translation> <translation id="2586657967955657006">କ୍ଲିପ୍ବୋର୍ଡ</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" />ଙ୍କ ତରଫରୁ। ଏହାକୁ ଓ <ph name="OTHER_ARTICLE_COUNT" /> ଅନ୍ୟ କାହାଣୀଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ।</translation> <translation id="2587841377698384444">ଡିରେକ୍ଟୋରୀ API ID:</translation> <translation id="2594318783181750337">ଦ୍ରୁତ ୱେବ୍ ଭ୍ୟୁ:</translation> <translation id="2595719060046994702">ଏହି ଡିଭାଇସ୍ ଏବଂ ଆକାଉଣ୍ଟ ଏକ କମ୍ପାନୀ କିମ୍ବା ଅନ୍ୟ ସଂସ୍ଥା ଦ୍ୱାରା ପରିଚାଳନା କରାଯାଉ ନାହିଁ।</translation> @@ -1662,7 +1657,6 @@ <translation id="5045550434625856497">ଭୁଲ ପାସୱାର୍ଡ</translation> <translation id="5051305769747448211">ଲାଇଭ କମେଡି</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby Share ବ୍ୟବହାର କରି ଏହି ଫାଇଲ ପଠାଇବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସରେ (<ph name="DISK_SPACE_SIZE" />) ସ୍ପେସ ଖାଲି କରନ୍ତୁ}other{Nearby Share ବ୍ୟବହାର କରି ଏହି ଫାଇଲଗୁଡ଼ିକୁ ପଠାଇବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସରେ (<ph name="DISK_SPACE_SIZE" />) ସ୍ପେସ ଖାଲି କରନ୍ତୁ}}</translation> -<translation id="5056549851600133418">ଆପଣଙ୍କ ପାଇଁ ଆର୍ଟିକଲ୍ଗୁଡ଼ିକ</translation> <translation id="5060483733937416656">ଆପଣ <ph name="PROVIDER_ORIGIN" /> ବ୍ୟବହାର କରୁଥିବା ୱେବସାଇଟଗୁଡ଼ିକରେ Windows Hello ମାଧ୍ୟମରେ ଯାଞ୍ଚ କରିବାକୁ ବାଛିଛନ୍ତି। ଏହି ପ୍ରଦାନକାରୀ ଆପଣଙ୍କ ପେମେଣ୍ଟ ପଦ୍ଧତି ବିଷୟରେ ସୂଚନା ଷ୍ଟୋର କରିଥାଇପାରନ୍ତି, ଯାହାକୁ ଆପଣ <ph name="LINK_TEXT" /> କରିପାରିବେ।</translation> <translation id="5061227663725596739">ଆପଣ କ’ଣ <ph name="LOOKALIKE_DOMAIN" /> ବିଷୟରେ କହିବାକୁ ଚାହୁଁଛନ୍ତି?</translation> <translation id="5066056036849835175">ପ୍ରିଣ୍ଟିଂ ଇତିହାସ</translation> @@ -1857,7 +1851,6 @@ <translation id="5541086400771735334">ମେଲବକ୍ସ 7</translation> <translation id="5541546772353173584">ଇମେଲ୍ ଯୋଗ କରନ୍ତୁ</translation> <translation id="5543722831081909240">180 ଡିଗ୍ରୀ</translation> -<translation id="5545756402275714221">ଆପଣଙ୍କ ପାଇଁ ଆର୍ଟିକଲ୍ସ</translation> <translation id="5551890439174915351">100 x 200 ମିମି</translation> <translation id="5552137475244467770">Chrome ସମୟେ ସମୟେ ଅନ୍ଲାଇନ୍ରେ ପ୍ରକାଶ କରାଯାଇଥିବା ତାଲିକାଗୁଡ଼ିକ ଅନୁଯାୟୀ ଆପଣଙ୍କ ପାସ୍ୱାର୍ଡଗୁଡ଼ିକର ଯାଞ୍ଚ କରିଥାଏ। ଏପରି କରିବା ବେଳେ, ଆପଣଙ୍କର ପାସ୍ୱାର୍ଡ ଏବଂ ଉପଯୋଗକର୍ତ୍ତାନାମଗୁଡ଼ିକ ଏନ୍କ୍ରିପ୍ଟ କରାଯାଇଥାଏ, ଯାହାଫଳରେ ସେଗୁଡ଼ିକ Google ସମେତ ଅନ୍ୟ କାହା ଦ୍ୱାରା ପଢ଼ାଯାଇ ପାରିବ ନାହିଁ।</translation> <translation id="5556459405103347317">ପୁନଃ ଲୋଡ୍ କରନ୍ତୁ</translation> @@ -2138,14 +2131,12 @@ <translation id="6266934640124581640">ହାଲ୍କା ଟିଲ୍</translation> <translation id="6272088941196661550">ଆପଣଙ୍କ Chrome ଇତିହାସରେ ପ୍ରାସଙ୍ଗିକ କାର୍ଯ୍ୟକଳାପ ଦେଖିବାକୁ ଆପଣଙ୍କ ସନ୍ଧାନ ପୁଣି ଆରମ୍ଭ କରନ୍ତୁ</translation> <translation id="6272383483618007430">Google ଅପଡେଟ୍</translation> -<translation id="6276112860590028508">ଆପଣ ପଢ଼ିଥିବା ତାଲିକାରୁ ପୃଷ୍ଠାଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯାଏ</translation> <translation id="627746635834430766">ପରବର୍ତ୍ତୀ ସମୟରେ ପୈଠ ପ୍ରକ୍ରିୟାକୁ ଦ୍ରୁତତର କରିବା ପାଇଁ ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟରେ ଆପଣଙ୍କ କାର୍ଡ ଓ ବିଲିଂ ଠିକଣା ସେଭ୍ କରନ୍ତୁ।</translation> <translation id="6279183038361895380">ଆପଣଙ୍କର କର୍ସର୍ ଦେଖାଇବାକୁ |<ph name="ACCELERATOR" />| ଦବାନ୍ତୁ</translation> <translation id="6280223929691119688">ଏହି ଠିକଣାକୁ ପହଞ୍ଚାଇପାରିବ ନାହିଁ। ଏକ ଭିନ୍ନ ଠିକଣା ଚୟନ କରନ୍ତୁ।</translation> <translation id="6284292079994426700">26 x 38 ଇଞ୍ଚ</translation> <translation id="6285507000506177184">"Chromeରେ ଡାଉନଲୋଡଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ" ବଟନ, Chromeରେ ଆପଣ ଡାଉନଲୋଡ କରିଥିବା ଫାଇଲଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ Enter ଦବାନ୍ତୁ</translation> <translation id="6289939620939689042">ପୃଷ୍ଠାର ରଙ୍ଗ</translation> -<translation id="6290238015253830360">ଆପଣଙ୍କ ଦ୍ୱାରା ପରାମର୍ଶିତ ନିବନ୍ଧଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯାଏ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">ସେଭ୍ ହେଉଛି…</translation> @@ -2745,7 +2736,6 @@ <translation id="7696089921647603491">କ୍ଲାସିକ ରକ ଏବଂ ଓଲ୍ଡିଜ</translation> <translation id="769721561045429135">ବର୍ତ୍ତମାନ, ଆପଣଙ୍କ ପାଖରେ ସେହି କାର୍ଡଗୁଡ଼ିକ ଅଛି ଯାହା କେବଳ ଏହି ଡିଭାଇସ୍ରେ ବ୍ୟବହାର କରାଯାଇପାରିବ। କାର୍ଡଗୁଡ଼ିକର ସମୀକ୍ଷା କରିବାକୁ ’ଜାରି ରଖନ୍ତୁ’ରେ କ୍ଲିକ୍ କରନ୍ତୁ।</translation> <translation id="7698864304447945242">AR ପାଇଁ Google Play ସେବାଗୁଡ଼ିକ ଅପଡେଟ କରିବେ?</translation> -<translation id="7699293099605015246">ବର୍ତ୍ତମାନ ପ୍ରବନ୍ଧଗୁଡ଼ିକ ଉପଲବ୍ଧ ନାହିଁ</translation> <translation id="7701040980221191251">କିଛି ନାହିଁ</translation> <translation id="7701544340847569275">ତ୍ରୁଟି ସହ ଅପଡେଟ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" />(ଅସୁରକ୍ଷିତ)କୁ ଅଗ୍ରସର ହୁଅନ୍ତୁ<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_pa.xtb b/components/strings/components_strings_pa.xtb index 2072bac..45de3ec 100644 --- a/components/strings/components_strings_pa.xtb +++ b/components/strings/components_strings_pa.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">ਤੁਸੀਂ ਉਸ ਸਾਈਟ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਦਾਖਲ ਕੀਤਾ ਹੈ ਜੋ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਪ੍ਰਬੰਧਿਤ ਨਹੀਂ ਹੈ। ਆਪਣੇ ਖਾਤੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਹੋਰਾਂ ਐਪਾਂ ਅਤੇ ਸਾਈਟਾਂ 'ਤੇ ਆਪਣਾ ਪਾਸਵਰਡ ਮੁੜ ਨਾ ਵਰਤੋ।</translation> <translation id="1257553931232494454">ਜ਼ੂਮ ਪੱਧਰ</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ਆਪਣੀਆਂ Chrome ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ Tab ਅਤੇ ਫਿਰ Enter ਦਬਾਓ</translation> -<translation id="1263231323834454256">ਪੜ੍ਹਤ ਸੂਚੀ</translation> <translation id="1264309058268477500">ਵਿਕਲਪਿਕ</translation> <translation id="1264974993859112054">ਖੇਡਾਂ</translation> <translation id="1266469291454105242">ਡੀਵਾਈਸ ਅਣਲਾਕ ਸੁਵਿਧਾ</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ਟ੍ਰੇਅ 8</translation> <translation id="1530707389502320859">ਜਿਸ ਸਾਈਟ 'ਤੇ ਤੁਸੀਂ ਹੁਣੇ ਜਾਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕੀਤੀ ਉਹ ਨਕਲੀ ਲੱਗਦੀ ਹੈ। ਹਮਲਾਵਰ ਕਦੇ-ਕਦਾਈ URL ਵਿੱਚ ਮੁਸ਼ਕਲ ਨਾਲ ਪਤਾ ਲੱਗਣ ਵਾਲੀਆਂ ਨਿੱਕੀਆਂ ਤਬਦੀਲੀਆਂ ਕਰਕੇ ਸਾਈਟਾਂ ਦੀ ਨਕਲ ਤਿਆਰ ਕਰਦੇ ਹਨ।</translation> <translation id="1532118530259321453">ਇਸ ਪੰਨੇ ਦੇ ਮੁਤਾਬਕ</translation> -<translation id="153384715582417236">ਹੁਣ ਲਈ ਬੱਸ ਇੰਨਾ ਹੀ</translation> <translation id="1536390784834419204">ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕਰੋ</translation> <translation id="1539840569003678498">ਰਿਪੋਰਟ ਭੇਜੀ ਗਈ:</translation> <translation id="1549470594296187301">ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਵਰਤਣ ਲਈ JavaScript ਨੂੰ ਸਮਰੱਥ ਬਣਾਇਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕੀਤਾ ਜਾਂਦਾ ਹੈ</translation> <translation id="1746113442205726301">ਚਿੱਤਰ Y ਸ਼ਿਫਟ</translation> <translation id="1746531169546376413">0 ਡਿਗਰੀ</translation> -<translation id="17513872634828108">ਟੈਬਸ ਖੋਲ੍ਹੋ</translation> <translation id="1752021286346845558">ਮੇਲਬਾਕਸ 8</translation> <translation id="1753068535428855445">ਡੇਟਿੰਗ ਅਤੇ ਵਿਅਕਤੀਗਤ</translation> <translation id="1753706481035618306">ਪੰਨਾ ਨੰਬਰ</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows ਨੈੱਟਵਰਕ ਤਸ਼ਖੀਸਾਂ ਨੂੰ ਚਲਾਉਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ<ph name="END_LINK" />।</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium ਵਿੱਚ ਇਨਕੋਗਨਿਟੋ ਮੋਡ ਬਾਰੇ ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ਤੁਹਾਡੇ ਖੁੱਲ੍ਹੇ ਟੈਬ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੇ</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google ਖਾਤੇ ਵਿੱਚ ਆਪਣੀ ਜਾਣਕਾਰੀ, ਪਰਦੇਦਾਰੀ ਅਤੇ ਸੁਰੱਖਿਆ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ Tab ਦਬਾ ਕੇ Enter ਦਬਾਓ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ਇੱਕ ਤੋਂ ਵੱਧ ਕਾਰਵਾਈਆਂ ਉਪਲਬਧ ਹਨ, ਉਹਨਾਂ ਵਿੱਚ ਚੱਕਰ ਲਗਾਉਣ ਲਈ Tab ਦਬਾਓ</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">ਸਮੂਹ</translation> <translation id="2576880857912732701">'ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ' ਬਟਨ, Chrome ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਆਪਣੀ ਸੁਰੱਖਿਅਤ ਬ੍ਰਾਊਜ਼ਿੰਗ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ Enter ਦਬਾਓ</translation> <translation id="2586657967955657006">ਕਲਿੱਪਬੋਰਡ</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> ਵੱਲੋਂ। ਇਸਨੂੰ ਅਤੇ <ph name="OTHER_ARTICLE_COUNT" /> ਹੋਰ ਖਬਰ ਲੇਖਾਂ ਨੂੰ ਪੜ੍ਹੋ।</translation> <translation id="2587841377698384444">ਡਾਇਰੈਕਟਰੀ API ਆਈ.ਡੀ.:</translation> <translation id="2594318783181750337">ਤੇਜ਼ ਵੈੱਬ ਦ੍ਰਿਸ਼:</translation> <translation id="2595719060046994702">ਇਸ ਡੀਵਾਈਸ ਅਤੇ ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਿਸੇ ਕੰਪਨੀ ਜਾਂ ਹੋਰ ਸੰਸਥਾ ਵੱਲੋਂ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">ਗਲਤ ਪਾਸਵਰਡ</translation> <translation id="5051305769747448211">ਲਾਈਵ ਕਾਮੇਡੀ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਇਹ ਫ਼ਾਈਲ ਭੇਜਣ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਜਗ੍ਹਾ (<ph name="DISK_SPACE_SIZE" />) ਖਾਲੀ ਕਰੋ}one{ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਇਹ ਫ਼ਾਈਲ ਭੇਜਣ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਜਗ੍ਹਾ (<ph name="DISK_SPACE_SIZE" />) ਖਾਲੀ ਕਰੋ}other{ਨਜ਼ਦੀਕੀ ਸਾਂਝ ਦੀ ਵਰਤੋਂ ਕਰਦਿਆਂ ਇਨ੍ਹਾਂ ਫ਼ਾਈਲਾਂ ਨੂੰ ਭੇਜਣ ਲਈ, ਆਪਣੇ ਡੀਵਾਈਸ 'ਤੇ ਜਗ੍ਹਾ (<ph name="DISK_SPACE_SIZE" />) ਖਾਲੀ ਕਰੋ}}</translation> -<translation id="5056549851600133418">ਤੁਹਾਡੇ ਲਈ ਲੇਖ</translation> <translation id="5060483733937416656">ਤੁਸੀਂ <ph name="PROVIDER_ORIGIN" /> ਦੀ ਵਰਤੋਂ ਕਰਨ ਵਾਲੀਆਂ ਵੈੱਬਸਾਈਟਾਂ 'ਤੇ Windows Hello ਨਾਲ ਪੁਸ਼ਟੀ ਕਰਨਾ ਚੁਣਿਆ ਹੈ। ਇਸ ਪ੍ਰਦਾਨਕ ਨੇ ਤੁਹਾਡੀ ਭੁਗਤਾਨ ਵਿਧੀ ਸੰਬੰਧੀ ਜਾਣਕਾਰੀ ਨੂੰ ਸਟੋਰ ਕੀਤਾ ਹੋ ਸਕਦਾ ਹੈ, ਜਿਸ ਲਈ ਤੁਸੀਂ <ph name="LINK_TEXT" /> ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="5061227663725596739">ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ <ph name="LOOKALIKE_DOMAIN" /> ਤੋਂ ਸੀ?</translation> <translation id="5066056036849835175">ਪ੍ਰਿੰਟਿੰਗ ਇਤਿਹਾਸ</translation> @@ -1739,6 +1733,8 @@ <translation id="5234764350956374838">ਬਰਖ਼ਾਸਤ ਕਰੋ</translation> <translation id="5239623327352565343">ਟਿਕਾਣੇ ਦੀ ਇਜਾਜ਼ਤ ਹੈ</translation> <translation id="5242889659037569123">ਸਮਾਨ ਅਤੇ ਯਾਤਰਾ ਸੰਬੰਧੀ ਐਕਸੈਸਰੀਆਂ</translation> +<translation id="5244732203286792411">ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ... + ਇਸ ਵਿੱਚ ਕੁਝ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।</translation> <translation id="5250209940322997802">"ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕਰੋ"</translation> <translation id="52517543715119994">Chrome ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਬਾਰੇ ਜਾਣੋ</translation> <translation id="5251803541071282808">ਕਲਾਊਡ</translation> @@ -1856,7 +1852,6 @@ <translation id="5541086400771735334">ਮੇਲਬਾਕਸ 7</translation> <translation id="5541546772353173584">ਈਮੇਲ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="5543722831081909240">180 ਡਿਗਰੀ</translation> -<translation id="5545756402275714221">ਤੁਹਾਡੇ ਲਈ ਲੇਖ</translation> <translation id="5551890439174915351">100 x 200 ਮਿ.ਮੀ.</translation> <translation id="5552137475244467770">Chrome ਨਿਯਮਿਤ ਤੌਰ 'ਤੇ ਆਨਲਾਈਨ ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤੀਆਂ ਗਈਆਂ ਸੂਚੀਆਂ ਨਾਲ ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰਦਾ ਹੈ। ਅਜਿਹਾ ਕਰਨ ਵੇਲੇ, ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਅਤੇ ਵਰਤੋਂਕਾਰ ਨਾਮ ਇਨਕ੍ਰਿਪਟ ਕੀਤੇ ਜਾਂਦੇ ਹਨ, ਇਸ ਲਈ ਉਹ Google ਸਮੇਤ ਕਿਸੇ ਵੱਲੋਂ ਵੀ ਪੜ੍ਹੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।</translation> <translation id="5556459405103347317">ਰੀਲੋਡ ਕਰੋ</translation> @@ -2137,14 +2132,12 @@ <translation id="6266934640124581640">ਹਲਕਾ ਹਰਾ-ਨੀਲਾ</translation> <translation id="6272088941196661550">ਆਪਣੇ Chrome ਇਤਿਹਾਸ ਵਿੱਚ ਢੁਕਵੀਂ ਸਰਗਰਮੀ ਦੇਖਣ ਲਈ ਆਪਣੇ ਖੋਜ ਸਫ਼ਰ ਨੂੰ ਮੁੜ-ਚਾਲੂ ਕਰੋ</translation> <translation id="6272383483618007430">Google ਅੱਪਡੇਟ</translation> -<translation id="6276112860590028508">ਤੁਹਾਡੀ ਪੜ੍ਹਤ ਸੂਚੀ ਵਿੱਚੋਂ ਪੰਨੇ ਇੱਥੇ ਵਿਖਾਈ ਦੇਣਗੇ</translation> <translation id="627746635834430766">ਅਗਲੀ ਵਾਰ ਵਧੇਰੇ ਤੇਜ਼ੀ ਨਾਲ ਭੁਗਤਾਨ ਕਰਨ ਲਈ, ਆਪਣੇ ਕਾਰਡ ਅਤੇ ਬਿਲਿੰਗ ਪਤੇ ਨੂੰ ਆਪਣੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕਰੋ।</translation> <translation id="6279183038361895380">ਆਪਣਾ ਕਰਸਰ ਵਿਖਾਉਣ ਲਈ |<ph name="ACCELERATOR" />| ਦਬਾਓ</translation> <translation id="6280223929691119688">ਇਸ ਪਤੇ 'ਤੇ ਅਦਾਇਗੀ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ। ਕੋਈ ਵੱਖਰਾ ਪਤਾ ਚੁਣੋ।</translation> <translation id="6284292079994426700">26 x 38 ਇੰਚ</translation> <translation id="6285507000506177184">'Chrome ਵਿੱਚ ਡਾਊਨਲੋਡਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ' ਬਟਨ, Chrome ਵਿੱਚ ਤੁਹਾਡੇ ਵੱਲੋਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ Enter ਦਬਾਓ</translation> <translation id="6289939620939689042">ਪੰਨੇ ਦਾ ਰੰਗ</translation> -<translation id="6290238015253830360">ਤੁਹਾਡੇ ਸੁਝਾਏ ਗਏ ਲੇਖ ਇੱਥੇ ਦਿਖਾਈ ਦੇਣਗੇ</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> @@ -2744,7 +2737,6 @@ <translation id="7696089921647603491">ਕਲਾਸਿਕ ਰੌਕ ਅਤੇ ਪੁਰਾਣੇ ਗੀਤ</translation> <translation id="769721561045429135">ਫਿਲਹਾਲ, ਤੁਹਾਡੇ ਕੋਲ ਉਹ ਕਾਰਡ ਹਨ ਜੋ ਸਿਰਫ਼ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਹੀ ਵਰਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਕਾਰਡਾਂ ਦੀ ਸਮੀਖਿਆ ਲਈ ਜਾਰੀ ਰੱਖੋ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="7698864304447945242">ਕੀ Google Play Services for AR ਨੂੰ ਅੱਪਡੇਟ ਕਰਨਾ ਹੈ?</translation> -<translation id="7699293099605015246">ਫਿਲਹਾਲ ਲੇਖ ਉਪਲਬਧ ਨਹੀਂ ਹਨ</translation> <translation id="7701040980221191251">ਕੋਈ ਨਹੀਂ</translation> <translation id="7701544340847569275">ਅੱਪਡੇਟ ਗੜਬੜਾਂ ਨਾਲ ਪੂਰਾ ਹੋਇਆ</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> ਲਈ ਅੱਗੇ ਵੱਧੋ (ਅਸੁਰੱਖਿਅਤ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb index 0663145..453aa57 100644 --- a/components/strings/components_strings_pl.xtb +++ b/components/strings/components_strings_pl.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Wpisałeś swoje hasło na stronie, którą nie zarządza Twoja organizacja. Aby chronić konto, nie używaj swojego hasła w innych aplikacjach ani na innych stronach.</translation> <translation id="1257553931232494454">poziomy powiększenia</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />; aby zarządzać ustawieniami Chrome, naciśnij Tab, a potem Enter</translation> -<translation id="1263231323834454256">Do przeczytania</translation> <translation id="1264309058268477500">Alternatywne</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Odblokowywanie urządzenia</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Taca 8</translation> <translation id="1530707389502320859">Próbujesz otworzyć stronę, która wygląda na fałszywą. Złośliwe strony czasami podszywają się pod inne, wprowadzając małe i trudne do zauważenia zmiany w adresie URL.</translation> <translation id="1532118530259321453">Komunikat z bieżącej strony</translation> -<translation id="153384715582417236">Na razie to wszystko</translation> <translation id="1536390784834419204">Przetłumacz stronę</translation> <translation id="1539840569003678498">Wysłanie raportu:</translation> <translation id="1549470594296187301">Aby można było korzystać z tej funkcji, musi być włączony JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Twoja przeglądarka jest zarządzana</translation> <translation id="1746113442205726301">Przesunięcie obrazu wzdłuż osi Y</translation> <translation id="1746531169546376413">0 stopni</translation> -<translation id="17513872634828108">Otwarte karty</translation> <translation id="1752021286346845558">Zestaw tac odbiorczych 8</translation> <translation id="1753068535428855445">Randki i ogłoszenia towarzyskie</translation> <translation id="1753706481035618306">Numer strony</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Uruchom Diagnostykę sieci systemu Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Więcej informacji o trybie incognito w Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tutaj pojawiają się otwarte karty</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />; naciśnij Tab, a potem Enter, aby zarządzać swoimi danymi, prywatnością i bezpieczeństwem na koncie Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Dostępnych jest wiele czynności. Naciskaj Tab, by się między nimi przełączać.</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Dane karty wirtualnej</translation> <translation id="1803020234906945288">Zdrowe odżywianie</translation> <translation id="1803351196216024260">Może prosić o dostęp do mikrofonu</translation> +<translation id="1806174020048213474">Ta aplikacja żąda uprawnień do instalowania danych logowania do Wi-Fi. Po zakończeniu konfiguracji <ph name="DEVICE_TYPE" /> będzie się automatycznie łączyć z sieciami Wi-Fi, które uczestniczą w programie. Aby usunąć te dane logowania, odinstaluj aplikację.</translation> <translation id="1807246157184219062">Jasny</translation> <translation id="1807528111851433570">Arkusz początkowy</translation> <translation id="180991881384371158">Kod CVC znajduje się na odwrocie karty. To ostatnie 3 cyfry w prawym górnym rogu pola podpisu.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Grupa</translation> <translation id="2576880857912732701">Przycisk Zarządzaj ustawieniami zabezpieczeń; aby zarządzać Bezpiecznym przeglądaniem i innymi opcjami w ustawieniach Chrome, naciśnij Enter</translation> <translation id="2586657967955657006">Schowek</translation> -<translation id="2587730715158995865">Wydawca: <ph name="ARTICLE_PUBLISHER" />. Przeczytaj ten artykuł i inne (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Identyfikator interfejsu API katalogu:</translation> <translation id="2594318783181750337">Szybkie wyświetlanie w sieci:</translation> <translation id="2595719060046994702">To urządzenie i konto nie są zarządzane przez firmę ani inną organizację.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">Układarka 6</translation> <translation id="4274173425554582601">Komputery i elektronika</translation> <translation id="4275830172053184480">Zrestartuj urządzenie</translation> +<translation id="4276974990916607331">Nie, dziękuję</translation> <translation id="4277028893293644418">Resetuj hasło</translation> <translation id="4277937682389409325">Adres lokalny</translation> <translation id="4278390842282768270">Dozwolone</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Nieprawidłowe hasło</translation> <translation id="5051305769747448211">Kabaret</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Aby wysłać plik przez Udostępnianie w pobliżu, zwolnij miejsce (<ph name="DISK_SPACE_SIZE" />) na urządzeniu}few{Aby wysłać pliki przez Udostępnianie w pobliżu, zwolnij miejsce (<ph name="DISK_SPACE_SIZE" />) na urządzeniu}many{Aby wysłać pliki przez Udostępnianie w pobliżu, zwolnij miejsce (<ph name="DISK_SPACE_SIZE" />) na urządzeniu}other{Aby wysłać pliki przez Udostępnianie w pobliżu, zwolnij miejsce (<ph name="DISK_SPACE_SIZE" />) na urządzeniu}}</translation> -<translation id="5056549851600133418">Artykuły dla Ciebie</translation> <translation id="5060483733937416656">W witrynach korzystających z <ph name="PROVIDER_ORIGIN" /> potwierdzasz swoją tożsamość za pomocą Windows Hello. Możliwe, że ten dostawca przechowuje dane Twojej formy płatności. Możesz <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Czy chodziło Ci o <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historia drukowania</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Okno z potwierdzeniem</translation> <translation id="5135404736266831032">Zarządzaj adresami…</translation> <translation id="5136841603454277753">Podaj prawidłowy kod</translation> +<translation id="5137761395480718572">Ta aplikacja żąda uprawnień do instalowania danych logowania do Wi-Fi. Po zakończeniu konfiguracji <ph name="DEVICE_TYPE" /> będzie się automatycznie łączyć z sieciami Wi-Fi, które uczestniczą w programie. Aby usunąć te dane logowania, odinstaluj aplikację. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Karta wirtualna nie jest teraz dostępna. Skontaktuj się z bankiem.</translation> <translation id="5138227688689900538">Pokaż mniej</translation> <translation id="5145883236150621069">W odebranej polityce znajduje się kod błędu</translation> @@ -1742,6 +1739,8 @@ <translation id="5234764350956374838">Zamknij</translation> <translation id="5239623327352565343">Lokalizacja jest dozwolona</translation> <translation id="5242889659037569123">Bagaże i akcesoria turystyczne</translation> +<translation id="5244732203286792411">Wczytuję… + Może to potrwać kilka minut.</translation> <translation id="5250209940322997802">„Połącz z siecią”</translation> <translation id="52517543715119994">Poznaj funkcje Chrome</translation> <translation id="5251803541071282808">Chmura</translation> @@ -1756,6 +1755,7 @@ <translation id="5273881944177595304">Aplikacje internetowe i narzędzia online</translation> <translation id="5274025349362408263">Książki i literatura</translation> <translation id="5279286380302340275">Zarządzaj pobranymi plikami</translation> +<translation id="5279453600310613955">Nie, dziękuję</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Właściwości dokumentu</translation> <translation id="528468243742722775">Zakończ</translation> @@ -1859,7 +1859,6 @@ <translation id="5541086400771735334">Zestaw tac odbiorczych 7</translation> <translation id="5541546772353173584">Dodaj adres e-mail</translation> <translation id="5543722831081909240">180 stopni</translation> -<translation id="5545756402275714221">Artykuły dla Ciebie</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Co jakiś czas Chrome sprawdza, czy Twoje hasła nie pojawiły się na listach opublikowanych w internecie. Aby nikt (nawet Google) nie mógł odczytać haseł ani nazw użytkowników, podczas sprawdzania są one zaszyfrowane.</translation> <translation id="5556459405103347317">Odśwież</translation> @@ -2141,14 +2140,12 @@ <translation id="6266934640124581640">Jasny morski</translation> <translation id="6272088941196661550">Wznów swoją serię czynności, aby zobaczyć odpowiednią aktywność w historii Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Tu pojawią się strony z Twojej listy Do przeczytania</translation> <translation id="627746635834430766">Aby następnym razem zapłacić szybciej, zapisz kartę i adres rozliczeniowy na swoim koncie Google.</translation> <translation id="6279183038361895380">Naciśnij |<ph name="ACCELERATOR" />|, by wyświetlić kursor</translation> <translation id="6280223929691119688">Nie można dostarczyć pod ten adres. Wybierz inny.</translation> <translation id="6284292079994426700">26 x 38 cali</translation> <translation id="6285507000506177184">Przycisk Zarządzaj pobranymi plikami w Chrome; aby zarządzać pobranymi plikami w Chrome, naciśnij Enter</translation> <translation id="6289939620939689042">Kolor strony</translation> -<translation id="6290238015253830360">Tutaj wyświetlą się proponowane artykuły</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Kod CVC:</translation> <translation id="6295855836753816081">Zapisuję…</translation> @@ -2251,6 +2248,7 @@ <translation id="6529173248185917884">Rolka 7</translation> <translation id="6529602333819889595">&Ponów usunięcie</translation> <translation id="6535751101619004418">Waluty i wymiana walut</translation> +<translation id="6536221421038631327">Usunięcie subskrypcji Passpoint z urządzenia <ph name="DEVICE_TYPE" /> spowoduje też usunięcie powiązanych sieci. Aby wprowadzić zmiany w abonamencie, skontaktuj się z: „<ph name="FRIENDLY_NAME" />”. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Fundusze powiernicze</translation> <translation id="6545864417968258051">Skanowanie Bluetooth</translation> <translation id="6547208576736763147">Dwa otwory po lewej</translation> @@ -2748,7 +2746,6 @@ <translation id="7696089921647603491">Klasyczny rock i stare przeboje</translation> <translation id="769721561045429135">Obecnie niektórych z Twoich kart można używać tylko na tym urządzeniu. Kliknij Dalej, by wyświetlić karty.</translation> <translation id="7698864304447945242">Zaktualizować Usługi Google Play dla AR?</translation> -<translation id="7699293099605015246">Artykuły nie są obecnie dostępne</translation> <translation id="7701040980221191251">Brak</translation> <translation id="7701544340847569275">Aktualizacja zakończona z błędami</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Otwórz stronę <ph name="SITE" /> (niebezpieczną)<ph name="END_LINK" /></translation> @@ -3347,6 +3344,7 @@ <translation id="9219103736887031265">Grafika</translation> <translation id="922152298093051471">Dostosuj Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Zezwolić aplikacji <ph name="APP_NAME" /> na konfigurowanie sieci Wi-Fi?</translation> <translation id="936602727769022409">Możesz stracić dostęp do swojego konta Google. Chromium zaleca natychmiastową zmianę hasła. Zobaczysz prośbę, by się zalogować.</translation> <translation id="937457230470581909">Ogrody zoologiczne, oceanaria i rezerwaty</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Jakich danych używamy:<ph name="END_BOLD" /> tematy reklam są określane na podstawie Twojej najnowszej historii przeglądania, czyli listy witryn odwiedzonych przez Ciebie w Chrome na tym urządzeniu.</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb index b971d404..ab73a3e 100644 --- a/components/strings/components_strings_pt-BR.xtb +++ b/components/strings/components_strings_pt-BR.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Você informou sua senha em um site que não é gerenciado pela sua organização. Para proteger sua conta, não reutilize sua senha em outros apps e sites.</translation> <translation id="1257553931232494454">níveis de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter para gerenciar as configurações do Chrome</translation> -<translation id="1263231323834454256">Lista de leitura</translation> <translation id="1264309058268477500">Alternativa</translation> <translation id="1264974993859112054">Esportes</translation> <translation id="1266469291454105242">Desbloqueio do dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Bandeja 8</translation> <translation id="1530707389502320859">O site que você tentou acessar parece falso. Os invasores às vezes imitam sites fazendo pequenas alterações quase imperceptíveis no URL.</translation> <translation id="1532118530259321453">Essa página diz</translation> -<translation id="153384715582417236">Isso é tudo por enquanto</translation> <translation id="1536390784834419204">Traduzir página</translation> <translation id="1539840569003678498">Relatório enviado:</translation> <translation id="1549470594296187301">O JavaScript deve ser ativado para usar este recurso.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Seu navegador é gerenciado</translation> <translation id="1746113442205726301">Mudança Y na imagem</translation> <translation id="1746531169546376413">0 grau</translation> -<translation id="17513872634828108">Guias abertas</translation> <translation id="1752021286346845558">Caixa de e-mails 8</translation> <translation id="1753068535428855445">Namoro e assuntos pessoais</translation> <translation id="1753706481035618306">Numero da página</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Tente executar o Diagnóstico de Rede do Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Saiba mais sobre a navegação anônima no Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Suas guias abertas são exibidas aqui</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Pressione Tab e depois Enter para gerenciar suas informações, sua privacidade e sua segurança na Conta do Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Várias ações disponíveis. Pressione "Tab" para alternar entre elas</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Detalhes do cartão virtual</translation> <translation id="1803020234906945288">Alimentação saudável</translation> <translation id="1803351196216024260">Pode pedir para usar o microfone</translation> +<translation id="1806174020048213474">Este app quer ter permissão para instalar credenciais de Wi-Fi. Após a configuração, seu <ph name="DEVICE_TYPE" /> se conecta automaticamente às redes Wi-Fi participantes. Para remover essas credenciais, desinstale o app.</translation> <translation id="1807246157184219062">Claro</translation> <translation id="1807528111851433570">Página inicial</translation> <translation id="180991881384371158">O CVC é um código composto pelos últimos três dígitos que ficam no canto superior direito do verso do cartão.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Grupo</translation> <translation id="2576880857912732701">Botão "Gerenciar configurações de segurança". Pressione Enter para gerenciar o Navegação segura e muito mais nas configurações do Chrome</translation> <translation id="2586657967955657006">Área de transferência</translation> -<translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Leia essa matéria e <ph name="OTHER_ARTICLE_COUNT" /> outras.</translation> <translation id="2587841377698384444">Código da API do diretório:</translation> <translation id="2594318783181750337">Exibição rápida da Web:</translation> <translation id="2595719060046994702">Este dispositivo e conta não são gerenciados por uma empresa ou outra organização.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">Empilhador 6</translation> <translation id="4274173425554582601">Computadores e aparelhos eletrônicos</translation> <translation id="4275830172053184480">Reiniciar seu dispositivo</translation> +<translation id="4276974990916607331">Agora não</translation> <translation id="4277028893293644418">Redefinir senha</translation> <translation id="4277937682389409325">Endereço local</translation> <translation id="4278390842282768270">Permitido</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Senha incorreta</translation> <translation id="5051305769747448211">Shows de comédia ao vivo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este arquivo usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}one{Para enviar este arquivo usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}other{Para enviar estes arquivos usando o Compartilhar por proximidade, libere espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}}</translation> -<translation id="5056549851600133418">Artigos para você</translation> <translation id="5060483733937416656">Você escolheu fazer a verificação com o Windows Hello em sites que usam o provedor <ph name="PROVIDER_ORIGIN" />. Esse provedor pode ter armazenado informações sobre sua forma de pagamento, mas você pode <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Você quis dizer "<ph name="LOOKALIKE_DOMAIN" />"?</translation> <translation id="5066056036849835175">Histórico de impressão</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Caixa de diálogo de confirmação</translation> <translation id="5135404736266831032">Gerenciar endereços…</translation> <translation id="5136841603454277753">Insira o código correto</translation> +<translation id="5137761395480718572">Este app quer ter permissão para instalar credenciais de Wi-Fi. Após a configuração, seu <ph name="DEVICE_TYPE" /> se conecta automaticamente às redes Wi-Fi participantes. Para remover essas credenciais, desinstale o app. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">O cartão virtual não está disponível no momento. Entre em contato com seu banco</translation> <translation id="5138227688689900538">Mostrar menos</translation> <translation id="5145883236150621069">Código de erro presente na resposta da política</translation> @@ -1758,6 +1755,7 @@ <translation id="5273881944177595304">Aplicativos da Web e ferramentas on-line</translation> <translation id="5274025349362408263">Livros e literatura</translation> <translation id="5279286380302340275">Gerenciar downloads</translation> +<translation id="5279453600310613955">Agora não</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Propriedades do documento</translation> <translation id="528468243742722775">Fim</translation> @@ -1861,7 +1859,6 @@ <translation id="5541086400771735334">Caixa de e-mails 7</translation> <translation id="5541546772353173584">Adicione um E-mail</translation> <translation id="5543722831081909240">180 graus</translation> -<translation id="5545756402275714221">Artigos para você</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">O Chrome verifica periodicamente se suas senhas estão em listas que foram publicadas on-line. Quando isso é feito, as senhas e os nomes de usuário são criptografados para que não possam ser lidos por ninguém, nem o Google.</translation> <translation id="5556459405103347317">Recarregar</translation> @@ -2143,14 +2140,12 @@ <translation id="6266934640124581640">Verde-água</translation> <translation id="6272088941196661550">Retomar a jornada para ver as atividades relevantes no seu histórico do Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">As páginas da sua lista de leitura são exibidas aqui</translation> <translation id="627746635834430766">Para agilizar o pagamento na próxima vez, salve o cartão e o endereço de faturamento na sua Conta do Google.</translation> <translation id="6279183038361895380">Pressione |<ph name="ACCELERATOR" />| para exibir seu cursor</translation> <translation id="6280223929691119688">Não é possível entregar nesse endereço. Selecione um endereço diferente.</translation> <translation id="6284292079994426700">26 x 38 pol.</translation> <translation id="6285507000506177184">Botão "Gerenciar downloads no Chrome". Pressione Enter para gerenciar os arquivos transferidos por download no Chrome</translation> <translation id="6289939620939689042">Cor da página</translation> -<translation id="6290238015253830360">Os artigos sugeridos aparecerão aqui</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Salvando...</translation> @@ -2253,6 +2248,7 @@ <translation id="6529173248185917884">Sétimo rolo</translation> <translation id="6529602333819889595">&Refazer excluir</translation> <translation id="6535751101619004418">Moedas e câmbio</translation> +<translation id="6536221421038631327">A remoção de uma assinatura do Passpoint do <ph name="DEVICE_TYPE" /> também remove as redes associadas. Entre em contato com "<ph name="FRIENDLY_NAME" />" para fazer mudanças no seu plano de assinatura. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Fundos mútuos</translation> <translation id="6545864417968258051">Verificação de Bluetooth</translation> <translation id="6547208576736763147">Perfuração dupla no lado esquerdo</translation> @@ -2750,7 +2746,6 @@ <translation id="7696089921647603491">Rock clássico e antigo</translation> <translation id="769721561045429135">No momento, você tem cartões que só podem ser usados neste dispositivo. Clique em "Continuar" para analisá-los.</translation> <translation id="7698864304447945242">Atualizar o Google Play Services para RA?</translation> -<translation id="7699293099605015246">Os artigos não estão disponíveis no momento</translation> <translation id="7701040980221191251">Nenhuma</translation> <translation id="7701544340847569275">Atualização concluída com erros</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Ir para <ph name="SITE" /> (não seguro)<ph name="END_LINK" /></translation> @@ -3351,6 +3346,7 @@ <translation id="9219103736887031265">Imagens</translation> <translation id="922152298093051471">Personalizar o Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Permitir que o app <ph name="APP_NAME" /> configure redes Wi-Fi?</translation> <translation id="936602727769022409">Você pode perder o acesso à sua Conta do Google. O Chromium recomenda que sua senha seja alterada agora. Solicitaremos que você faça login.</translation> <translation id="937457230470581909">Zoológicos, aquários e reservas</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Quais dados são usados<ph name="END_BOLD" />: seus temas de anúncios se baseiam no histórico de navegação recente, uma lista de sites que você visitou usando o Chrome neste dispositivo.</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index 4e018f8f..9d73db3 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Introduziu a palavra-passe num site que não é gerido pela sua organização. Para proteger a conta, não reutilize a sua palavra-passe noutras aplicações e sites.</translation> <translation id="1257553931232494454">níveis de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Prima Tab e, em seguida, Enter para gerir as definições do Chrome</translation> -<translation id="1263231323834454256">Lista de leitura</translation> <translation id="1264309058268477500">Alternativo</translation> <translation id="1264974993859112054">Desporto</translation> <translation id="1266469291454105242">Desbloqueio do dispositivo</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tabuleiro 8</translation> <translation id="1530707389502320859">O site que acabou de tentar visitar parece falso. Por vezes, os atacantes imitam sites ao efetuarem pequenas alterações difíceis de detetar no URL.</translation> <translation id="1532118530259321453">Esta página diz</translation> -<translation id="153384715582417236">É tudo por agora</translation> <translation id="1536390784834419204">Traduzir página</translation> <translation id="1539840569003678498">Denúncia enviada:</translation> <translation id="1549470594296187301">É necessário ativar o JavaScript para usar esta funcionalidade.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">O seu navegador é gerido</translation> <translation id="1746113442205726301">Turno Y da imagem</translation> <translation id="1746531169546376413">0 graus</translation> -<translation id="17513872634828108">Separadores abertos</translation> <translation id="1752021286346845558">Caixa de correio 8</translation> <translation id="1753068535428855445">Encontros e anúncios pessoais</translation> <translation id="1753706481035618306">Número de página</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Experimente executar o Diagnóstico de rede do Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Saiba mais sobre a Navegação anónima no Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Os separadores abertos aparecem aqui</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, prima Tab e, em seguida, Enter para gerir as suas informações, privacidade e segurança na Conta Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, estão disponíveis várias ações, prima Tab para as percorrer.</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">Grupo</translation> <translation id="2576880857912732701">Botão Gerir definições de segurança, prima Enter para gerir a Navegação segura e muito mais nas definições do Chrome</translation> <translation id="2586657967955657006">Área de transferência</translation> -<translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Leia esta e mais <ph name="OTHER_ARTICLE_COUNT" /> notícias.</translation> <translation id="2587841377698384444">ID da API de diretório:</translation> <translation id="2594318783181750337">Visualização na Web rápida:</translation> <translation id="2595719060046994702">Este dispositivo e esta conta não são geridos por uma empresa ou por outra organização.</translation> @@ -1659,14 +1654,13 @@ <translation id="503498442187459473"><ph name="HOST" /> pretende utilizar a câmara e o microfone.</translation> <translation id="5035135400558156732">Jardinagem</translation> <translation id="503574301575803523">SRA3</translation> -<translation id="5039762155821394373">Tamanho do tipo de letra</translation> +<translation id="5039762155821394373">Tamanho da letra</translation> <translation id="5039804452771397117">Permitir</translation> <translation id="5040262127954254034">Privacidade</translation> <translation id="5043480802608081735">Link que copiou</translation> <translation id="5045550434625856497">Palavra-passe incorrecta</translation> <translation id="5051305769747448211">Comédia ao vivo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Para enviar este ficheiro através da funcionalidade Partilhar na proximidade, liberte espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}other{Para enviar estes ficheiros através da funcionalidade Partilhar na proximidade, liberte espaço (<ph name="DISK_SPACE_SIZE" />) no seu dispositivo}}</translation> -<translation id="5056549851600133418">Artigos para si</translation> <translation id="5060483733937416656">Optou por validar com o Windows Hello em Websites que usam o fornecedor <ph name="PROVIDER_ORIGIN" />. Este fornecedor pode ter armazenado informações sobre o seu método de pagamento, que pode <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Será que quis dizer <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Histórico de impressão</translation> @@ -1745,6 +1739,8 @@ <translation id="5234764350956374838">Ignorar</translation> <translation id="5239623327352565343">Acesso à localização permitido</translation> <translation id="5242889659037569123">Malas e acessórios de viagem</translation> +<translation id="5244732203286792411">A carregar… + Pode demorar alguns minutos.</translation> <translation id="5250209940322997802">"Ligar à rede"</translation> <translation id="52517543715119994">Saiba mais acerca das funcionalidades do Chrome</translation> <translation id="5251803541071282808">Nuvem</translation> @@ -1863,7 +1859,6 @@ <translation id="5541086400771735334">Caixa de correio 7</translation> <translation id="5541546772353173584">Adicionar email</translation> <translation id="5543722831081909240">180 graus</translation> -<translation id="5545756402275714221">Artigos para si</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">O Chrome verifica periodicamente se as suas palavras-passe fazem parte das listas publicadas online. Ao fazê-lo, as suas palavras-passe e nomes de utilizador estão encriptados, pelo que não podem ser lidos por ninguém, incluindo a Google.</translation> <translation id="5556459405103347317">Recarregar</translation> @@ -2145,14 +2140,12 @@ <translation id="6266934640124581640">Azul esverdeado claro</translation> <translation id="6272088941196661550">Retome o percurso para ver atividade relevante no seu Histórico do Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">As páginas da sua lista de leitura aparecem aqui</translation> <translation id="627746635834430766">Para pagar mais rapidamente da próxima vez, guarde o cartão e o endereço de faturação na sua Conta Google.</translation> <translation id="6279183038361895380">Premir |<ph name="ACCELERATOR" />| para mostrar o cursor</translation> <translation id="6280223929691119688">Não é possível entregar neste endereço. Selecione um diferente.</translation> <translation id="6284292079994426700">26 x 38 pol.</translation> <translation id="6285507000506177184">Botão Gerir transferências no Chrome, prima Enter para gerir os ficheiros que transferiu no Chrome</translation> <translation id="6289939620939689042">Cor da página</translation> -<translation id="6290238015253830360">Os seus artigos sugeridos são apresentados aqui</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Código de segurança:</translation> <translation id="6295855836753816081">A guardar...</translation> @@ -2303,7 +2296,7 @@ <translation id="6668389483194953109">Foi encontrado o nome do tamanho do papel "personalizado", mas a propriedade "custom_size" está vazia ou é inválida.</translation> <translation id="6671697161687535275">Remover a sugestão do formulário do Chromium?</translation> <translation id="6683717648675961851">Ofertas de emprego</translation> -<translation id="6687335167692595844">Tamanho do tipo de letra solicitado</translation> +<translation id="6687335167692595844">Tamanho da letra solicitado</translation> <translation id="6687696737818665306">Representação e teatro</translation> <translation id="6688743156324860098">Atualizar…</translation> <translation id="6688775486821967877">O cartão virtual não está disponível neste momento. Tente mais tarde</translation> @@ -2752,7 +2745,6 @@ <translation id="7696089921647603491">Rock clássico e músicas antigas</translation> <translation id="769721561045429135">De momento, tem cartões que apenas podem ser utilizados neste dispositivo. Clique em Continuar para rever os cartões.</translation> <translation id="7698864304447945242">Atualizar os Serviços do Google Play para realidade aumentada?</translation> -<translation id="7699293099605015246">De momento, não estão disponíveis artigos</translation> <translation id="7701040980221191251">Nenhuma</translation> <translation id="7701544340847569275">Atualização concluída com erros</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Prosseguir para <ph name="SITE" /> (não seguro)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb index e4a5675..4cd2746 100644 --- a/components/strings/components_strings_ro.xtb +++ b/components/strings/components_strings_ro.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ai introdus parola pe un site care nu este gestionat de organizația ta. Pentru a proteja contul, nu folosi aceeași parolă pentru alte aplicații și site-uri.</translation> <translation id="1257553931232494454">Niveluri de zoom</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Apasă pe Tab, apoi pe Enter pentru a gestiona setările Chrome</translation> -<translation id="1263231323834454256">Lista de lectură</translation> <translation id="1264309058268477500">Alternativă</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Deblocarea dispozitivului</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tava 8</translation> <translation id="1530707389502320859">Site-ul pe care ai încercat să-l accesezi pare fals. Uneori, atacatorii imită site-uri aducând modificări mici, greu de observat, adresei URL.</translation> <translation id="1532118530259321453">Această pagină afișează mesajul</translation> -<translation id="153384715582417236">Asta este tot</translation> <translation id="1536390784834419204">Tradu pagina</translation> <translation id="1539840569003678498">Raportul a fost trimis:</translation> <translation id="1549470594296187301">Trebuie să activezi JavaScript pentru a folosi această funcție.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Browserul tău este gestionat</translation> <translation id="1746113442205726301">Deplasarea poziției Y a imaginii</translation> <translation id="1746531169546376413">0 grade</translation> -<translation id="17513872634828108">File deschise</translation> <translation id="1752021286346845558">Căsuța de e-mail 8</translation> <translation id="1753068535428855445">Servicii și anunțuri matrimoniale</translation> <translation id="1753706481035618306">Numărul paginii</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Rulează Diagnostice rețea Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Află mai multe despre modul incognito în Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Filele deschise sunt afișate aici</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, apasă pe Tab, apoi pe Enter pentru a gestiona informațiile, confidențialitatea și securitatea Contului Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, sunt disponibile mai multe acțiuni, apasă pe Tab pentru a le răsfoi</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupează</translation> <translation id="2576880857912732701">Butonul Gestionează setările de securitate, apasă pe Enter pentru a gestiona Navigarea sigură și alte opțiuni din setările Chrome</translation> <translation id="2586657967955657006">Clipboard</translation> -<translation id="2587730715158995865">De la <ph name="ARTICLE_PUBLISHER" />. Citește acest articol și încă <ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">ID-ul API-ului Directory:</translation> <translation id="2594318783181750337">Vizualizare pe web rapidă:</translation> <translation id="2595719060046994702">Dispozitivul și contul nu sunt gestionate de o companie sau o altă organizație.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Parolă incorectă</translation> <translation id="5051305769747448211">Comedie în direct</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Pentru a trimite fișierul prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}few{Pentru a trimite fișierele prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}other{Pentru a trimite fișierele prin Trimitere în apropiere, eliberează spațiu (<ph name="DISK_SPACE_SIZE" />) pe dispozitiv}}</translation> -<translation id="5056549851600133418">Articole pentru tine</translation> <translation id="5060483733937416656">Ai ales să confirmi cu Windows Hello pe site-urile care folosesc <ph name="PROVIDER_ORIGIN" />. Este posibil ca acest furnizor să fi stocat informații despre metoda de plată, pe care le poți <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Ai vrut să scrii <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Istoricul de printare</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Închide</translation> <translation id="5239623327352565343">Folosirea locației este permisă</translation> <translation id="5242889659037569123">Bagaje și accesorii pentru călătorii</translation> +<translation id="5244732203286792411">Se încarcă… + Încărcarea poate dura câteva secunde.</translation> <translation id="5250209940322997802">„Conectează-te la rețea”</translation> <translation id="52517543715119994">Află despre funcțiile Chrome</translation> <translation id="5251803541071282808">Cloud</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Căsuța de e-mail 7</translation> <translation id="5541546772353173584">Adaugă o adresă de e-mail</translation> <translation id="5543722831081909240">180 de grade</translation> -<translation id="5545756402275714221">Articole pentru tine</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome compară periodic parolele tale cu cele din listele publicate online. Când face acest lucru, parolele și numele tale de utilizator sunt criptate, astfel încât să nu fie descifrate de nimeni, nici măcar de Google.</translation> <translation id="5556459405103347317">Reîncarcă</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Turcoaz deschis</translation> <translation id="6272088941196661550">Continuă-ți parcursul pentru a vedea activitatea relevantă din istoricul Chrome</translation> <translation id="6272383483618007430">Actualizare Google</translation> -<translation id="6276112860590028508">Paginile din lista de lectură sunt afișate aici</translation> <translation id="627746635834430766">Pentru a plăti mai rapid data viitoare, salvează cardul și adresa de facturare în Contul Google.</translation> <translation id="6279183038361895380">Apasă pe |<ph name="ACCELERATOR" />| pentru a fi afișat cursorul</translation> <translation id="6280223929691119688">Nu se poate livra la această adresă. Selectează altă adresă.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Butonul de gestionare a descărcărilor în Chrome, apasă pe Enter pentru a gestiona fișierele pe care le-ai descărcat în Chrome</translation> <translation id="6289939620939689042">Culoarea paginii</translation> -<translation id="6290238015253830360">Articolele sugerate apar aici</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Se salvează...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Rock clasic și oldies</translation> <translation id="769721561045429135">În acest moment ai carduri care pot fi folosite doar pe acest dispozitiv. Dă clic pe Continuă pentru a vedea cardurile.</translation> <translation id="7698864304447945242">Actualizezi Serviciile Google Play pentru realitate augmentată?</translation> -<translation id="7699293099605015246">Articolele nu sunt disponibile în acest moment</translation> <translation id="7701040980221191251">Niciuna</translation> <translation id="7701544340847569275">Actualizarea s-a finalizat cu erori</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Accesați <ph name="SITE" /> (nesigur)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 83ef9b3..2b93939 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Вы ввели пароль на сайте, которым не управляет ваша организация. Чтобы защитить свой аккаунт, не используйте этот пароль для других приложений и сайтов.</translation> <translation id="1257553931232494454">масштабирование</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Нажмите Tab, а затем Ввод, чтобы задать настройки Chrome.</translation> -<translation id="1263231323834454256">Список для чтения</translation> <translation id="1264309058268477500">Другой</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Разблокировка устройства</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Лоток 8</translation> <translation id="1530707389502320859">Сайт, на который вы пытались перейти, похож на подделку. Иногда злоумышленники создают копии сайтов и вносят небольшие изменения в их адрес, которые сложно заметить сразу.</translation> <translation id="1532118530259321453">Подтвердите действие</translation> -<translation id="153384715582417236">Пока это всё</translation> <translation id="1536390784834419204">Перевести страницу</translation> <translation id="1539840569003678498">Отчет отправлен:</translation> <translation id="1549470594296187301">Для использования этой функции необходимо включить JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Этот браузер управляется администратором</translation> <translation id="1746113442205726301">Смещение изображения по оси Y</translation> <translation id="1746531169546376413">0 градусов</translation> -<translation id="17513872634828108">Открытые вкладки</translation> <translation id="1752021286346845558">Почтовый ящик 8</translation> <translation id="1753068535428855445">Встречи и знакомства</translation> <translation id="1753706481035618306">Номер страницы</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Выполните диагностику сети в Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949">Подробнее <ph name="BEGIN_LINK" />о режиме инкогнито в Chromium<ph name="END_LINK" />…</translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Здесь появятся открытые вкладки.</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />. Чтобы управлять своими данными, конфиденциальностью и безопасностью в аккаунте Google, нажмите Tab, а затем Ввод.</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Возможны разные действия. Нажимайте Tab для переключения между ними.</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Реквизиты виртуальной карты</translation> <translation id="1803020234906945288">Здоровое питание</translation> <translation id="1803351196216024260">Разрешено отправлять запрос на использование микрофона</translation> +<translation id="1806174020048213474">Приложение запрашивает разрешение на установку учетных данных Wi-Fi. Это позволит устройству <ph name="DEVICE_TYPE" /> автоматически подключаться к связанным сетям Wi-Fi. Чтобы стереть эти учетные данные, удалите приложение.</translation> <translation id="1807246157184219062">Светлая</translation> <translation id="1807528111851433570">Первый лист</translation> <translation id="180991881384371158">CVC-код находится на обратной стороне вашей карты. Это 3 цифры в правом верхнем углу поля для подписи.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Группа</translation> <translation id="2576880857912732701">Кнопка "Открыть настройки безопасности". Нажмите Ввод, чтобы задать параметры Безопасного просмотра и других функций в настройках Chrome.</translation> <translation id="2586657967955657006">Буфер обмена</translation> -<translation id="2587730715158995865">Источник: <ph name="ARTICLE_PUBLISHER" />. Доступно ещё несколько статей (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Идентификатор Directory API:</translation> <translation id="2594318783181750337">Быстрый просмотр в Web:</translation> <translation id="2595719060046994702">Это устройство и аккаунт не находятся под управлением компании или организации.</translation> @@ -1340,6 +1336,7 @@ <translation id="4270541775497538019">Укладчик 6</translation> <translation id="4274173425554582601">Компьютеры и электроника</translation> <translation id="4275830172053184480">Перезапуск устройства</translation> +<translation id="4276974990916607331">Нет, спасибо</translation> <translation id="4277028893293644418">Сбросить пароль</translation> <translation id="4277937682389409325">Местный адрес</translation> <translation id="4278390842282768270">Разрешено</translation> @@ -1663,7 +1660,6 @@ <translation id="5045550434625856497">Неправильный пароль</translation> <translation id="5051305769747448211">Комедийные выступления</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Чтобы отправить этот файл с помощью функции "Обмен с окружением", освободите место (<ph name="DISK_SPACE_SIZE" />) на своем устройстве.}one{Чтобы отправить эти файлы с помощью функции "Обмен с окружением", освободите место (<ph name="DISK_SPACE_SIZE" />) на своем устройстве.}few{Чтобы отправить эти файлы с помощью функции "Обмен с окружением", освободите место (<ph name="DISK_SPACE_SIZE" />) на своем устройстве.}many{Чтобы отправить эти файлы с помощью функции "Обмен с окружением", освободите место (<ph name="DISK_SPACE_SIZE" />) на своем устройстве.}other{Чтобы отправить эти файлы с помощью функции "Обмен с окружением", освободите место (<ph name="DISK_SPACE_SIZE" />) на своем устройстве.}}</translation> -<translation id="5056549851600133418">Статьи для вас</translation> <translation id="5060483733937416656">Вы выбрали Windows Hello для подтверждения покупок на сайтах, пользующихся услугами поставщика <ph name="PROVIDER_ORIGIN" />. Он мог сохранить информацию о вашем способе оплаты. У вас есть право <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Вам нужен домен <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Историю печати.</translation> @@ -1701,6 +1697,7 @@ <translation id="5129534298163637277">Окно подтверждения</translation> <translation id="5135404736266831032">Управление адресами…</translation> <translation id="5136841603454277753">Неверный код.</translation> +<translation id="5137761395480718572">Приложение запрашивает разрешение на установку учетных данных Wi-Fi. Это позволит устройству <ph name="DEVICE_TYPE" /> автоматически подключаться к связанным сетям Wi-Fi. Чтобы стереть эти учетные данные, удалите приложение. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Сейчас виртуальная карта недоступна. Обратитесь в свой банк.</translation> <translation id="5138227688689900538">Свернуть</translation> <translation id="5145883236150621069">При проверке политики возвращен код ошибки</translation> @@ -1741,6 +1738,8 @@ <translation id="5234764350956374838">Закрыть</translation> <translation id="5239623327352565343">Доступ к данным о местоположении разрешен</translation> <translation id="5242889659037569123">Багаж и туристические аксессуары</translation> +<translation id="5244732203286792411">Загрузка… + Это не займет много времени.</translation> <translation id="5250209940322997802">"Подключитесь к сети"</translation> <translation id="52517543715119994">Подробнее о функциях Chrome</translation> <translation id="5251803541071282808">Облако</translation> @@ -1755,6 +1754,7 @@ <translation id="5273881944177595304">Веб-приложения и онлайн-инструменты</translation> <translation id="5274025349362408263">Книги и литература</translation> <translation id="5279286380302340275">Открыть список скачанных файлов</translation> +<translation id="5279453600310613955">Нет, спасибо</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Свойства документа</translation> <translation id="528468243742722775">Завершить</translation> @@ -1858,7 +1858,6 @@ <translation id="5541086400771735334">Почтовый ящик 7</translation> <translation id="5541546772353173584">Добавьте адрес электронной почты</translation> <translation id="5543722831081909240">180 градусов</translation> -<translation id="5545756402275714221">Статьи для вас</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Время от времени Chrome проверяет, есть ли ваши пароли в списках, опубликованных в Интернете. При этом имена пользователей и сами пароли зашифрованы и никому не видны, даже сотрудникам Google.</translation> <translation id="5556459405103347317">Перезагрузить</translation> @@ -2140,14 +2139,12 @@ <translation id="6266934640124581640">Светло-бирюзовый</translation> <translation id="6272088941196661550">Посмотреть похожие действия в истории Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Здесь будут страницы из списка для чтения.</translation> <translation id="627746635834430766">Чтобы ускорить процесс оплаты в будущем, сохраните карту и платежный адрес в аккаунте Google.</translation> <translation id="6279183038361895380">Чтобы показать курсор, нажмите |<ph name="ACCELERATOR" />|</translation> <translation id="6280223929691119688">Невозможно доставить заказ по этому адресу. Выберите другой вариант.</translation> <translation id="6284292079994426700">26 x 38 дюймов</translation> <translation id="6285507000506177184">Кнопка "Управлять скачанными файлами в Chrome". Нажмите Ввод, чтобы управлять скачанными файлами в Chrome.</translation> <translation id="6289939620939689042">Цвет страницы</translation> -<translation id="6290238015253830360">Здесь появятся рекомендуемые статьи.</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">Код CVC:</translation> <translation id="6295855836753816081">Сохранение...</translation> @@ -2250,6 +2247,7 @@ <translation id="6529173248185917884">Седьмой рулон</translation> <translation id="6529602333819889595">&Повторить удаление</translation> <translation id="6535751101619004418">Денежные единицы и обмен валют</translation> +<translation id="6536221421038631327">Если вы отмените подписку Passpoint на устройстве <ph name="DEVICE_TYPE" />, данные о связанных сетях будут удалены. Сменить тарифный план можно в приложении "<ph name="FRIENDLY_NAME" />". <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Паевые инвестиционные фонды</translation> <translation id="6545864417968258051">Поиск Bluetooth-устройств</translation> <translation id="6547208576736763147">Два отверстия слева</translation> @@ -2665,7 +2663,7 @@ <translation id="7535087603100972091">Значение</translation> <translation id="7537536606612762813">Обязательная</translation> <translation id="7542995811387359312">Автозаполнение отключено – незащищенное подключение.</translation> -<translation id="7543525346216957623">Обратитесь за помощью к родителю</translation> +<translation id="7543525346216957623">Попроси родителя помочь</translation> <translation id="7546409722674205727">Запуск приложения "<ph name="APP_NAME" />"…</translation> <translation id="7548892272833184391">Как устранить ошибки при подключении к Интернету</translation> <translation id="7549584377607005141">Для корректного отображения веб-страницы требуются введенные ранее данные. Их можно отправить повторно, но в этом случае все действия на странице будут выполнены снова.</translation> @@ -2747,7 +2745,6 @@ <translation id="7696089921647603491">Классический рок и старые популярные песни</translation> <translation id="769721561045429135">Сейчас ваши карты можно использовать только на этом устройстве. Чтобы посмотреть информацию о них, нажмите "Продолжить".</translation> <translation id="7698864304447945242">Обновить Сервисы Google Play для AR?</translation> -<translation id="7699293099605015246">Статьи пока недоступны</translation> <translation id="7701040980221191251">Нет</translation> <translation id="7701544340847569275">Обновление завершено с ошибками</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перейти на сайт <ph name="SITE" /> (небезопасно)<ph name="END_LINK" /></translation> @@ -2839,7 +2836,7 @@ <translation id="7951415247503192394">(32 бит)</translation> <translation id="7952192831285741665">European EDP</translation> <translation id="7953569069500808819">Скобы по верхнему краю</translation> -<translation id="7955105108888461311">Запросить доступ лично</translation> +<translation id="7955105108888461311">Попросить лично</translation> <translation id="7956713633345437162">Моб. закладки</translation> <translation id="7961015016161918242">Нет</translation> <translation id="7962467575542381659">Устройство платформы</translation> @@ -3346,6 +3343,7 @@ <translation id="9219103736887031265">Картинки</translation> <translation id="922152298093051471">Настроить Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Разрешить приложению "<ph name="APP_NAME" />" настраивать сети Wi-Fi?</translation> <translation id="936602727769022409">Вы можете потерять доступ к аккаунту Google. Рекомендуем немедленно сменить пароль. После этого потребуется снова войти в аккаунт.</translation> <translation id="937457230470581909">Зоопарки, аквариумы и заповедники</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Какие данные используются.<ph name="END_BOLD" /> Темы рекламы подбираются на основе истории браузера – списка сайтов, которые вы открывали в Chrome на этом устройстве.</translation>
diff --git a/components/strings/components_strings_si.xtb b/components/strings/components_strings_si.xtb index d8b21ffb..af1b43dc 100644 --- a/components/strings/components_strings_si.xtb +++ b/components/strings/components_strings_si.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">ඔබ ඔබේ සංවිධානය විසින් කළමනාකරණය නොකරන ලද වෙබ් අඩවියක ඔබේ මුරපදය ඇතුළු කර ඇත. ඔබේ ගිණුම ආරක්ෂා කිරීම සඳහා වෙනත් යෙදුම් සහ අඩවි මත ඔබේ මුරපදය නැවත භාවිත නොකරන්න.</translation> <translation id="1257553931232494454">විශාලන මට්ටම්</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ඔබගේ Chrome සැකසීම් කළමනාකරණය කිරීමට Tab ඔබා අනතුරුව Enter ඔබන්න</translation> -<translation id="1263231323834454256">කියවීම් ලැයිස්තුව</translation> <translation id="1264309058268477500">Alternate</translation> <translation id="1264974993859112054">ක්රීඩා</translation> <translation id="1266469291454105242">උපාංග අගුලු හැරීම</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">බඳුන 8</translation> <translation id="1530707389502320859">ඔබ මේ දැන් පැමිණීමට උත්සාහ කළ වෙබ් අඩවිය ව්යාජ බව පෙනේ. ප්රහාරකයින් සමහර විට URL වෙත කුඩා, බැලීමට අපහසු වෙනස්කම් කිරීමෙන් වෙබ් අඩවි අනුකාර කරති.</translation> <translation id="1532118530259321453">මෙම පිටුව කියයි</translation> -<translation id="153384715582417236">දැනට එපමණයි</translation> <translation id="1536390784834419204">පිටුව පරිවර්තනය කරන්න</translation> <translation id="1539840569003678498">වාර්තාව යවන ලදි:</translation> <translation id="1549470594296187301">මෙම විශේෂාංගය භාවිත කිරීමට ජාවාස්ක්රිප්ට් සබල කළ යුතුය.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">ඔබේ බ්රවුසරය කළමනා කෙරේ</translation> <translation id="1746113442205726301">රූපයේ Y වැඩ මුරය</translation> <translation id="1746531169546376413">අංශක 0</translation> -<translation id="17513872634828108">පටිති විවෘත කරන්න</translation> <translation id="1752021286346845558">තැපැල් පෙට්ටිය 8</translation> <translation id="1753068535428855445">පෙම්හමු සහ පුද්ගලික</translation> <translation id="1753706481035618306">පිටු අංකය</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows ජාල දෝෂහරණ ධාවනය කිරීමට උත්සාහ කරන්න<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium හි අප්රසිද්ධ ගැන තව දැන ගන්න<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">ඔබේ විවෘත කළ පටිති මෙහි දිස් වේ</translation> <translation id="1791429645902722292">Google ස්මාට් අගුල</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, ඔබගේ Google ගිණුමේ ඔබගේ තොරතුරු, පෞද්ගලිකත්වය සහ ආරක්ෂාව කළමනාකරණය කිරීමට Tab ඔබා අනතුරුව Enter ඔබන්න</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, බහුවිධ ක්රියාමාර්ග ලබා ගත හැකිය, ඒවා හරහා චක්රීය කිරීමට Tab ඔබන්න</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">සමූහය</translation> <translation id="2576880857912732701">ආරක්ෂක සැකසීම් කළමනාකරණය කරන්න බොත්තම, Chrome සැකසීම් තුළ ඔබගේ සුරක්ෂිත බ්රවුස් කිරීම සහ තවත් දේවල් කළමනාකරණය කිරීමට Enter ඔබන්න</translation> <translation id="2586657967955657006">පසුරු පුවරුව</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> වෙතින්. මෙය සහ තවත් කථාන්දර <ph name="OTHER_ARTICLE_COUNT" />ක් කියවන්න.</translation> <translation id="2587841377698384444">නාමාවලිය API ID:</translation> <translation id="2594318783181750337">වේගවත් වෙබ් දසුන:</translation> <translation id="2595719060046994702">මෙම උපාංගය සහ ගිණුම සමාගමක් හෝ වෙනත් සංවිධානයක් විසින් කළමනා නොකෙරෙති.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">රහස්වචනය වැරදියි</translation> <translation id="5051305769747448211">සජීවී ප්රහසන</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{ළඟ බෙදා ගැනීම භාවිතයෙන් මෙම ගොනුව යැවීමට, ඔබගේ උපාංගයෙහි (<ph name="DISK_SPACE_SIZE" />) හිස් කරන්න}one{ළඟ බෙදා ගැනීම භාවිතයෙන් මෙම ගොනු යැවීමට, ඔබගේ උපාංගයෙහි (<ph name="DISK_SPACE_SIZE" />) හිස් කරන්න}other{ළඟ බෙදා ගැනීම භාවිතයෙන් මෙම ගොනු යැවීමට, ඔබගේ උපාංගයෙහි (<ph name="DISK_SPACE_SIZE" />) හිස් කරන්න}}</translation> -<translation id="5056549851600133418">ඔබ සඳහා ලිපි</translation> <translation id="5060483733937416656">ඔබ <ph name="PROVIDER_ORIGIN" /> භාවිත කරන වෙබ් අඩවිවල Windows Hello සමඟ සත්යාපනය කිරීමට තෝරා ඇත. මෙම සපයන්නා ඔබට <ph name="LINK_TEXT" /> හැකි, ඔබගේ ගෙවීම් ක්රමය පිළිබඳ තොරතුරු ගබඩා කර තිබිය හැකිය.</translation> <translation id="5061227663725596739">ඔබ අදහස් කළේ <ph name="LOOKALIKE_DOMAIN" /> ද?</translation> <translation id="5066056036849835175">මුද්රණ ඉතිහාසය</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">ඉවත් කරන්න</translation> <translation id="5239623327352565343">ස්ථානය ඉඩ දී ඇත</translation> <translation id="5242889659037569123">ගමන් මලු සහ සංචාර උපකරණ</translation> +<translation id="5244732203286792411">පූරණය කරමින්... + මෙයට මිනිත්තුවක් ගත විය හැක.</translation> <translation id="5250209940322997802">"ජාලයට සබඳින්න"</translation> <translation id="52517543715119994">Chrome විශේෂාංග ගැන දැන ගන්න</translation> <translation id="5251803541071282808">වලාකුළ</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">තැපැල් පෙට්ටිය 7</translation> <translation id="5541546772353173584">ඊ-තැපෑල එක් කරන්න</translation> <translation id="5543722831081909240">අංශක 180</translation> -<translation id="5545756402275714221">ඔබ සඳහා ලිපි</translation> <translation id="5551890439174915351">මිමි 100 x 200</translation> <translation id="5552137475244467770">=සබැඳිව ප්රකාශන කර ඇති ලැයිස්තුවලට එරෙහි Chrome කලින් කල ඔබේ මුරපද පරීක්ෂා කරයි. මෙය සිදු කරන විට, ඔබේ මුරපද සහ පරිශීලක නාම සංකේතන කෙරේ, එවිට Google ඇතුළුව කිසි කෙනෙකුට ඒවා කියවීමට නොහැකි වෙයි.</translation> <translation id="5556459405103347317">නැවත</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">ලා හරිත නිල්</translation> <translation id="6272088941196661550">ඔබගේ Chrome ඉතිහාසය තුළ අදාළ ක්රියාකාරකම් බැලීමට ඔබගේ සංචාරය නැවත පටන් ගන්න</translation> <translation id="6272383483618007430">Google යාවත්කාලීන</translation> -<translation id="6276112860590028508">ඔබේ කියවීම් ලැයිස්තුවෙන් පිටු මෙහි දිස් වනු ඇත</translation> <translation id="627746635834430766">මීළඟ වතාවේ දී වේගවත්ව ගෙවීමට, ඔබේ Google ගිණුමට ඔබේ කාඩ්පත සහ බිල්පත් ලිපිනය සුරකින්න.</translation> <translation id="6279183038361895380">ඔබේ කර්සරය පෙන්වීමට |<ph name="ACCELERATOR" />| ඔබන්න</translation> <translation id="6280223929691119688">මෙම ලිපිනයට බෙදා හැරීමට නොහැකිය. වෙනත් ලිපිනයක් තෝරන්න.</translation> <translation id="6284292079994426700">අඟ 26 x 38</translation> <translation id="6285507000506177184">Chrome තුළ බාගැනීම් කළමනාකරණය කරන්න බොත්තම, ඔබ Chrome තුළ බාගත් ගොනු කළමනාකරණය කිරීමට Enter ඔබන්න</translation> <translation id="6289939620939689042">පිටුවේ වර්ණය</translation> -<translation id="6290238015253830360">ඔබේ යෝජිත ලිපි මෙහි දිස්වනු ඇත</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">සුරකිමින්...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">සම්භාව්ය රොක් සහ පැරණි ගී</translation> <translation id="769721561045429135">මේ දැන්, ඔබට මෙම උපාංගය මත පමණක් භාවිත කළ හැකි කාඩ්පත් තිබේ. කාඩ්පත් සමාලෝචන කිරීමට ඉදිරියට යන්න ක්ලික් කරන්න.</translation> <translation id="7698864304447945242">AR සඳහා වන Google Play සේවා යාවත්කාලීන කරන්න ද?</translation> -<translation id="7699293099605015246">ලිපි දැන් නොතිබේ</translation> <translation id="7701040980221191251">නොමැත</translation> <translation id="7701544340847569275">දෝෂ සහිතව යාවත්කාලීනය අවසන් විය</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> (අනාරක්ෂිත) වෙත කරගෙන යන්න<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index fc4b185f..f3374ce 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Zadali ste heslo na webe, ktorý nie je spravovaný vašou organizáciou. Ak chcete, aby bol váš účet chránený, nepoužívajte dané heslo pre iné aplikácie a weby.</translation> <translation id="1257553931232494454">úrovne lupy</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, po stlačení klávesov Tab a Enter môžete spravovať nastavenia Chromu</translation> -<translation id="1263231323834454256">Čitateľský zoznam</translation> <translation id="1264309058268477500">Alternatívna</translation> <translation id="1264974993859112054">Šport</translation> <translation id="1266469291454105242">Odomknutie zariadením</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Priehradka č. 8</translation> <translation id="1530707389502320859">Web, ktorý sa pokúšate navštíviť, vyzerá falošne. Útočníci niekedy weby napodobňujú tak, že vo webovej adrese vykonajú drobné, ťažko odhaliteľné zmeny.</translation> <translation id="1532118530259321453">Táto stránka hovorí</translation> -<translation id="153384715582417236">To je zatiaľ všetko</translation> <translation id="1536390784834419204">Preložiť stránku</translation> <translation id="1539840569003678498">Hlásenie bolo odoslané:</translation> <translation id="1549470594296187301">Ak chcete použiť túto funkciu, musíte povoliť JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Váš prehliadač je spravovaný</translation> <translation id="1746113442205726301">Posun obrázka na osi Y</translation> <translation id="1746531169546376413">0°</translation> -<translation id="17513872634828108">Otvorené karty</translation> <translation id="1752021286346845558">Poštová schránka č. 8</translation> <translation id="1753068535428855445">Zoznámenia a osobné inzeráty</translation> <translation id="1753706481035618306">Číslo stránky</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Skúste spustiť nástroj Diagnostika siete systému Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Ďalšie informácie o režime inkognito v prehliadači Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tu sa zobrazia otvorené karty</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, postupným stlačením klávesov Tab a Enter môžete spravovať informácie, ochranu súkromia a zabezpečenie v účte Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, k dispozícii je viac akcií, stlačením klávesa Tab po nich prechádzajte</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Podrobnosti virtuálnej karty</translation> <translation id="1803020234906945288">Zdravá výživa</translation> <translation id="1803351196216024260">Môže žiadať o povolenie používať mikrofón</translation> +<translation id="1806174020048213474">Táto aplikácia vyžaduje povolenie inštalovať prihlasovacie údaje sietí Wi‑Fi. Po nastavení sa bude <ph name="DEVICE_TYPE" /> automaticky pripájať k zúčastneným sieťam Wi‑Fi. Ak chcete tieto prihlasovacie údaje odstrániť, odinštalujte aplikáciu.</translation> <translation id="1807246157184219062">Svetlý režim</translation> <translation id="1807528111851433570">Začiatočný hárok</translation> <translation id="180991881384371158">Overovací kód karty nájdete na jej zadnej strane. Ide o posledné tri číslice vpravo hore v poli pre podpis.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Skupina</translation> <translation id="2576880857912732701">Tlačidlo na správu nastavení zabezpečenia, stlačením klávesa Enter spravujte Bezpečné prehliadanie a ďalšie položky v nastaveniach Chromu</translation> <translation id="2586657967955657006">Schránka</translation> -<translation id="2587730715158995865">Od vydavateľa <ph name="ARTICLE_PUBLISHER" />. Prečítajte si tento príbeh a ďalšie (<ph name="OTHER_ARTICLE_COUNT" />).</translation> <translation id="2587841377698384444">Identifikátor priečinka API:</translation> <translation id="2594318783181750337">Rýchle webové zobrazenie:</translation> <translation id="2595719060046994702">Toto zariadenie a účet nespravuje spoločnosť ani iná organizácia.</translation> @@ -1337,6 +1333,7 @@ <translation id="4270541775497538019">Odkladač č. 6</translation> <translation id="4274173425554582601">Počítače a elektronika</translation> <translation id="4275830172053184480">Reštart zariadenia</translation> +<translation id="4276974990916607331">Nie, vďaka</translation> <translation id="4277028893293644418">Obnoviť heslo</translation> <translation id="4277937682389409325">Miestna adresa</translation> <translation id="4278390842282768270">Povolené</translation> @@ -1660,7 +1657,6 @@ <translation id="5045550434625856497">Nesprávne heslo</translation> <translation id="5051305769747448211">Živé komédie</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ak chcete tento súbor poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}few{Ak chcete tieto súbory poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}many{To send these files using Nearby Share, free up space (<ph name="DISK_SPACE_SIZE" />) on your device}other{Ak chcete tieto súbory poslať pomocou Zdieľania nablízku, uvoľnite vo svojom zariadení priestor (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Články pre vás</translation> <translation id="5060483733937416656">Na weboch využívajúcich poskytovateľa <ph name="PROVIDER_ORIGIN" /> ste vybrali overenie pomocou funkcie Windows Hello. Tento poskytovateľ mohol ukladať informácie o vašom spôsobe platby, o ktorých odstránenie môžete <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Mysleli ste <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">História tlače</translation> @@ -1698,6 +1694,7 @@ <translation id="5129534298163637277">Dialógové okno potvrdenia</translation> <translation id="5135404736266831032">Spravovať adresy…</translation> <translation id="5136841603454277753">Zadajte správny kód</translation> +<translation id="5137761395480718572">Táto aplikácia vyžaduje povolenie inštalovať prihlasovacie údaje sietí Wi‑Fi. Po nastavení sa bude <ph name="DEVICE_TYPE" /> automaticky pripájať k zúčastneným sieťam Wi‑Fi. Ak chcete tieto prihlasovacie údaje odstrániť, odinštalujte aplikáciu. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtuálna karta nie je momentálne k dispozícii, kontaktujte svoju banku</translation> <translation id="5138227688689900538">Zobraziť menej</translation> <translation id="5145883236150621069">V odpovedi na pravidlo sa nachádza kód chyby</translation> @@ -1752,6 +1749,7 @@ <translation id="5273881944177595304">Webové aplikácie a online nástroje</translation> <translation id="5274025349362408263">Knihy a literatúra</translation> <translation id="5279286380302340275">Spravovať sťahovanie</translation> +<translation id="5279453600310613955">Nie, vďaka</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Vlastnosti dokumentu</translation> <translation id="528468243742722775">Koniec</translation> @@ -1855,7 +1853,6 @@ <translation id="5541086400771735334">Poštová schránka č. 7</translation> <translation id="5541546772353173584">Pridanie e-mailu</translation> <translation id="5543722831081909240">180°</translation> -<translation id="5545756402275714221">Články pre vás</translation> <translation id="5551890439174915351">100 × 200 mm</translation> <translation id="5552137475244467770">Chrome pravidelne kontroluje heslá podľa zoznamov, ktoré boli zverejnené online. Vaše heslá a používateľské mená sú pritom šifrované, aby ich nikto nemohol prečítať (ani Google).</translation> <translation id="5556459405103347317">Znova načítať</translation> @@ -2136,14 +2133,12 @@ <translation id="6266934640124581640">Svetlá modrozelená</translation> <translation id="6272088941196661550">Pokračujte v ceste a zobrazte si relevantnú aktivitu v histórii Chromu</translation> <translation id="6272383483618007430">Aktualizácie Google</translation> -<translation id="6276112860590028508">Tu nájdete stránky z čitateľského zoznamu</translation> <translation id="627746635834430766">Ak chcete nabudúce zaplatiť rýchlejšie, uložte si kartu a fakturačnú adresu do účtu Google.</translation> <translation id="6279183038361895380">Stlačením klávesa |<ph name="ACCELERATOR" />| zobrazíte kurzor</translation> <translation id="6280223929691119688">Doručenie na túto adresu nie je možné. Vyberte inú adresu.</translation> <translation id="6284292079994426700">26 × 38 palcov</translation> <translation id="6285507000506177184">Tlačidlo na správu stiahnutých súborov v Chrome, stlačením klávesa Enter spravujte súbory stiahnuté v Chrome</translation> <translation id="6289939620939689042">Farba stránky</translation> -<translation id="6290238015253830360">Tu sa zobrazia vaše navrhované články</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Ukladá sa...</translation> @@ -2246,6 +2241,7 @@ <translation id="6529173248185917884">Siedmy kotúč</translation> <translation id="6529602333819889595">&Znova odstrániť</translation> <translation id="6535751101619004418">Meny a kurzy mien</translation> +<translation id="6536221421038631327">Keď zo svojho zariadenia <ph name="DEVICE_TYPE" /> odstránite odber Passpoint, odstránia sa aj spojené siete. Ak chcete v paušále vykonať zmeny, kontaktujte službu <ph name="FRIENDLY_NAME" />. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Podielové fondy</translation> <translation id="6545864417968258051">Vyhľadávanie zariadení Bluetooth</translation> <translation id="6547208576736763147">Dve dierky vľavo</translation> @@ -2743,7 +2739,6 @@ <translation id="7696089921647603491">Klasický rock a staré hity</translation> <translation id="769721561045429135">Momentálne máte karty, ktoré je možné použiť iba v tomto zariadení Ak chcete skontrolovať karty, kliknite na Pokračovať.</translation> <translation id="7698864304447945242">Chcete aktualizovať Služby Google Play pre RR?</translation> -<translation id="7699293099605015246">Články nie sú momentálne k dispozícii</translation> <translation id="7701040980221191251">Žiadne</translation> <translation id="7701544340847569275">Aktualizácia bola dokončená s chybami</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Prejsť na stránky <ph name="SITE" /> (nebezpečné)<ph name="END_LINK" /></translation> @@ -3343,6 +3338,7 @@ <translation id="9219103736887031265">Obrázky</translation> <translation id="922152298093051471">Prispôsobiť Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Chcete povoliť aplikácii <ph name="APP_NAME" /> nastavovať siete Wi‑Fi?</translation> <translation id="936602727769022409">Môžete stratiť prístup do účtu Google. Chromium odporúča, aby ste si ihneď zmenili heslo. Zobrazí sa výzva na prihlásenie.</translation> <translation id="937457230470581909">Zoologické záhrady, akváriá a rezervácie</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Aké údaje sa používajú:<ph name="END_BOLD" /> Témy reklám sú založené na vašej nedávnej histórii prehliadania, teda zozname webov, ktoré ste navštívili pomocou Chromu v tomto zariadení.</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb index 25251e1..51a690d 100644 --- a/components/strings/components_strings_sl.xtb +++ b/components/strings/components_strings_sl.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Vnesli ste geslo na spletnem mestu, ki ga ne upravlja vaša organizacija. Zaradi zaščite računa gesla ne uporabljajte za druge aplikacije in spletna mesta.</translation> <translation id="1257553931232494454">ravni povečave/pomanjšave</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tabulatorko, nato Enter, če želite upravljati Chromove nastavitve</translation> -<translation id="1263231323834454256">Bralni seznam</translation> <translation id="1264309058268477500">Nadomestni</translation> <translation id="1264974993859112054">Šport</translation> <translation id="1266469291454105242">Odklepanje naprave</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Pladenj 8</translation> <translation id="1530707389502320859">Spletno mesto, ki ste ga pravkar poskusili odpreti, je videti lažno. Napadalci včasih poskušajo kopirati spletna mesta, tako da skoraj neopazno spremenijo URL.</translation> <translation id="1532118530259321453">Ta stran sporoča:</translation> -<translation id="153384715582417236">To je vse za zdaj</translation> <translation id="1536390784834419204">Prevedi stran</translation> <translation id="1539840569003678498">Poslano poročilo:</translation> <translation id="1549470594296187301">Če želite uporabljati to funkcijo, mora biti omogočen JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Vaš brskalnik je upravljan</translation> <translation id="1746113442205726301">Zamike slike v Y</translation> <translation id="1746531169546376413">0-stopinjsko</translation> -<translation id="17513872634828108">Odprti zavihki</translation> <translation id="1752021286346845558">Nabiralnik 8</translation> <translation id="1753068535428855445">Zmenki in zasebni stiki</translation> <translation id="1753706481035618306">Številka strani</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Poskušajte zagnati orodje Omrežna diagnostika Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Preberite več o anonimnem načinu v Chromiumu<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Tu so prikazani odprti zavihki</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite tabulatorko, nato Enter, če želite upravljati podatke, zasebnost in varnost v računu Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, na voljo je več dejanj, pritisnite tabulatorko, če želite krožiti po njih</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Združi</translation> <translation id="2576880857912732701">Gumb za upravljanje varnostnih nastavitev, pritisnite Enter, če želite upravljati Varno brskanje in drugo v Chromovih nastavitvah.</translation> <translation id="2586657967955657006">Odložišče</translation> -<translation id="2587730715158995865">Izdajatelj: <ph name="ARTICLE_PUBLISHER" />. Preberite to in še toliko drugih člankov: <ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">ID API-ja imenika:</translation> <translation id="2594318783181750337">Hiter spletni ogled:</translation> <translation id="2595719060046994702">Te naprave in računa ne upravlja podjetje ali druga organizacija.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Nepravilno geslo</translation> <translation id="5051305769747448211">Komedije v živo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Če želite to datoteko poslati z deljenjem v bližini, sprostite prostor v napravi (<ph name="DISK_SPACE_SIZE" />).}one{Če želite te datoteke poslati z deljenjem v bližini, sprostite prostor v napravi (<ph name="DISK_SPACE_SIZE" />).}two{Če želite te datoteke poslati z deljenjem v bližini, sprostite prostor v napravi (<ph name="DISK_SPACE_SIZE" />).}few{Če želite te datoteke poslati z deljenjem v bližini, sprostite prostor v napravi (<ph name="DISK_SPACE_SIZE" />).}other{Če želite te datoteke poslati z deljenjem v bližini, sprostite prostor v napravi (<ph name="DISK_SPACE_SIZE" />).}}</translation> -<translation id="5056549851600133418">Članki za vas</translation> <translation id="5060483733937416656">Na spletnih mestih, ki uporabljajo <ph name="PROVIDER_ORIGIN" />, ste izbrali preverjanje s funkcijo Windows Hello. Ta ponudnik je morda shranil podatke o vašem plačilnem sredstvu, za katere lahko <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Ali ste mislili <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Zgodovina tiskanja</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Opusti</translation> <translation id="5239623327352565343">Lokacija je dovoljena</translation> <translation id="5242889659037569123">Potovalni kovčki in dodatna oprema</translation> +<translation id="5244732203286792411">Nalaganje … + To lahko traja kakšno minuto.</translation> <translation id="5250209940322997802">»Vzpostavite povezavo z omrežjem«</translation> <translation id="52517543715119994">Več o funkcijah Chroma</translation> <translation id="5251803541071282808">Oblak</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Nabiralnik 7</translation> <translation id="5541546772353173584">Dodajanje e-poštnega naslova</translation> <translation id="5543722831081909240">180-stopinjsko</translation> -<translation id="5545756402275714221">Članki za vas</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome občasno preveri vaša gesla, tako da jih primerja s seznami gesel, objavljenimi v spletu. Pri tem so vaša gesla in uporabniška imena šifrirana, da jih ne more prebrati nihče, vključno z Googlom.</translation> <translation id="5556459405103347317">Znova naloži</translation> @@ -2142,14 +2137,12 @@ <translation id="6266934640124581640">Svetlo zelenomodra</translation> <translation id="6272088941196661550">Nadaljujte pot, če si želite ogledati pomembno dejavnost v zgodovini uporabe Chroma.</translation> <translation id="6272383483618007430">Google Posodobitve</translation> -<translation id="6276112860590028508">Strani z bralnega seznama so prikazane tukaj</translation> <translation id="627746635834430766">Če želite naslednjič hitreje plačati, shranite kartico in naslov za izstavitev računa v Google Računu.</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| za prikaz kazalca</translation> <translation id="6280223929691119688">Dostava na ta naslov ni mogoča. Izberite drugega.</translation> <translation id="6284292079994426700">26 x 38 palcev</translation> <translation id="6285507000506177184">Gumb za upravljanje prenosov v Chromu, pritisnite Enter, če želite upravljati datoteke, ki ste jih prenesli v Chromu.</translation> <translation id="6289939620939689042">Barva strani</translation> -<translation id="6290238015253830360">Tu so prikazani predlagani članki</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Shranjevanje ...</translation> @@ -2749,7 +2742,6 @@ <translation id="7696089921647603491">Klasični rock in stare pesmi</translation> <translation id="769721561045429135">Trenutno je mogoče nekatere vaše kartice uporabljati samo v tej napravi. Kliknite »Naprej«, če si želite ogledati kartice.</translation> <translation id="7698864304447945242">Želite posodobiti aplikacijo Storitve Google Play za RR?</translation> -<translation id="7699293099605015246">Članki trenutno niso na voljo</translation> <translation id="7701040980221191251">Nič</translation> <translation id="7701544340847569275">Posodobitev je končana z napakami</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nadaljuj na spletno mesto <ph name="SITE" /> (ni varno)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sq.xtb b/components/strings/components_strings_sq.xtb index 195ccfa..5758267 100644 --- a/components/strings/components_strings_sq.xtb +++ b/components/strings/components_strings_sq.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ke futur fjalëkalimin tënd në një sajt që nuk menaxhohet nga organizata jote. Për të mbrojtur llogarinë tënde, mos e ripërdor fjalëkalimin në aplikacione dhe sajte të tjera.</translation> <translation id="1257553931232494454">nivelet e zmadhimit</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />. Shtyp "Tab" dhe më pas "Enter" për të menaxhuar cilësimet e Chrome</translation> -<translation id="1263231323834454256">Lista e leximit</translation> <translation id="1264309058268477500">Alternative</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Shkyçja e pajisjes</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tabakaja 8</translation> <translation id="1530707389502320859">Sajti ku sapo u përpoqe të hyje duket i rremë. Sulmuesit ndonjëherë i imitojnë sajtet duke bërë tek URL-ja ndryshime të vogla që janë të vështira për t'u shikuar.</translation> <translation id="1532118530259321453">Kjo faqe thotë</translation> -<translation id="153384715582417236">Kaq ishte për momentin</translation> <translation id="1536390784834419204">Përkthe faqen</translation> <translation id="1539840569003678498">Raporti u dërgua:</translation> <translation id="1549470594296187301">Duhet të aktivizohet JavaScript për të përdorur këtë funksion.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Shfletuesi yt është i menaxhuar</translation> <translation id="1746113442205726301">Zhvendosja e imazhit në boshtin Y</translation> <translation id="1746531169546376413">0 gradë</translation> -<translation id="17513872634828108">Hap skedat</translation> <translation id="1752021286346845558">Kutia postare 8</translation> <translation id="1753068535428855445">Takime dashurie dhe personale</translation> <translation id="1753706481035618306">Numri i faqes</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Provo të ekzekutosh diagnostikimin e rrjetit të Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Mëso më shumë për modalitetin "I fshehtë" në Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Skedat e tua të hapura shfaqen këtu</translation> <translation id="1791429645902722292">Smart Lock-u i Google</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, shtyp butonin Tab pastaj Enter për të menaxhuar informacionin, privatësinë dhe sigurinë tënde në "Llogarinë tënde të Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ofrohen shumë veprime, shtyp "Tab" për të kaluar në cikël mes tyre</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grup</translation> <translation id="2576880857912732701">Butoni "Menaxho cilësimet e sigurisë". Shtyp "Enter" për të menaxhuar "Shfletimin e sigurt" dhe më shumë te cilësimet e Chrome</translation> <translation id="2586657967955657006">Kujtesa e fragmenteve</translation> -<translation id="2587730715158995865">Nga <ph name="ARTICLE_PUBLISHER" />. Lexo këtë dhe <ph name="OTHER_ARTICLE_COUNT" /> artikuj të tjerë.</translation> <translation id="2587841377698384444">ID-ja e ndërfaqes API të direktorisë:</translation> <translation id="2594318783181750337">Pamja e shpejtë e uebit:</translation> <translation id="2595719060046994702">Kjo pajisje dhe llogari nuk menaxhohen nga një kompani ose organizatë tjetër.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Fjalëkalim i gabuar</translation> <translation id="5051305769747448211">Komedia e drejtpërdrejtë</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Për ta dërguar këtë skedar duke përdorur "Ndarjen në afërsi", liro hapësirë (<ph name="DISK_SPACE_SIZE" />) në pajisjen tënde}other{Për ta dërguar këta skedarë duke përdorur "Ndarjen në afërsi", liro hapësirë (<ph name="DISK_SPACE_SIZE" />) në pajisjen tënde}}</translation> -<translation id="5056549851600133418">Artikujt për ty</translation> <translation id="5060483733937416656">Ti zgjodhe që të verifikohesh me Windows Hello në sajtet e uebit që përdorin <ph name="PROVIDER_ORIGIN" />. Ky ofrues mund të ketë ruajtur informacione për mënyrën tënde të pagesës, të cilat mund <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Mos dëshiron të thuash <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historiku i printimeve</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Kutia postare 7</translation> <translation id="5541546772353173584">Shto email</translation> <translation id="5543722831081909240">180 gradë</translation> -<translation id="5545756402275714221">Artikuj për ty</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome i kontrollon periodikisht fjalëkalimet e tua për t'i krahasuar me listat që janë publikuar në linjë. Kur vepron kështu, fjalëkalimet dhe emrat e tu të përdoruesit janë të enkriptuara, në mënyrë që të mos lexohen nga askush, duke përfshirë Google.</translation> <translation id="5556459405103347317">Ringarko</translation> @@ -2140,14 +2133,12 @@ <translation id="6266934640124581640">Gurkali e çelur</translation> <translation id="6272088941196661550">Vazhdo udhëtimin për të parë aktivitetin përkatës në historikun tënd të Chrome</translation> <translation id="6272383483618007430">Përditësimi i Google</translation> -<translation id="6276112860590028508">Faqet nga lista jote e leximit shfaqen këtu</translation> <translation id="627746635834430766">Për të paguar më shpejt herën tjetër, ruaje kartën dhe adresën tënde të faturimit në llogarinë tënde të Google.</translation> <translation id="6279183038361895380">Shtyp |<ph name="ACCELERATOR" />| për të shfaqur kursorin</translation> <translation id="6280223929691119688">Nuk mund të dorëzohet në këtë adresë. Zgjidh një adresë tjetër.</translation> <translation id="6284292079994426700">26 x 38 inç</translation> <translation id="6285507000506177184">Butoni "Menaxho shkarkimet në Chrome". Shtyp "Enter" për të menaxhuar skedarët që ke shkarkuar në Chrome</translation> <translation id="6289939620939689042">Ngjyra e faqes</translation> -<translation id="6290238015253830360">Artikujt e tu të sugjeruar shfaqen këtu</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Po ruan...</translation> @@ -2747,7 +2738,6 @@ <translation id="7696089921647603491">Rok klasik dhe muzikë e vjetër</translation> <translation id="769721561045429135">Në këtë moment, ke karta që mund të përdoren vetëm në këtë pajisje. Kliko te "Vazhdo" për të rishikuar kartat.</translation> <translation id="7698864304447945242">Të përditësohen "Shërbimet e Google Play për AR"?</translation> -<translation id="7699293099605015246">Artikujt nuk janë të disponueshëm në këtë moment</translation> <translation id="7701040980221191251">Asnjë</translation> <translation id="7701544340847569275">Përditësimi përfundoi me gabime</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Vazhdo te <ph name="SITE" /> (e pasigurt)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 93dd0a6..3111e1d8 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Uneli ste lozinku na sajtu kojim ne upravlja vaša organizacija. Da biste zaštitili nalog, ne koristite lozinku ponovo u drugim aplikacijama ni na drugim sajtovima.</translation> <translation id="1257553931232494454">nivoi zumiranja</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, pa Enter da biste upravljali podešavanjima Chrome-a</translation> -<translation id="1263231323834454256">Lista za čitanje</translation> <translation id="1264309058268477500">Alternativno</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Otključavanje uređaja</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8. fioka</translation> <translation id="1530707389502320859">Sajt koji ste upravo probali da posetite deluje lažno. Napadači ponekad imitiraju sajtove tako što neznatno i skoro neprimetno izmene URL.</translation> <translation id="1532118530259321453">Ova stranica navodi:</translation> -<translation id="153384715582417236">To je sve za sada</translation> <translation id="1536390784834419204">Prevedi stranicu</translation> <translation id="1539840569003678498">Prijava je poslata:</translation> <translation id="1549470594296187301">JavaScript mora da bude omogućen da biste koristili ovu funkciju.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Pregledačem se upravlja</translation> <translation id="1746113442205726301">Pomeranje slike po Y osi</translation> <translation id="1746531169546376413">0 stepeni</translation> -<translation id="17513872634828108">Otvorene kartice</translation> <translation id="1752021286346845558">8. poštansko sanduče</translation> <translation id="1753068535428855445">Poznanstva</translation> <translation id="1753706481035618306">Broj stranice</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Pokušajte da pokrenete Windows dijagnostiku mreže<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Saznajte više o režimu Bez arhiviranja u Chromium-u<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Otvorene kartice se pojavljuju ovde</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, pritisnite Tab, pa Enter da biste upravljali informacijama, privatnošću i bezbednošću na Google nalogu</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, dostupno je više radnji, pritisnite Tab da biste ih pregledali</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Podaci o virtuelnoj kartici</translation> <translation id="1803020234906945288">Zdrava ishrana</translation> <translation id="1803351196216024260">Može da traži da koristi mikrofon</translation> +<translation id="1806174020048213474">Ova aplikacija zahteva dozvolu da instalira akreditive za WiFi. Posle podešavanja <ph name="DEVICE_TYPE" /> se automatski povezuje sa WiFi mrežama koje učestvuju. Da biste uklonili ove akreditive, deinstalirajte aplikaciju.</translation> <translation id="1807246157184219062">Svetla</translation> <translation id="1807528111851433570">Prvi list</translation> <translation id="180991881384371158">CVC je na poleđini kartice. To su poslednje 3 cifre u gornjem desnom uglu okvira za potpis.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Grupa</translation> <translation id="2576880857912732701">Dugme Upravljajte bezbednosnim podešavanjima, pritisnite Enter da biste upravljali Bezbednim pregledanjem i drugim sadržajem u podešavanjima Chrome-a</translation> <translation id="2586657967955657006">Memorija</translation> -<translation id="2587730715158995865">Od izdavača <ph name="ARTICLE_PUBLISHER" />. Pročitajte ovaj članak vesti i još <ph name="OTHER_ARTICLE_COUNT" /> članaka.</translation> <translation id="2587841377698384444">ID API-ja za direktorijume:</translation> <translation id="2594318783181750337">Brzi veb-prikaz:</translation> <translation id="2595719060046994702">Ovim uređajem i nalogom ne upravlja kompanija niti druga organizacija.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">6. pregrada za slaganje</translation> <translation id="4274173425554582601">Računari i elektronika</translation> <translation id="4275830172053184480">Ponovno pokretanje uređaja</translation> +<translation id="4276974990916607331">Ne, hvala</translation> <translation id="4277028893293644418">Resetujte lozinku</translation> <translation id="4277937682389409325">Lokalna adresa</translation> <translation id="4278390842282768270">Dozvoljeno</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Neispravna lozinka</translation> <translation id="5051305769747448211">Komedija uživo</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Da biste poslali ovaj fajl pomoću Deljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}one{Da biste poslali ove fajlove pomoću Deljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}few{Da biste poslali ove fajlove pomoću Deljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}other{Da biste poslali ove fajlove pomoću Deljenja u blizini, oslobodite prostor (<ph name="DISK_SPACE_SIZE" />) na uređaju}}</translation> -<translation id="5056549851600133418">Članci za vas</translation> <translation id="5060483733937416656">Odabrali ste da se verifikujete pomoću Windows Hello-a na veb-sajtovima koji koriste <ph name="PROVIDER_ORIGIN" />. Ovaj dobavljač je možda sačuvao informacije o načinu plaćanja, za koji možete da <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Da li ste mislili <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Istorija štampanja</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Dijalog za potvrdu</translation> <translation id="5135404736266831032">Upravljajte adresama...</translation> <translation id="5136841603454277753">Unesite ispravan kôd</translation> +<translation id="5137761395480718572">Ova aplikacija zahteva dozvolu da instalira akreditive za WiFi. Posle podešavanja <ph name="DEVICE_TYPE" /> se automatski povezuje sa WiFi mrežama koje učestvuju. Da biste uklonili ove akreditive, deinstalirajte aplikaciju. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Virtuelna kartica trenutno nije dostupna. Obratite se banci.</translation> <translation id="5138227688689900538">Prikaži manje</translation> <translation id="5145883236150621069">Kôd greške je prisutan u odgovoru na smernice</translation> @@ -1742,6 +1739,8 @@ <translation id="5234764350956374838">Odbaci</translation> <translation id="5239623327352565343">Lokacija je dozvoljena</translation> <translation id="5242889659037569123">Prtljag i pribor za putovanja</translation> +<translation id="5244732203286792411">Učitava se… + Ovo će možda malo potrajati.</translation> <translation id="5250209940322997802">„Povežite se na mrežu“</translation> <translation id="52517543715119994">Saznajte više o Chrome funkcijama</translation> <translation id="5251803541071282808">Klaud</translation> @@ -1756,6 +1755,7 @@ <translation id="5273881944177595304">Veb-aplikacije i onlajn alatke</translation> <translation id="5274025349362408263">Knjige i književnost</translation> <translation id="5279286380302340275">Upravljajte preuzimanjima</translation> +<translation id="5279453600310613955">Ne, hvala</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Svojstva dokumenta</translation> <translation id="528468243742722775">Završi</translation> @@ -1859,7 +1859,6 @@ <translation id="5541086400771735334">7. poštansko sanduče</translation> <translation id="5541546772353173584">Dodajte imejl</translation> <translation id="5543722831081909240">180 stepeni</translation> -<translation id="5545756402275714221">Članci za vas</translation> <translation id="5551890439174915351">100×200 mm</translation> <translation id="5552137475244467770">Chrome povremeno upoređuje vaše lozinke sa listama koje su objavljene onlajn. Dok to radi, vaše lozinke i korisnička imena su šifrovani, pa niko ne može da ih pročita, uključujući Google.</translation> <translation id="5556459405103347317">Učitaj ponovo</translation> @@ -2140,14 +2139,12 @@ <translation id="6266934640124581640">Svetlotirkizna</translation> <translation id="6272088941196661550">Nastavite put da biste videli relevantne aktivnosti u istoriji Chrome-a</translation> <translation id="6272383483618007430">Google ažuriranje</translation> -<translation id="6276112860590028508">Stranice sa liste za čitanje će se pojaviti ovde</translation> <translation id="627746635834430766">Da biste sledeći put platili brže, sačuvajte karticu i adresu za obračun na Google nalogu.</translation> <translation id="6279183038361895380">Pritisnite |<ph name="ACCELERATOR" />| da biste prikazali pokazivač</translation> <translation id="6280223929691119688">Isporuka na ovu adresu nije moguća. Izaberite drugu adresu.</translation> <translation id="6284292079994426700">26×38 in</translation> <translation id="6285507000506177184">Dugme za upravljanje preuzimanjima u Chrome-u, pritisnite Enter da biste upravljali fajlovima koje ste preuzeli u Chrome-u</translation> <translation id="6289939620939689042">Boja stranice</translation> -<translation id="6290238015253830360">Predloženi članci se prikazuju ovde</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Čuva se…</translation> @@ -2250,6 +2247,7 @@ <translation id="6529173248185917884">Sedmi kotur</translation> <translation id="6529602333819889595">&Ponovi brisanje</translation> <translation id="6535751101619004418">Valute i menjački poslovi</translation> +<translation id="6536221421038631327">Uklanjanjem Passpoint pretplate sa uređaja <ph name="DEVICE_TYPE" /> uklanjaju se povezane mreže. Obratite se aplikaciji <ph name="FRIENDLY_NAME" /> da biste uneli izmene u pretplatnički paket. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Uzajamni fondovi</translation> <translation id="6545864417968258051">Bluetooth skeniranje</translation> <translation id="6547208576736763147">Dvostruko bušenje na levoj strani</translation> @@ -2747,7 +2745,6 @@ <translation id="7696089921647603491">Klasični rok i evergrin</translation> <translation id="769721561045429135">Trenutno imate kartice koje mogu da se koriste samo na ovom uređaju. Kliknite na Nastavi da biste pregledali kartice.</translation> <translation id="7698864304447945242">Želite da ažurirate Google Play usluge za PR?</translation> -<translation id="7699293099605015246">Članci trenutno nisu dostupni</translation> <translation id="7701040980221191251">Ništa</translation> <translation id="7701544340847569275">Ažuriranje je završeno uz greške</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nastavi na <ph name="SITE" /> (nije bezbedno)<ph name="END_LINK" /></translation> @@ -3347,6 +3344,7 @@ <translation id="9219103736887031265">Slike</translation> <translation id="922152298093051471">Prilagodite Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Želite da dozvolite aplikaciji <ph name="APP_NAME" /> da podešava WiFi mreže?</translation> <translation id="936602727769022409">Mogli biste da izgubite pristup Google nalogu. Chromium preporučuje da odmah promenite lozinku. Moraćete da se prijavite.</translation> <translation id="937457230470581909">Zoološki vrtovi, akvarijumi i rezervati</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Koji podaci se koriste:<ph name="END_BOLD" /> Teme oglasa su zasnovane na nedavnoj istoriji pregledanja, listi sajtova koje ste posetili pomoću Chrome-a na ovom uređaju.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 5b3b137..27b6638 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Унели сте лозинку на сајту којим не управља ваша организација. Да бисте заштитили налог, не користите лозинку поново у другим апликацијама ни на другим сајтовима.</translation> <translation id="1257553931232494454">нивои зумирања</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, притисните Tab, па Enter да бисте управљали подешавањима Chrome-а</translation> -<translation id="1263231323834454256">Листа за читање</translation> <translation id="1264309058268477500">Алтернативно</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Откључавање уређаја</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">8. фиока</translation> <translation id="1530707389502320859">Сајт који сте управо пробали да посетите делује лажно. Нападачи понекад имитирају сајтове тако што незнатно и скоро неприметно измене URL.</translation> <translation id="1532118530259321453">Ова страница наводи:</translation> -<translation id="153384715582417236">То је све за сада</translation> <translation id="1536390784834419204">Преведи страницу</translation> <translation id="1539840569003678498">Пријава је послата:</translation> <translation id="1549470594296187301">JavaScript мора да буде омогућен да бисте користили ову функцију.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Прегледачем се управља</translation> <translation id="1746113442205726301">Померање слике по Y оси</translation> <translation id="1746531169546376413">0 степени</translation> -<translation id="17513872634828108">Отворене картице</translation> <translation id="1752021286346845558">8. поштанско сандуче</translation> <translation id="1753068535428855445">Познанства</translation> <translation id="1753706481035618306">Број странице</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Покушајте да покренете Windows дијагностику мреже<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Сазнајте више о режиму Без архивирања у Chromium-у<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Отворене картице се појављују овде</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, притисните Tab, па Enter да бисте управљали информацијама, приватношћу и безбедношћу на Google налогу</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, доступно је више радњи, притисните Tab да бисте их прегледали</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Подаци о виртуелној картици</translation> <translation id="1803020234906945288">Здрава исхрана</translation> <translation id="1803351196216024260">Може да тражи да користи микрофон</translation> +<translation id="1806174020048213474">Ова апликација захтева дозволу да инсталира акредитиве за WiFi. После подешавања <ph name="DEVICE_TYPE" /> се аутоматски повезује са WiFi мрежама које учествују. Да бисте уклонили ове акредитиве, деинсталирајте апликацију.</translation> <translation id="1807246157184219062">Светлa</translation> <translation id="1807528111851433570">Први лист</translation> <translation id="180991881384371158">CVC је на полеђини картице. То су последње 3 цифре у горњем десном углу оквира за потпис.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Група</translation> <translation id="2576880857912732701">Дугме Управљајте безбедносним подешавањима, притисните Enter да бисте управљали Безбедним прегледањем и другим садржајем у подешавањима Chrome-а</translation> <translation id="2586657967955657006">Меморија</translation> -<translation id="2587730715158995865">Од издавача <ph name="ARTICLE_PUBLISHER" />. Прочитајте овај чланак вести и још <ph name="OTHER_ARTICLE_COUNT" /> чланака.</translation> <translation id="2587841377698384444">ИД API-ја за директоријуме:</translation> <translation id="2594318783181750337">Брзи веб-приказ:</translation> <translation id="2595719060046994702">Овим уређајем и налогом не управља компанија нити друга организација.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">6. преграда за слагање</translation> <translation id="4274173425554582601">Рачунари и електроника</translation> <translation id="4275830172053184480">Поновно покретање уређаја</translation> +<translation id="4276974990916607331">Не, хвала</translation> <translation id="4277028893293644418">Ресетујте лозинку</translation> <translation id="4277937682389409325">Локална адреса</translation> <translation id="4278390842282768270">Дозвољено</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Неисправна лозинка</translation> <translation id="5051305769747448211">Комедија уживо</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Да бисте послали овај фајл помоћу Дељења у близини, ослободите простор (<ph name="DISK_SPACE_SIZE" />) на уређају}one{Да бисте послали ове фајлове помоћу Дељења у близини, ослободите простор (<ph name="DISK_SPACE_SIZE" />) на уређају}few{Да бисте послали ове фајлове помоћу Дељења у близини, ослободите простор (<ph name="DISK_SPACE_SIZE" />) на уређају}other{Да бисте послали ове фајлове помоћу Дељења у близини, ослободите простор (<ph name="DISK_SPACE_SIZE" />) на уређају}}</translation> -<translation id="5056549851600133418">Чланци за вас</translation> <translation id="5060483733937416656">Одабрали сте да се верификујете помоћу Windows Hello-а на веб-сајтовима који користе <ph name="PROVIDER_ORIGIN" />. Овај добављач је можда сачувао информације о начину плаћања, за који можете да <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Да ли сте мислили <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Историја штампања</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Дијалог за потврду</translation> <translation id="5135404736266831032">Управљајте адресама...</translation> <translation id="5136841603454277753">Унесите исправан кôд</translation> +<translation id="5137761395480718572">Ова апликација захтева дозволу да инсталира акредитиве за WiFi. После подешавања <ph name="DEVICE_TYPE" /> се аутоматски повезује са WiFi мрежама које учествују. Да бисте уклонили ове акредитиве, деинсталирајте апликацију. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Виртуелна картица тренутно није доступна. Обратите се банци.</translation> <translation id="5138227688689900538">Прикажи мање</translation> <translation id="5145883236150621069">Кôд грешке је присутан у одговору на смернице</translation> @@ -1742,6 +1739,8 @@ <translation id="5234764350956374838">Одбаци</translation> <translation id="5239623327352565343">Локација је дозвољена</translation> <translation id="5242889659037569123">Пртљаг и прибор за путовања</translation> +<translation id="5244732203286792411">Учитава се… + Ово ће можда мало потрајати.</translation> <translation id="5250209940322997802">„Повежите се на мрежу“</translation> <translation id="52517543715119994">Сазнајте више о Chrome функцијама</translation> <translation id="5251803541071282808">Клауд</translation> @@ -1756,6 +1755,7 @@ <translation id="5273881944177595304">Веб-апликације и онлајн алатке</translation> <translation id="5274025349362408263">Књиге и књижевност</translation> <translation id="5279286380302340275">Управљајте преузимањима</translation> +<translation id="5279453600310613955">Не, хвала</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Својства документа</translation> <translation id="528468243742722775">Заврши</translation> @@ -1859,7 +1859,6 @@ <translation id="5541086400771735334">7. поштанско сандуче</translation> <translation id="5541546772353173584">Додајте имејл</translation> <translation id="5543722831081909240">180 степени</translation> -<translation id="5545756402275714221">Чланци за вас</translation> <translation id="5551890439174915351">100×200 mm</translation> <translation id="5552137475244467770">Chrome повремено упоређује ваше лозинке са листама које су објављене онлајн. Док то ради, ваше лозинке и корисничка имена су шифровани, па нико не може да их прочита, укључујући Google.</translation> <translation id="5556459405103347317">Учитај поново</translation> @@ -2140,14 +2139,12 @@ <translation id="6266934640124581640">Светлотиркизна</translation> <translation id="6272088941196661550">Наставите пут да бисте видели релевантне активности у историји Chrome-а</translation> <translation id="6272383483618007430">Google ажурирање</translation> -<translation id="6276112860590028508">Странице са листе за читање ће се појавити овде</translation> <translation id="627746635834430766">Да бисте следећи пут платили брже, сачувајте картицу и адресу за обрачун на Google налогу.</translation> <translation id="6279183038361895380">Притисните |<ph name="ACCELERATOR" />| да бисте приказали показивач</translation> <translation id="6280223929691119688">Испорука на ову адресу није могућа. Изаберите другу адресу.</translation> <translation id="6284292079994426700">26×38 in</translation> <translation id="6285507000506177184">Дугме за управљање преузимањима у Chrome-у, притисните Enter да бисте управљали фајловима које сте преузели у Chrome-у</translation> <translation id="6289939620939689042">Боја странице</translation> -<translation id="6290238015253830360">Предложени чланци се приказују овде</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Чува се…</translation> @@ -2250,6 +2247,7 @@ <translation id="6529173248185917884">Седми котур</translation> <translation id="6529602333819889595">&Понови брисање</translation> <translation id="6535751101619004418">Валуте и мењачки послови</translation> +<translation id="6536221421038631327">Уклањањем Passpoint претплате са уређаја <ph name="DEVICE_TYPE" /> уклањају се повезане мреже. Обратите се апликацији <ph name="FRIENDLY_NAME" /> да бисте унели измене у претплатнички пакет. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Узајамни фондови</translation> <translation id="6545864417968258051">Bluetooth скенирање</translation> <translation id="6547208576736763147">Двоструко бушење на левој страни</translation> @@ -2747,7 +2745,6 @@ <translation id="7696089921647603491">Класични рок и евергрин</translation> <translation id="769721561045429135">Тренутно имате картице које могу да се користе само на овом уређају. Кликните на Настави да бисте прегледали картице.</translation> <translation id="7698864304447945242">Желите да ажурирате Google Play услуге за ПР?</translation> -<translation id="7699293099605015246">Чланци тренутно нису доступни</translation> <translation id="7701040980221191251">Ништа</translation> <translation id="7701544340847569275">Ажурирање је завршено уз грешке</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Настави на <ph name="SITE" /> (није безбедно)<ph name="END_LINK" /></translation> @@ -3347,6 +3344,7 @@ <translation id="9219103736887031265">Слике</translation> <translation id="922152298093051471">Прилагодите Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Желите да дозволите апликацији <ph name="APP_NAME" /> да подешава WiFi мреже?</translation> <translation id="936602727769022409">Могли бисте да изгубите приступ Google налогу. Chromium препоручује да одмах промените лозинку. Мораћете да се пријавите.</translation> <translation id="937457230470581909">Зоолошки вртови, акваријуми и резервати</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Који подаци се користе:<ph name="END_BOLD" /> Теме огласа су засноване на недавној историји прегледања, листи сајтова које сте посетили помоћу Chrome-а на овом уређају.</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index d982417..b3f06453 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Du har angett ditt lösenord på en webbplats som inte hanteras av organisationen. Skydda kontot genom att inte återanvända lösenordet för andra appar och webbplatser.</translation> <translation id="1257553931232494454">zoomnivåer</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />: tryck på Tabb och sedan på Retur om du vill hantera inställningarna för Chrome</translation> -<translation id="1263231323834454256">Läslista</translation> <translation id="1264309058268477500">Alternativ</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Enhetsupplåsning</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Fack 8</translation> <translation id="1530707389502320859">Webbplatsen du försöker öppna ser inte ut att vara äkta. Ibland försöker hackare efterlikna webbplatser genom att göra små, svårupptäckta ändringar i webbadressen.</translation> <translation id="1532118530259321453">På den här sidan står det</translation> -<translation id="153384715582417236">Det var allt för den här gången</translation> <translation id="1536390784834419204">Översätt sidan</translation> <translation id="1539840569003678498">Rapporten skickades:</translation> <translation id="1549470594296187301">JavaScript måste aktiveras för att du ska kunna använda den här funktionen.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Din webbläsare hanteras</translation> <translation id="1746113442205726301">Bild Y – byte</translation> <translation id="1746531169546376413">0 grader</translation> -<translation id="17513872634828108">Öppna flikar</translation> <translation id="1752021286346845558">Postfack 8</translation> <translation id="1753068535428855445">Dating och personligt</translation> <translation id="1753706481035618306">Sidnummer</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Testa att köra nätverksdiagnostik för Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Läs mer om inkognitoläge i Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Öppna flikar visas här</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />: tryck på Tabb och sedan på Retur om du vill hantera uppgifter, integritet och säkerhet i Google-kontot</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, flera åtgärder tillgängliga, byt mellan dem med Tabb</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grupp</translation> <translation id="2576880857912732701">Knappen Säkerhetsinställningar: tryck på Retur om du vill hantera Säker webbsökning med mera i inställningarna för Chrome</translation> <translation id="2586657967955657006">Urklipp</translation> -<translation id="2587730715158995865">Från <ph name="ARTICLE_PUBLISHER" />. Läs denna och <ph name="OTHER_ARTICLE_COUNT" /> andra artiklar.</translation> <translation id="2587841377698384444">Id för katalog-API:</translation> <translation id="2594318783181750337">Snabbvy på webben:</translation> <translation id="2595719060046994702">Enheten och kontot hanteras inte av ett företag eller annan organisation.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Felaktigt lösenord</translation> <translation id="5051305769747448211">Ståuppkomedi</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Om du vill skicka den här filen med Närdelning ska du frigöra utrymme (<ph name="DISK_SPACE_SIZE" />) på enheten}other{Om du vill skicka de här filerna med Närdelning ska du frigöra utrymme (<ph name="DISK_SPACE_SIZE" />) på enheten}}</translation> -<translation id="5056549851600133418">Artiklar för dig</translation> <translation id="5060483733937416656">Du har valt att verifiera dig med Windows Hello på webbplatser där <ph name="PROVIDER_ORIGIN" /> används. Den här leverantören kan ha lagrat uppgifter om din betalningsmetod som du kan <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Menade du <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Utskriftshistorik</translation> @@ -1796,6 +1790,7 @@ <translation id="5344579389779391559">Den här sidan kan försöka debitera dig</translation> <translation id="5347645913823149105">Knappen Anpassa teckensnitt i Chrome: tryck på Retur om du vill anpassa teckenstorlekar och teckensnitt i Chrome</translation> <translation id="5355557959165512791">Det går inte att besöka <ph name="SITE" /> just nu eftersom dess certifikat har återkallats. Nätverksfel och attacker är ofta tillfälliga, så sidan kommer förmodligen att fungera senare.</translation> +<translation id="5356345925629253198">Du kan använda sparade adresser i Googles produkter. Den här adressen sparas i ditt Google-konto (<ph name="ACCOUNT" />).</translation> <translation id="5357848622083956825">Bildkonst och design</translation> <translation id="536296301121032821">Det gick inte att spara policyinställningarna</translation> <translation id="5363309033720083897">Serieporten tillåts av administratören</translation> @@ -1861,7 +1856,6 @@ <translation id="5541086400771735334">Postfack 7</translation> <translation id="5541546772353173584">Lägg till e-postadress</translation> <translation id="5543722831081909240">180 grader</translation> -<translation id="5545756402275714221">Artiklar för dig</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome kontrollerar regelbundet om dina lösenord finns med på listor som har publicerats online. Under kontrollen krypteras dina lösenord och användarnamn så att varken Google eller någon annan kan läsa dem.</translation> <translation id="5556459405103347317">Hämta igen</translation> @@ -2143,14 +2137,12 @@ <translation id="6266934640124581640">Ljust blågrön</translation> <translation id="6272088941196661550">Återuppta sökningen för att se relevant aktivitet i Chrome-historiken</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Sidor från läslistan visas här</translation> <translation id="627746635834430766">Spara kortet och faktureringsadressen i Google-kontot så går det snabbare att betala nästa gång.</translation> <translation id="6279183038361895380">Tryck på |<ph name="ACCELERATOR" />| om du vill visa markören</translation> <translation id="6280223929691119688">Det går inte att leverera till den här adressen. Välj en annan adress.</translation> <translation id="6284292079994426700">26 x 38 tum</translation> <translation id="6285507000506177184">Knappen Hantera nedladdningar i Chrome: tryck på Retur om du vill hantera filer du har laddat ned i Chrome</translation> <translation id="6289939620939689042">Sidfärg</translation> -<translation id="6290238015253830360">Rekommenderade artiklar visas här</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Sparar ...</translation> @@ -2750,7 +2742,6 @@ <translation id="7696089921647603491">Klassisk rock och gamla godingar</translation> <translation id="769721561045429135">Du har för närvarande kort som bara kan användas på den här enheten. Klicka på Fortsätt om du vill granska korten.</translation> <translation id="7698864304447945242">Vill du uppdatera Google Play-tjänster för AR?</translation> -<translation id="7699293099605015246">Inga artiklar är tillgängliga just nu</translation> <translation id="7701040980221191251">Inga</translation> <translation id="7701544340847569275">Uppdateringen slutfördes med fel</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Fortsätt till <ph name="SITE" /> (osäkert)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb index 1ca4141..914cf79 100644 --- a/components/strings/components_strings_sw.xtb +++ b/components/strings/components_strings_sw.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Umeweka nenosiri kwenye tovuti ambayo haidhibitiwi na shirika lako. Ili ulinde akaunti yako, usitumie tena nenosiri lako kwenye tovuti na programu zingine.</translation> <translation id="1257553931232494454">viwango vya kukuza</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Bonyeza 'Tab' kisha 'Enter' ili udhibiti mipangilio yako ya Chrome</translation> -<translation id="1263231323834454256">Orodha ya kusoma</translation> <translation id="1264309058268477500">Mbadala</translation> <translation id="1264974993859112054">Michezo</translation> <translation id="1266469291454105242">Kufungua kifaa</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Trei ya nane</translation> <translation id="1530707389502320859">Tovuti ambayo umejaribu kutembelea inaonekana kuwa bandia. Wakati mwingine, wadukuzi wanaweza kuiga tovuti kwa kufanya mabadiliko madogo na yasiyoonekana kwa urahisi kwenye URL.</translation> <translation id="1532118530259321453">Ukurasa huu unasema</translation> -<translation id="153384715582417236">Hakuna maudhui mengine kwa sasa</translation> <translation id="1536390784834419204">Tafsiri ukurasa</translation> <translation id="1539840569003678498">Ripoti imetumwa:</translation> <translation id="1549470594296187301">Lazima JavaScript iwashwe ili utumie kipengele hiki.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Kivinjari chako kinadhibitiwa</translation> <translation id="1746113442205726301">Ugeuzaji wa Picha ya Y</translation> <translation id="1746531169546376413">Nyuzi 0</translation> -<translation id="17513872634828108">Vichupo vilivyo wazi</translation> <translation id="1752021286346845558">Kikasha cha barua cha nane</translation> <translation id="1753068535428855445">Kuchumbiana na mambo binafsi</translation> <translation id="1753706481035618306">Nambari ya ukurasa</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Jaribu kutumia zana ya Kuchunguza Mtandao wa Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Pata maelezo zaidi kuhusu Hali fiche kwenye Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Vichupo vyako vilivyo wazi huonekana hapa</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, bonyeza 'Tab' kisha 'Enter' ili udhibiti maelezo, faragha na usalama wako katika Akaunti yako ya Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, vitendo vingi vinapatikana, bonyeza 'Tab' ili uvipitie</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Kikundi</translation> <translation id="2576880857912732701">Kitufe cha 'Dhibiti mipangilio ya usalama', bonyeza 'Enter' ili udhibiti kipengele chako cha Kuvinjari Salama na zaidi katika mipangilio ya Chrome</translation> <translation id="2586657967955657006">Ubao wa kunakili</translation> -<translation id="2587730715158995865">Kutoka <ph name="ARTICLE_PUBLISHER" />. Soma makala haya na mengine <ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">Kitambulisho cha API ya Saraka:</translation> <translation id="2594318783181750337">Mwonekano wa wavuti wa haraka:</translation> <translation id="2595719060046994702">Kifaa na akaunti hii haisimamiwi na kampuni au shirika lingine.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Nenosiri lisilo sahihi</translation> <translation id="5051305769747448211">Vichekesho vya moja kwa moja</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ili utume faili hii kwa kutumia kipengele cha Uhamishaji wa Karibu, futa baadhi ya faili kwenye kifaa chako ili upate nafasi (<ph name="DISK_SPACE_SIZE" />)}other{Ili utume faili hizi kwa kutumia kipengele cha Uhamishaji wa Karibu, futa baadhi ya faili kwenye kifaa chako ili upate nafasi (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Makala kwa ajili yako</translation> <translation id="5060483733937416656">Ulichagua kuthibitisha kwa kutumia Windows Hello kwenye tovuti zinazotumia <ph name="PROVIDER_ORIGIN" />. Huenda mtoa huduma huyu amehifadhi maelezo ya njia yako ya kulipa ambayo unaweza <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Je, ulimaanisha <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Historia ya kuchapisha</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Ondoa</translation> <translation id="5239623327352565343">Ufikiaji wa data ya mahali umeruhusiwa</translation> <translation id="5242889659037569123">Bidhaa na vifaa vya safari na mizigo</translation> +<translation id="5244732203286792411">Inapakia... + Hatua hii inaweza kuchukua dakika moja.</translation> <translation id="5250209940322997802">"Unganisha kwenye mtandao"</translation> <translation id="52517543715119994">Pata maelezo kuhusu vipengele vya Chrome</translation> <translation id="5251803541071282808">Wingu</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Kikasha cha barua cha saba</translation> <translation id="5541546772353173584">Ongeza Anwani ya Barua Pepe</translation> <translation id="5543722831081909240">Nyuzi 180</translation> -<translation id="5545756402275714221">Makala Tunayokupendekezea</translation> <translation id="5551890439174915351">Milimita 100 x 200</translation> <translation id="5552137475244467770">Chrome hukagua mara kwa mara manenosiri yako ikilinganisha na orodha ambazo zimechapishwa mtandaoni. Wakati inafanya hivyo, manenosiri na majina yako ya mtumiaji huwa yamesimbwa kwa njia fiche, kwa hivyo hayawezi kusomwa na mtu mwingine, ikiwemo Google.</translation> <translation id="5556459405103347317">Pakia upya</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Samawati ya Kijani Isiyokolea</translation> <translation id="6272088941196661550">Endelea na ziara yako ili uone shughuli muhimu katika historia yako kwenye Chrome</translation> <translation id="6272383483618007430">Sasisho kwa Google</translation> -<translation id="6276112860590028508">Kurasa kutoka orodha yako ya usomaji huonekana hapa</translation> <translation id="627746635834430766">Ili ulipe kwa haraka wakati ujao, hifadhi anwani ya kutuma bili na maelezo ya kadi yako kwenye Akaunti yako ya Google.</translation> <translation id="6279183038361895380">Bonyeza |<ph name="ACCELERATOR" />| ili kiteuzi kionekane</translation> <translation id="6280223929691119688">Haiwezi kuwasilisha kwenye anwani hii. Chagua anwani tofauti.</translation> <translation id="6284292079994426700">Inchi 26 x 38</translation> <translation id="6285507000506177184">Kitufe cha 'Dhibiti vipakuliwa kwenye Chrome', bonyeza 'Enter' ili udhibiti faili ulizozipakua katika Chrome</translation> <translation id="6289939620939689042">Rangi ya Ukurasa</translation> -<translation id="6290238015253830360">Makala unayopendekezewa yataonekana hapa</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Inahifadhi...</translation> @@ -2746,7 +2739,6 @@ <translation id="7696089921647603491">Muziki wa classic rock na oldies</translation> <translation id="769721561045429135">Sasa hivi, kadi zako zinaweza kutumika kwenye kifaa hiki pekee. Bofya ili uendelee kukagua kadi.</translation> <translation id="7698864304447945242">Ungependa kusasisha Huduma za Google Play za AR?</translation> -<translation id="7699293099605015246">Makala hayapatikani kwa sasa</translation> <translation id="7701040980221191251">Hamna</translation> <translation id="7701544340847569275">Usasishaji umekamilika ukiwa na hitilafu</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Nenda kwenye <ph name="SITE" /> (isiyo salama)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb index b490de6..48fa7ce 100644 --- a/components/strings/components_strings_ta.xtb +++ b/components/strings/components_strings_ta.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">உங்கள் நிறுவனம் நிர்வகிக்காத தளத்தில் உங்கள் கடவுச்சொல்லை உள்ளிட்டீர்கள். உங்கள் கணக்கைப் பாதுகாக்க, பிற ஆப்ஸிலும் தளங்களிலும் கடவுச்சொல்லை மீண்டும் பயன்படுத்த வேண்டாம்.</translation> <translation id="1257553931232494454">அளவுமாற்ற நிலைகள்</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome அமைப்புகளை நிர்வகிக்க, Tab பட்டனை அழுத்திவிட்டு Enter பட்டனை அழுத்துங்கள்</translation> -<translation id="1263231323834454256">வாசிப்புப் பட்டியல்</translation> <translation id="1264309058268477500">மாற்று</translation> <translation id="1264974993859112054">விளையாட்டு</translation> <translation id="1266469291454105242">சாதனத்தில் அன்லாக் செய்தல்</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">தட்டு 8</translation> <translation id="1530707389502320859">நீங்கள் சற்றுமுன் பார்வையிட முயற்சித்த தளம் போலியானதைப் போல் தெரிகிறது. சில நேரங்களில் கண்டுப்பிடிக்கவே முடியாத அளவிற்கு URLல் சிறிய அளவு மாற்றங்களைச் செய்து போலியான தளங்களை தீங்கிழைப்பவர்கள் உருவாக்குவார்கள்.</translation> <translation id="1532118530259321453">இந்தப் பக்கம் தெரிவிப்பது:</translation> -<translation id="153384715582417236">அவ்வளவு தான்!</translation> <translation id="1536390784834419204">பக்கத்தை மொழிபெயர்</translation> <translation id="1539840569003678498">அறிக்கை அனுப்பப்பட்டது:</translation> <translation id="1549470594296187301">இந்த அம்சத்தைப் பயன்படுத்த JavaScript இயக்கப்பட வேண்டும்.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">உங்கள் உலாவி நிர்வகிக்கப்படுகிறது</translation> <translation id="1746113442205726301">இமேஜ் Y ஷிஃப்ட்</translation> <translation id="1746531169546376413">0 டிகிரி</translation> -<translation id="17513872634828108">தாவல்களைத் திற</translation> <translation id="1752021286346845558">அஞ்சல் பெட்டி 8</translation> <translation id="1753068535428855445">டேட்டிங் & பர்சனல்ஸ்</translation> <translation id="1753706481035618306">பக்க எண்</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows நெட்வொர்க் டயக்னாஸ்டிக்ஸ் கருவியை இயக்கவும்<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium மறைநிலைப் பயன்முறை குறித்து மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">உங்கள் தாவல்கள் இங்கே தோன்றும்</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, உங்கள் Google கணக்கில் உள்ள தகவல்கள், தனியுரிமை, பாதுகாப்பு ஆகியவற்றை நிர்வகிக்க Tab பட்டனை அழுத்திவிட்டு Enter பட்டனை அழுத்துங்கள்</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, ஒன்றுக்கும் மேற்பட்ட செயல்கள் உள்ளன, அவற்றில் ஒன்றைத் தேர்ந்தெடுக்க Tab விசையை அழுத்துங்கள்</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">குழு</translation> <translation id="2576880857912732701">பாதுகாப்பு அமைப்புகளை நிர்வகிப்பதற்கான பட்டன். Chrome அமைப்புகளில் பாதுகாப்பு உலாவலையும் மேலும் பலவற்றையும் நிர்வகிக்க, Enter பட்டனை அழுத்துங்கள்</translation> <translation id="2586657967955657006">கிளிப்போர்டு</translation> -<translation id="2587730715158995865">வெளியீட்டாளர்: <ph name="ARTICLE_PUBLISHER" />. இதையும் பிற வெளியீட்டாளர்கள் வழங்கும் <ph name="OTHER_ARTICLE_COUNT" /> கட்டுரைகளையும் படிக்கவும்.</translation> <translation id="2587841377698384444">கோப்பக API ஐடி:</translation> <translation id="2594318783181750337">விரைவான இணையக் காட்சி:</translation> <translation id="2595719060046994702">இந்தச் சாதனமும் கணக்கும் ஒரு நிறுவனத்தின் மூலமோ பிற அமைப்பின் மூலமோ நிர்வகிக்கப்படவில்லை.</translation> @@ -1660,7 +1655,6 @@ <translation id="5045550434625856497">தவறான கடவுச்சொல்</translation> <translation id="5051305769747448211">நேரலை நகைச்சுவை நிகழ்ச்சி</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{‘அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தின் மூலம் இந்த ஃபைலை அனுப்ப, உங்கள் சாதனத்தில் <ph name="DISK_SPACE_SIZE" /> சேமிப்பிடத்தைக் காலியாக்கவும்}other{‘அருகிலுள்ளவற்றுடன் பகிர்தல்’ அம்சத்தின் மூலம் இந்த ஃபைல்களை அனுப்ப, உங்கள் சாதனத்தில் <ph name="DISK_SPACE_SIZE" /> சேமிப்பிடத்தைக் காலியாக்கவும்}}</translation> -<translation id="5056549851600133418">உங்களுக்கான செய்திக் கட்டுரைகள்</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> ஐப் பயன்படுத்தும் தளங்களில் Windows Hello மூலம் சரிபார்க்கத் தேர்வுசெய்துள்ளீர்கள். உங்கள் பேமெண்ட் முறை குறித்த தகவல்களை இந்த வழங்குநர் சேமித்திருக்கக்கூடும். அவற்றை நீங்கள் <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739"><ph name="LOOKALIKE_DOMAIN" />ஐக் குறிப்பிடுகிறீர்களா?</translation> <translation id="5066056036849835175">இதுவரையான பிரிண்டிங் செயல்கள்</translation> @@ -1738,6 +1732,8 @@ <translation id="5234764350956374838">நிராகரி</translation> <translation id="5239623327352565343">இருப்பிட அனுமதி வழங்கப்பட்டது</translation> <translation id="5242889659037569123">லக்கேஜ் & பயணத்திற்குத் தேவையான பொருட்கள்</translation> +<translation id="5244732203286792411">தொடங்குகிறது... + இதற்கு ஒரு நிமிடம் ஆகலாம்.</translation> <translation id="5250209940322997802">"நெட்வொர்க்குடன் இணைக்கவும்"</translation> <translation id="52517543715119994">Chrome அம்சங்கள் குறித்து அறியலாம்</translation> <translation id="5251803541071282808">கிளவுடு</translation> @@ -1855,7 +1851,6 @@ <translation id="5541086400771735334">அஞ்சல் பெட்டி 7</translation> <translation id="5541546772353173584">மின்னஞ்சலைச் சேர்க்கவும்</translation> <translation id="5543722831081909240">180 டிகிரி</translation> -<translation id="5545756402275714221">உங்களுக்கான செய்திக் கட்டுரைகள்</translation> <translation id="5551890439174915351">100 x 200 மிமீ</translation> <translation id="5552137475244467770">ஆன்லைனில் வெளியிடப்பட்டுள்ளவற்றில் உங்களுடைய கடவுச்சொற்கள் இருக்கிறதா என்பதை Chrome அவ்வப்போது சரிபார்க்கும். இதைச் செய்யும்போது உங்கள் கடவுச்சொற்களும் பயனர்பெயர்களும் என்க்ரிப்ட் செய்யப்படுவதால் Google உட்பட எவராலும் அவற்றைக் கண்டறிய முடியாது.</translation> <translation id="5556459405103347317">மீண்டும் ஏற்று</translation> @@ -2136,14 +2131,12 @@ <translation id="6266934640124581640">வெளிர் பசும் நீலம்</translation> <translation id="6272088941196661550">Chrome செயல்பாடுகளில் இருக்கும் தொடர்புடைய செயல்பாடுகளைப் பார்க்க, உலாவலைத் தொடரலாம்</translation> <translation id="6272383483618007430">Google புதுப்பிப்பு</translation> -<translation id="6276112860590028508">வாசிப்புப் பட்டியலில் இருக்கும் பக்கங்கள் இங்கே தோன்றும்</translation> <translation id="627746635834430766">அடுத்த முறை விரைவாகப் பணம் அனுப்ப, உங்கள் கார்டையும் பில்லிங் முகவரியையும் Google கணக்கில் சேமிக்கவும்.</translation> <translation id="6279183038361895380">உங்கள் சுட்டியைக் காட்ட |<ph name="ACCELERATOR" />| என்பதை அழுத்தவும்</translation> <translation id="6280223929691119688">இந்த முகவரிக்கு டெலிவரி செய்ய முடியாது. வேறு முகவரியைத் தேர்ந்தெடுக்கவும்.</translation> <translation id="6284292079994426700">26 x 38 இன்ச்</translation> <translation id="6285507000506177184">Chromeமில் பதிவிறக்கியவற்றை நிர்வகிப்பதற்கான பட்டன். Chromeமில் நீங்கள் பதிவிறக்கிய ஃபைல்களை நிர்வகிக்க, Enter பட்டனை அழுத்துங்கள்</translation> <translation id="6289939620939689042">பக்க வண்ணம்</translation> -<translation id="6290238015253830360">நீங்கள் பரிந்துரைத்த கட்டுரைகள் இங்கே தோன்றும்</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">சேமிக்கிறது...</translation> @@ -2743,7 +2736,6 @@ <translation id="7696089921647603491">கிளாசிக் ராக் & பழைய பாடல்கள்</translation> <translation id="769721561045429135">தற்போது, இந்தச் சாதனத்தில் மட்டுமே பயன்படுத்தக்கூடிய கார்டுகள் உள்ளன கார்டுகளைப் பார்க்க, ‘தொடர்க’ என்பதைக் கிளிக் செய்யவும்.</translation> <translation id="7698864304447945242">Google Play Services for ARரைப் புதுப்பிக்க வேண்டுமா?</translation> -<translation id="7699293099605015246">தற்போது கட்டுரைகள் இல்லை</translation> <translation id="7701040980221191251">எதுவுமில்லை</translation> <translation id="7701544340847569275">புதுப்பிக்கும்போது பிழைகள் ஏற்பட்டன</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> (பாதுகாப்பற்ற தளம்) க்குச் செல்லவும்<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index c6f126ed..6ada27e9 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">మీ సంస్థ నిర్వహించని ఒక సైట్లో మీరు మీ పాస్వర్డ్ను నమోదు చేశారు. మీ ఖాతాను రక్షించడం కోసం, ఇతర యాప్లు మరియు సైట్లలో మీ పాస్వర్డ్ను తిరిగి ఉపయోగించవద్దు.</translation> <translation id="1257553931232494454">జూమ్ స్థాయిలు</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, మీ Chrome సెట్టింగ్లను మేనేజ్ చేయడానికి Tabను నొక్కి, ఆపై Enterను నొక్కండి</translation> -<translation id="1263231323834454256">పఠన లిస్ట్</translation> <translation id="1264309058268477500">ఆల్టర్నేట్</translation> <translation id="1264974993859112054">క్రీడలు</translation> <translation id="1266469291454105242">పరికర అన్లాక్</translation> @@ -253,7 +252,6 @@ <translation id="1529789484829130889">ట్రే 8</translation> <translation id="1530707389502320859">ఇప్పుడు మీరు సందర్శించాలని ప్రయత్నించిన సైట్ నకిలీదిగా అనిపిస్తుంది. URLకు చిన్న, అంత తేలికగా కనపడని మార్పులను చేయడం ద్వారా దాడి చేసేవారు కొన్నిసార్లు సైట్లను అనుకరిస్తారు.</translation> <translation id="1532118530259321453">ఈ పేజీ ఇలా చెబుతోంది</translation> -<translation id="153384715582417236">ఇప్పటికి ఇంతే</translation> <translation id="1536390784834419204">పేజీని అనువాదం చేయి</translation> <translation id="1539840569003678498">రిపోర్ట్ పంపబడింది:</translation> <translation id="1549470594296187301">ఈ ఫీచర్ను ఉపయోగించడానికి జావాస్క్రిప్ట్ తప్పనిసరిగా ప్రారంభించాలి.</translation> @@ -350,7 +348,6 @@ <translation id="1745880797583122200">మీ బ్రౌజర్ నిర్వహించబడుతోంది</translation> <translation id="1746113442205726301">చిత్రాన్ని Y అక్షంలో జరపు</translation> <translation id="1746531169546376413">0 డిగ్రీలు</translation> -<translation id="17513872634828108">తెరిచిన ట్యాబ్లు</translation> <translation id="1752021286346845558">మెయిల్బాక్స్ 8</translation> <translation id="1753068535428855445">డేటింగ్ & వ్యక్తిగత యాడ్లు</translation> <translation id="1753706481035618306">పేజీ సంఖ్య</translation> @@ -362,7 +359,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows నెట్వర్క్ సమస్య విశ్లేషణలను అమలు చేయడం ప్రయత్నించండి<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromiumలో అజ్ఞాత మోడ్ గురించి మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">మీ తెరవబడిన ట్యాబ్లు ఇక్కడ కనిపిస్తాయి</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, మీ Google ఖాతాలో మీ సమాచారం, గోప్యత, ఇంకా భద్రతను మేనేజ్ చేయడం కోసం Tabను నొక్కి, ఆపై Enterను నొక్కండి</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, పలు చర్యలు అందుబాటులో ఉన్నాయి, వాటిలో దేనిని అయినా ఎంచుకోవడానికి 'Tab'ను నొక్కండి</translation> @@ -672,7 +668,6 @@ <translation id="257674075312929031">గ్రూప్గా చేయి</translation> <translation id="2576880857912732701">'సెక్యూరిటీ సెట్టింగ్లను మేనేజ్ చేయండి' బటన్, Chrome సెట్టింగ్లలో మీ సురక్షిత బ్రౌజింగ్ను, అలాగే మరిన్నింటిని మేనేజ్ చేయడానికి 'Enter'ను నొక్కండి</translation> <translation id="2586657967955657006">క్లిప్బోర్డ్</translation> -<translation id="2587730715158995865">పబ్లిషర్ <ph name="ARTICLE_PUBLISHER" />. దీన్ని మరియు మరో <ph name="OTHER_ARTICLE_COUNT" /> ఇతర కథనాలను చదవండి.</translation> <translation id="2587841377698384444">డైరెక్టరీ API ID:</translation> <translation id="2594318783181750337">వేగవంతమైన వెబ్ వీక్షణ:</translation> <translation id="2595719060046994702">ఈ పరికరం మరియు ఖాతా రెండూ కూడా కంపెనీ లేదా ఇతర సంస్థ నిర్వహణలో లేవు.</translation> @@ -1666,7 +1661,6 @@ <translation id="5045550434625856497">సరికాని పాస్వర్డ్</translation> <translation id="5051305769747448211">లైవ్ కామెడీ</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{'సమీప షేరింగ్'ను ఉపయోగించి ఈ ఫైల్ను పంపడానికి, మీ పరికరంలో స్పేస్ (<ph name="DISK_SPACE_SIZE" />)ను ఖాళీ చేయండి}other{'సమీప షేరింగ్'ను ఉపయోగించి ఈ ఫైళ్ళను పంపడానికి, మీ పరికరంలో స్పేస్ (<ph name="DISK_SPACE_SIZE" />)ను ఖాళీ చేయండి}}</translation> -<translation id="5056549851600133418">మీ కోసం కథనాలు</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" />ను ఉపయోగించే వెబ్సైట్లలో Windows Helloతో వెరిఫై చేయాలని మీరు ఎంచుకున్నారు. ఈ ప్రొవైడర్ మీ పేమెంట్ ఆప్షన్కు సంబంధించిన సమాచారాన్ని స్టోర్ చేసుకొని ఉండవచ్చు, దీనిని మీరు <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">మీరు <ph name="LOOKALIKE_DOMAIN" /> గురించి అడిగారా?</translation> <translation id="5066056036849835175">ప్రింటింగ్ హిస్టరీ</translation> @@ -1863,7 +1857,6 @@ <translation id="5541086400771735334">మెయిల్బాక్స్ 7</translation> <translation id="5541546772353173584">ఈమెయిల్ను జోడించండి</translation> <translation id="5543722831081909240">180 డిగ్రీలు</translation> -<translation id="5545756402275714221">మీ కోసం కథనాలు</translation> <translation id="5551890439174915351">100 x 200 మి.మీ.</translation> <translation id="5552137475244467770">ఆన్లైన్లో పబ్లిష్ చేయబడిన లిస్ట్లలో మీ పాస్వర్డ్ ఒకవేళ ఉందా అని Chrome తరచుగా చెక్ చేస్తూ ఉంటుంది. Chrome ఈ ప్రాసెస్ను చేస్తున్నప్పుడు, మీ పాస్వర్డ్లు, యూజర్నేమ్లు ఎన్క్రిప్ట్ చేయబడతాయి. కాబట్టి, Googleతో సహా ఎవరూ వాటిని తెలుసుకోలేరు.</translation> <translation id="5556459405103347317">మళ్లీ లోడ్ చేయి</translation> @@ -2145,14 +2138,12 @@ <translation id="6266934640124581640">లేత నీలి ఆకుపచ్చ రంగు</translation> <translation id="6272088941196661550">మీ Chrome హిస్టరీలో మీ సందర్భోచితమైన యాక్టివిటీని చూడటానికి మీ సెర్చ్ను కొనసాగించండి</translation> <translation id="6272383483618007430">Google అప్డేట్</translation> -<translation id="6276112860590028508">మీ పఠన లిస్ట్లో ఉన్న పేజీలు ఇక్కడ కనిపిస్తాయి</translation> <translation id="627746635834430766">తర్వాతిసారి మరింత వేగంగా పేమెంట్ చేయడానికి, మీ కార్డ్, బిల్లింగ్ అడ్రస్ను మీ Google ఖాతాకు సేవ్ చేయండి.</translation> <translation id="6279183038361895380">మీ కర్సర్ను చూపడానికి |<ph name="ACCELERATOR" />| నొక్కండి</translation> <translation id="6280223929691119688">ఈ అడ్రస్కు డెలివరీ చేయడం సాధ్యం కాదు. వేరే అడ్రస్ను ఎంచుకోండి.</translation> <translation id="6284292079994426700">26 x 38 అంగుళాలు</translation> <translation id="6285507000506177184">'Chromeలో డౌన్లోడ్లను మేనేజ్ చేయండి' బటన్, Chromeలో మీరు డౌన్లోడ్ చేసిన ఫైల్స్ను మేనేజ్ చేయడానికి 'Enter'ను నొక్కండి</translation> <translation id="6289939620939689042">పేజీ రంగు</translation> -<translation id="6290238015253830360">మీకు సూచించిన కథనాలు ఇక్కడ కనిపిస్తాయి</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">సేవ్ చేస్తోంది...</translation> @@ -2752,7 +2743,6 @@ <translation id="7696089921647603491">క్లాసిక్ రాక్ & పాత పాటలు</translation> <translation id="769721561045429135">ఇప్పుడు, కేవలం ఈ పరికరంలో మాత్రమే ఉపయోగించగల కార్డ్లు మీ వద్ద ఉన్నాయి. కార్డ్లను సమీక్షించడం కోసం కొనసాగించుని క్లిక్ చేయండి.</translation> <translation id="7698864304447945242">Google Play Services for ARను అప్డేట్ చేయాలా?</translation> -<translation id="7699293099605015246">ప్రస్తుతం కథనాలు అందుబాటులో లేవు</translation> <translation id="7701040980221191251">ఏదీ లేదు</translation> <translation id="7701544340847569275">అప్డేట్ ఎర్రర్లతో ముగిసింది</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" />కి కొనసాగించండి (అసురక్షితం)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb index b1ae097..b7ab637 100644 --- a/components/strings/components_strings_th.xtb +++ b/components/strings/components_strings_th.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">คุณป้อนรหัสผ่านในเว็บไซต์ที่องค์กรไม่ได้จัดการ เพื่อปกป้องบัญชี โปรดอย่าใช้รหัสผ่านซ้ำในแอปและเว็บไซต์อื่นๆ</translation> <translation id="1257553931232494454">ระดับการซูม</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" /> กด Tab ตามด้วย Enter เพื่อจัดการการตั้งค่า Chrome</translation> -<translation id="1263231323834454256">เรื่องรออ่าน</translation> <translation id="1264309058268477500">อื่นๆ</translation> <translation id="1264974993859112054">กีฬา</translation> <translation id="1266469291454105242">การปลดล็อกอุปกรณ์</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">ถาด 8</translation> <translation id="1530707389502320859">เว็บไซต์ที่คุณเพิ่งพยายามเข้าถึงดูเป็นเว็บไซต์ปลอม บางครั้งผู้โจมตีจะเลียนแบบเว็บไซต์ต่างๆ โดยทำการเปลี่ยนแปลงเล็กๆ น้อยๆ ที่สังเกตเห็นได้ยากกับ URL</translation> <translation id="1532118530259321453">หน้านี้บอกว่า</translation> -<translation id="153384715582417236">เสร็จเรียบร้อย</translation> <translation id="1536390784834419204">แปลหน้าเว็บ</translation> <translation id="1539840569003678498">ส่งรายงานแล้ว:</translation> <translation id="1549470594296187301">ต้องเปิดใช้ JavaScript เพื่อใช้ฟีเจอร์นี้</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">เบราว์เซอร์ของคุณมีการจัดการ</translation> <translation id="1746113442205726301">เปลี่ยนตำแหน่งรูปภาพตามแกน Y</translation> <translation id="1746531169546376413">0 องศา</translation> -<translation id="17513872634828108">แท็บที่เปิดอยู่</translation> <translation id="1752021286346845558">กล่องจดหมาย 8</translation> <translation id="1753068535428855445">หาคู่และโฆษณาหาเพื่อน</translation> <translation id="1753706481035618306">เลขหน้า</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />ลองเรียกใช้การวินิจฉัยเครือข่ายของ Windows<ph name="END_LINK" /></translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติมเกี่ยวกับโหมดไม่ระบุตัวตนใน Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">แท็บที่คุณเปิดไว้จะปรากฏที่นี่</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" /> กด Tab ตามด้วย Enter เพื่อจัดการข้อมูล ความเป็นส่วนตัว และการรักษาความปลอดภัยในบัญชี Google ของคุณ</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" /> มีการทำงานหลายอย่างที่ทำได้ กด Tab เพื่อวนดูการทำงานดังกล่าว</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">จัดกลุ่ม</translation> <translation id="2576880857912732701">ปุ่มจัดการการตั้งค่าความปลอดภัย กด Enter เพื่อจัดการ Google Safe Browsing และอื่นๆ ในการตั้งค่า Chrome</translation> <translation id="2586657967955657006">คลิปบอร์ด</translation> -<translation id="2587730715158995865">จาก <ph name="ARTICLE_PUBLISHER" /> อ่านเรื่องราวนี้และอื่นๆ อีก <ph name="OTHER_ARTICLE_COUNT" /> เรื่อง</translation> <translation id="2587841377698384444">รหัส API ไดเรกทอรี:</translation> <translation id="2594318783181750337">มุมมองเว็บแบบรวดเร็ว:</translation> <translation id="2595719060046994702">อุปกรณ์และบัญชีนี้ไม่ได้จัดการโดยบริษัทหรือองค์กรอื่น</translation> @@ -1663,7 +1658,6 @@ <translation id="5045550434625856497">รหัสผ่านไม่ถูกต้อง</translation> <translation id="5051305769747448211">การแสดงตลกแบบสด</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{หากต้องการส่งไฟล์นี้โดยใช้การแชร์ใกล้เคียง ให้เพิ่มพื้นที่ว่าง (<ph name="DISK_SPACE_SIZE" />) ในอุปกรณ์}other{หากต้องการส่งไฟล์เหล่านี้โดยใช้การแชร์ใกล้เคียง ให้เพิ่มพื้นที่ว่าง (<ph name="DISK_SPACE_SIZE" />) ในอุปกรณ์}}</translation> -<translation id="5056549851600133418">บทความสำหรับคุณ</translation> <translation id="5060483733937416656">คุณเลือกยืนยันด้วย Windows Hello ในเว็บไซต์ที่ใช้ <ph name="PROVIDER_ORIGIN" /> ผู้ให้บริการนี้อาจจัดเก็บข้อมูลเกี่ยวกับวิธีการชำระเงินของคุณไว้แล้ว โดยคุณ<ph name="LINK_TEXT" />ได้</translation> <translation id="5061227663725596739">หรือคุณหมายถึง <ph name="LOOKALIKE_DOMAIN" /></translation> <translation id="5066056036849835175">ประวัติการพิมพ์</translation> @@ -1795,6 +1789,7 @@ <translation id="5344579389779391559">อาจมีการพยายามเรียกเก็บเงินจากคุณในหน้านี้</translation> <translation id="5347645913823149105">ปุ่มปรับแต่งแบบอักษรใน Chrome กด Enter เพื่อปรับแต่งขนาดแบบอักษรและลักษณะแบบอักษรใน Chrome</translation> <translation id="5355557959165512791">คุณไม่สามารถไปที่ <ph name="SITE" /> ได้ในขณะนี้เนื่องจากใบรับรองถูกเพิกถอนแล้ว โดยปกติข้อผิดพลาดของเครือข่ายและการโจมตีจะเกิดขึ้นเพียงชั่วคราว หน้านี้จึงอาจจะใช้งานได้ในภายหลัง</translation> +<translation id="5356345925629253198">คุณใช้ที่อยู่ที่บันทึกไว้ในผลิตภัณฑ์ต่างๆ ของ Google ได้ ระบบจะบันทึกที่อยู่นี้ไว้ในบัญชี Google (<ph name="ACCOUNT" />)</translation> <translation id="5357848622083956825">ทัศนศิลป์และการออกแบบ</translation> <translation id="536296301121032821">ไม่สามารถจัดเก็บการตั้งค่านโยบาย</translation> <translation id="5363309033720083897">พอร์ตอนุกรมนี้ได้รับอนุญาตจากผู้ดูแลระบบ</translation> @@ -1860,7 +1855,6 @@ <translation id="5541086400771735334">กล่องจดหมาย 7</translation> <translation id="5541546772353173584">เพิ่มอีเมล</translation> <translation id="5543722831081909240">180 องศา</translation> -<translation id="5545756402275714221">บทความสำหรับคุณ</translation> <translation id="5551890439174915351">100 x 200 มม.</translation> <translation id="5552137475244467770">Chrome ตรวจสอบรหัสผ่านของคุณเป็นระยะโดยเทียบกับรายการที่มีการเผยแพร่ออนไลน์ เราเข้ารหัสชื่อผู้ใช้และรหัสผ่านเมื่อทำการตรวจสอบเพื่อไม่ให้ผู้ใดอ่านข้อมูลดังกล่าวได้ รวมถึง Google</translation> <translation id="5556459405103347317">โหลดใหม่</translation> @@ -2142,14 +2136,12 @@ <translation id="6266934640124581640">น้ำเงินอมเขียวอ่อน</translation> <translation id="6272088941196661550">สำรวจต่อเพื่อดูกิจกรรมที่เกี่ยวข้องในประวัติการเข้าชมใน Chrome</translation> <translation id="6272383483618007430">Google อัปเดต</translation> -<translation id="6276112860590028508">หน้าเว็บจากเรื่องรออ่านของคุณจะปรากฏที่นี่</translation> <translation id="627746635834430766">เพื่อให้ชำระเงินได้เร็วขึ้นในครั้งถัดไป โปรดบันทึกบัตรและที่อยู่สำหรับการเรียกเก็บเงินไว้ในบัญชี Google</translation> <translation id="6279183038361895380">กด |<ph name="ACCELERATOR" />| เพื่อแสดงเคอร์เซอร์ของคุณ</translation> <translation id="6280223929691119688">ไม่สามารถนำส่งสินค้าไปยังที่อยู่นี้ โปรดเลือกที่อยู่อื่น</translation> <translation id="6284292079994426700">26 x 38 นิ้ว</translation> <translation id="6285507000506177184">ปุ่มจัดการการดาวน์โหลดใน Chrome กด Enter เพื่อจัดการไฟล์ที่คุณดาวน์โหลดใน Chrome</translation> <translation id="6289939620939689042">สีของหน้าเว็บ</translation> -<translation id="6290238015253830360">บทความที่แนะนำจะปรากฏที่นี่</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">กำลังบันทึก...</translation> @@ -2749,7 +2741,6 @@ <translation id="7696089921647603491">ร็อกคลาสสิกและเพลงเก่า</translation> <translation id="769721561045429135">ขณะนี้คุณมีบัตรต่างๆ ที่ใช้ได้ในอุปกรณ์นี้เท่านั้น คลิก "ทำต่อ" เพื่อดูบัตร</translation> <translation id="7698864304447945242">อัปเดตบริการ Google Play สำหรับ AR ไหม</translation> -<translation id="7699293099605015246">บทความไม่พร้อมใช้งานในขณะนี้</translation> <translation id="7701040980221191251">ไม่มี</translation> <translation id="7701544340847569275">อัปเดตเสร็จสิ้นโดยมีข้อผิดพลาด</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />ไปยัง <ph name="SITE" /> (ไม่ปลอดภัย)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb index 0420aa1c59..0d1a07f 100644 --- a/components/strings/components_strings_tr.xtb +++ b/components/strings/components_strings_tr.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Şifrenizi kuruluşunuz tarafından yönetilmeyen bir sitede girdiniz. Hesabınızı korumak için şifrenizi başka uygulama ve sitelerde tekrar kullanmayın.</translation> <translation id="1257553931232494454">yakınlaştırma seviyeleri</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome ayarlarınızı yönetmek için Sekme'ye, ardından Enter'a basın</translation> -<translation id="1263231323834454256">Okuma listesi</translation> <translation id="1264309058268477500">Alternatif</translation> <translation id="1264974993859112054">Spor</translation> <translation id="1266469291454105242">Cihazda kilit açma</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tepsi 8</translation> <translation id="1530707389502320859">Az önce girmeye çalıştığınız site sahte görünüyor. Saldırganlar bazen URL'de görülmesi zor ufak değişiklikler yaparak siteleri taklit ederler.</translation> <translation id="1532118530259321453">Bu sayfanın mesajı</translation> -<translation id="153384715582417236">Şimdilik hepsi bu</translation> <translation id="1536390784834419204">Sayfayı çevir</translation> <translation id="1539840569003678498">Rapor gönderildi:</translation> <translation id="1549470594296187301">Bu özelliğin kullanılabilmesi için JavaScript etkinleştirilmelidir.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Tarayıcınız yönetilmektedir</translation> <translation id="1746113442205726301">Resim Y kayması</translation> <translation id="1746531169546376413">0 derece</translation> -<translation id="17513872634828108">Açık sekmeler</translation> <translation id="1752021286346845558">Posta kutusu 8</translation> <translation id="1753068535428855445">Buluşma ve kişisel ilanlar</translation> <translation id="1753706481035618306">Sayfa numarası</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows Ağ Teşhislerini çalıştırmayı deneyin<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium'daki Gizli mod hakkında daha fazla bilgi<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Açık sekmeleriniz burada görünür</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google Hesabınızda bilgilerinizi, gizliliğinizi ve güvenliğinizi yönetmek için Sekme'ye, ardından Enter'a basın</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, birden fazla işlem mevcut, işlemler arasında geçiş yapmak için Sekme'ye basın</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Grup</translation> <translation id="2576880857912732701">Güvenlik ayarlarını yönet düğmesi. Chrome ayarlarında Güvenli Tarama ve diğer özellikleri yönetmek için Enter'a basın</translation> <translation id="2586657967955657006">Pano</translation> -<translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> adlı yayıncıdan. Bunu ve diğer <ph name="OTHER_ARTICLE_COUNT" /> haberi okuyun.</translation> <translation id="2587841377698384444">Dizin API'sı Kimliği:</translation> <translation id="2594318783181750337">Hızlı web görüntüleme:</translation> <translation id="2595719060046994702">Bu cihaz ve hesap bir şirket veya başka kuruluş tarafından yönetilmiyor.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Hatalı parola</translation> <translation id="5051305769747448211">Canlı komedi</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Bu dosyayı Yakındakilerle Paylaş özelliğini kullanarak göndermek için cihazınızda yer açın (<ph name="DISK_SPACE_SIZE" />)}other{Bu dosyaları Yakındakilerle Paylaş özelliğini kullanarak göndermek için cihazınızda yer açın (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">Sizin için seçilmiş makaleler</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> kullanan web sitelerinde Windows Hello ile doğrulamayı seçtiniz. Bu sağlayıcı, ödeme yönteminizle ilgili bilgileri depolamış olabilir. Bu bilgilerin <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Şunu mu demek istediniz: <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Yazdırma geçmişi</translation> @@ -1742,6 +1736,8 @@ <translation id="5234764350956374838">Kapat</translation> <translation id="5239623327352565343">Konuma izin veriliyor</translation> <translation id="5242889659037569123">Bavul ve seyahat aksesuarları</translation> +<translation id="5244732203286792411">Yükleniyor... + Bu işlem biraz zaman alabilir.</translation> <translation id="5250209940322997802">"Ağa bağlanın"</translation> <translation id="52517543715119994">Chrome özellikleri hakkında bilgi edinin</translation> <translation id="5251803541071282808">Bulut</translation> @@ -1859,7 +1855,6 @@ <translation id="5541086400771735334">Posta kutusu 7</translation> <translation id="5541546772353173584">E-posta Adresi Ekleyin</translation> <translation id="5543722831081909240">180 derece</translation> -<translation id="5545756402275714221">Sizin için Seçilmiş Makaleler</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome, internette yayınlanan listelerle karşılaştırarak şifrelerinizi belirli aralıklarla kontrol eder. Bu işlem sırasında şifreleriniz ve kullanıcı adlarınız şifrelendiğinden, Google dahil olmak üzere hiç kimse tarafından okunamaz.</translation> <translation id="5556459405103347317">Yeniden Yükle</translation> @@ -2141,14 +2136,12 @@ <translation id="6266934640124581640">Açık Turkuaz</translation> <translation id="6272088941196661550">Chrome geçmişinizde alakalı etkinlikleri görmek için arama yolculuğunuzu devam ettirin.</translation> <translation id="6272383483618007430">Google Güncelleme</translation> -<translation id="6276112860590028508">Okuma listenize ait sayfalar burada görünür</translation> <translation id="627746635834430766">Bir dahaki sefere daha hızlı ödeme yapmak için kartınızı ve fatura adresinizi Google Hesabınıza kaydedin.</translation> <translation id="6279183038361895380">İmlecinizi göstermek için |<ph name="ACCELERATOR" />| tuşuna basın</translation> <translation id="6280223929691119688">Bu adrese teslimat yapılamıyor. Farklı bir adres seçin.</translation> <translation id="6284292079994426700">26 x 38 inç</translation> <translation id="6285507000506177184">Chrome'da indirilenleri yönetin düğmesi. Chrome'da indirdiğiniz dosyaları yönetmek için Enter'a basın</translation> <translation id="6289939620939689042">Sayfa Rengi</translation> -<translation id="6290238015253830360">Önerilen makaleler burada görünür</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Kaydediliyor...</translation> @@ -2748,7 +2741,6 @@ <translation id="7696089921647603491">Klasik rock ve eski şarkılar</translation> <translation id="769721561045429135">Şu anda, yalnızca bu cihazda kullanılabilen kartlarınız var. Kartları incelemek için Devam'ı tıklayın.</translation> <translation id="7698864304447945242">AR için Google Play Hizmetleri güncellensin mi?</translation> -<translation id="7699293099605015246">Makaleler şu anda kullanılamıyor</translation> <translation id="7701040980221191251">Yok</translation> <translation id="7701544340847569275">Güncelleme tamamlandı, ancak hatalar var</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> sitesine ilerle (güvenli değil)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb index c0332ce..52eb968 100644 --- a/components/strings/components_strings_uk.xtb +++ b/components/strings/components_strings_uk.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ви ввели пароль на сайті, яким не керує ваша організація. Щоб захистити свій обліковий запис, не використовуйте цей пароль для інших додатків і сайтів.</translation> <translation id="1257553931232494454">рівні масштабування</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />; натисніть Tab, а потім – Enter, щоб керувати налаштуваннями Chrome</translation> -<translation id="1263231323834454256">Список читання</translation> <translation id="1264309058268477500">Альтернативний</translation> <translation id="1264974993859112054">Спорт</translation> <translation id="1266469291454105242">Розблокування пристрою</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Лоток 8</translation> <translation id="1530707389502320859">Сайт, на який ви намагалися перейти, виглядає несправжнім. Зловмисники іноді імітують сайти, вносячи майже непомітні зміни в URL-адресу.</translation> <translation id="1532118530259321453">Повідомлення з цієї сторінки</translation> -<translation id="153384715582417236">Більше нічого немає</translation> <translation id="1536390784834419204">Перекласти сторінку</translation> <translation id="1539840569003678498">Звіт надіслано:</translation> <translation id="1549470594296187301">Щоб користуватися цією функцією, потрібно ввімкнути JavaScript.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Вашим веб-переглядачем керує адміністратор</translation> <translation id="1746113442205726301">Вертикальне зображення</translation> <translation id="1746531169546376413">0 градусів</translation> -<translation id="17513872634828108">Відкриті вкладки</translation> <translation id="1752021286346845558">Поштова скринька 8</translation> <translation id="1753068535428855445">Побачення й особисті зустрічі</translation> <translation id="1753706481035618306">Номер сторінки</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Проведіть діагностику мережі Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Докладніше про анонімний режим у Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Тут відображатимуться ваші відкриті вкладки</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />; натисніть Tab, а потім – Enter, щоб керувати своєю інформацією, конфіденційністю й безпекою в обліковому записі Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />; доступно кілька дій, натискайте Tab, щоб переходити між ними</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Група</translation> <translation id="2576880857912732701">Кнопка "Керувати налаштуваннями безпеки"; натисніть Enter, щоб керувати Безпечним переглядом і виконувати інші дії в налаштуваннях Chrome</translation> <translation id="2586657967955657006">Буфер обміну</translation> -<translation id="2587730715158995865">Видавець: <ph name="ARTICLE_PUBLISHER" />. Читайте цю та ще <ph name="OTHER_ARTICLE_COUNT" /> статей.</translation> <translation id="2587841377698384444">Ідентифікатор API каталогу:</translation> <translation id="2594318783181750337">Швидкий веб-перегляд:</translation> <translation id="2595719060046994702">Цими пристроєм і обліковим записом не керує компанія чи інша організація.</translation> @@ -1664,7 +1659,6 @@ <translation id="5045550434625856497">Неправильний пароль</translation> <translation id="5051305769747448211">Виступи коміків наживо</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Щоб надіслати цей файл через функцію "Передавання поблизу", звільніть місце (<ph name="DISK_SPACE_SIZE" />) на пристрої}one{Щоб надіслати ці файли через функцію "Передавання поблизу", звільніть місце (<ph name="DISK_SPACE_SIZE" />) на пристрої}few{Щоб надіслати ці файли через функцію "Передавання поблизу", звільніть місце (<ph name="DISK_SPACE_SIZE" />) на пристрої}many{Щоб надіслати ці файли через функцію "Передавання поблизу", звільніть місце (<ph name="DISK_SPACE_SIZE" />) на пристрої}other{Щоб надіслати ці файли через функцію "Передавання поблизу", звільніть місце (<ph name="DISK_SPACE_SIZE" />) на пристрої}}</translation> -<translation id="5056549851600133418">Статті для вас</translation> <translation id="5060483733937416656">Ви вибрали підтвердження за допомогою Windows Hello на веб-сайтах, які використовують <ph name="PROVIDER_ORIGIN" />. У цього постачальника могла зберегтись інформація про ваш спосіб оплати, але ви можете надіслати <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Можливо, ви мали на увазі <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Історія друку</translation> @@ -1859,7 +1853,6 @@ <translation id="5541086400771735334">Поштова скринька 7</translation> <translation id="5541546772353173584">Додайте електронну адресу</translation> <translation id="5543722831081909240">180 градусів</translation> -<translation id="5545756402275714221">Статті для вас</translation> <translation id="5551890439174915351">100 x 200 мм</translation> <translation id="5552137475244467770">Chrome періодично зіставляє ваші паролі зі списками, які були опубліковані онлайн. Під час цього ваші паролі й імена користувачів шифруються, тож їх ніхто не може прочитати, навіть Google.</translation> <translation id="5556459405103347317">Перезавантажити</translation> @@ -2141,14 +2134,12 @@ <translation id="6266934640124581640">Світло-бірюзовий</translation> <translation id="6272088941196661550">Щоб бачити релевантні дії в історії Chrome, відновіть сеанс</translation> <translation id="6272383483618007430">Оновлення Google</translation> -<translation id="6276112860590028508">Тут з’являтимуться сторінки з вашого списку читання</translation> <translation id="627746635834430766">Щоб наступного разу платити швидше, збережіть дані картки та платіжну адресу в обліковому записі Google.</translation> <translation id="6279183038361895380">Натисніть |<ph name="ACCELERATOR" />|, щоб побачити курсор</translation> <translation id="6280223929691119688">Неможливо доставити замовлення за цією адресою. Укажіть іншу адресу.</translation> <translation id="6284292079994426700">26 x 38 дюйм.</translation> <translation id="6285507000506177184">Кнопка "Керувати завантаженнями в Chrome"; натисніть Enter, щоб керувати завантаженими файлами в Chrome</translation> <translation id="6289939620939689042">Колір сторінки</translation> -<translation id="6290238015253830360">Тут відображатимуться рекомендовані статті</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Зберігання…</translation> @@ -2748,7 +2739,6 @@ <translation id="7696089921647603491">Класичний рок і старі пісні</translation> <translation id="769721561045429135">Зараз у вас є картки, які можна використовувати лише на цьому пристрої. Натисніть "Продовжити", щоб переглянути їх.</translation> <translation id="7698864304447945242">Оновити Сервіси Google Play для AR?</translation> -<translation id="7699293099605015246">Зараз статті недоступні</translation> <translation id="7701040980221191251">Немає</translation> <translation id="7701544340847569275">Оновлення завершено з помилками</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Перейти на сайт <ph name="SITE" /> (небезпечно)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_ur.xtb b/components/strings/components_strings_ur.xtb index 8a518d0..ff32e7c1 100644 --- a/components/strings/components_strings_ur.xtb +++ b/components/strings/components_strings_ur.xtb
@@ -121,7 +121,6 @@ <translation id="1257286744552378071">آپ نے اپنا پاس ورڈ ایک ایسی سائٹ پر درج کیا ہے جو آپ کی تنظیم کے زیر انتظام نہیں ہے۔ اپنے اکاؤنٹ کے تحفظ کے لیے، دیگر ایپس اور سائٹس پر اپنا پاس ورڈ دوبارہ استعمال نہ کریں۔</translation> <translation id="1257553931232494454">زوم کے لیولز</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />، اپنے Chrome کی ترتیبات کا نظم کرنے کے لیے ٹیب پھر اینٹر دبائیں</translation> -<translation id="1263231323834454256">پڑھنے کی فہرست</translation> <translation id="1264309058268477500">متبادل</translation> <translation id="1264974993859112054">کھیل</translation> <translation id="1266469291454105242">آلے کو غیر مقفل کرنے کی خصوصیت</translation> @@ -252,7 +251,6 @@ <translation id="1529789484829130889">ٹرے 8</translation> <translation id="1530707389502320859">آپ نے ابھی جو سائٹ ملاحظہ کرنے کی کوشش کی ہے وہ جعلی معلوم ہوتی ہے۔ بعض اوقات حملہ آور URL میں چھوٹی، مشکل سے نظر آنے والی تبدیلیاں کر کے سائٹس کی نقل کرتے ہیں۔</translation> <translation id="1532118530259321453">اس صفحے کے مطابق</translation> -<translation id="153384715582417236">ابھی کیلئے بس اتنا ہی</translation> <translation id="1536390784834419204">صفحہ کا ترجمہ کریں</translation> <translation id="1539840569003678498">رپورٹ بھیج دی گئی:</translation> <translation id="1549470594296187301">اس خصوصیت کا استعمال کرنے کیلئے JavaScript کا فعال ہونا لازمی ہے۔</translation> @@ -349,7 +347,6 @@ <translation id="1745880797583122200">آپ کا براؤزر زیر انتظام ہے</translation> <translation id="1746113442205726301">تصویر Y شفٹ</translation> <translation id="1746531169546376413">0 ڈگریز</translation> -<translation id="17513872634828108">کھلے ٹیبز</translation> <translation id="1752021286346845558">میل باکس 8</translation> <translation id="1753068535428855445">ڈیٹنگ اور ذاتیات</translation> <translation id="1753706481035618306">صفحہ نمبر</translation> @@ -361,7 +358,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows نیٹ ورک کی تشخیصات چلانے کی کوشش کریں<ph name="END_LINK" />۔</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromium میں پوشیدگی وضع کے بارے میں مزید جانیں<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">آپ کے کھلے ٹیبز یہاں ظاہر ہوتے ہیں</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />، اپنے Google اکاؤنٹ میں اپنی معلومات، رازداری اور سیکیورٹی کا نظم کرنے کیلئے Tab، پھر Enter دبائیں</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />، متعدد کارروائیاں دستیاب ہیں، ہر ایک پر جانے کیلئے Tab دبائیں</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">گروپ</translation> <translation id="2576880857912732701">سیکیورٹی کی ترتیبات کے بٹن کا نظم کریں، Chrome کی ترتیبات میں محفوظ براؤزنگ اور بہت کچھ کا نظم کرنے کے لیے اینٹر دبائیں</translation> <translation id="2586657967955657006">کلپ بورڈ</translation> -<translation id="2587730715158995865">منجانب <ph name="ARTICLE_PUBLISHER" />۔ یہ اور <ph name="OTHER_ARTICLE_COUNT" /> دوسری کہانیاں پڑھیں۔</translation> <translation id="2587841377698384444">ڈائرکٹری API ID:</translation> <translation id="2594318783181750337">تیز ویب کا منظر:</translation> <translation id="2595719060046994702">یہ آلہ اور اکاؤنٹ کسی کمپنی یا دوسری تنظیم کے زیر انتظام نہیں ہیں۔</translation> @@ -1666,7 +1661,6 @@ <translation id="5045550434625856497">غلط پاس ورڈ</translation> <translation id="5051305769747448211">لائیو کامیڈی</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{اس فائل کو قریبی آلات کے ساتھ اشتراک کا استعمال کرتے ہوئے بھیجنے کے لیے اپنے آلے پر <ph name="DISK_SPACE_SIZE" /> جگہ خالی کریں}other{ان فائلز کو قریبی آلات کے ساتھ اشتراک کا استعمال کرتے ہوئے بھیجنے کے لیے اپنے آلے پر <ph name="DISK_SPACE_SIZE" /> جگہ خالی کریں}}</translation> -<translation id="5056549851600133418">آپ کیلئے مضامین</translation> <translation id="5060483733937416656">آپ نے <ph name="PROVIDER_ORIGIN" /> کا استعمال کرنے والی ویب سائٹس پر Windows Hello سے تصدیق کرنے کا انتخاب کیا ہے۔ ممکن ہے کہ اس فراہم کنندہ کے پاس آپ کی ادائیگی کے طریقہ کے بارے میں معلومات اسٹور کردہ ہے جن کو <ph name="LINK_TEXT" />آپ کر سکتے ہیں۔</translation> <translation id="5061227663725596739">کیا آپ کا مطلب <ph name="LOOKALIKE_DOMAIN" /> ہے؟</translation> <translation id="5066056036849835175">پرنٹنگ کی سرگزشت</translation> @@ -1744,6 +1738,8 @@ <translation id="5234764350956374838">برخاست کریں</translation> <translation id="5239623327352565343">مقام کی اجازت ہے</translation> <translation id="5242889659037569123">سامان اور سفر کے لوازمات</translation> +<translation id="5244732203286792411">لوڈ ہو رہی ہے… + اس میں ایک منٹ لگ سکتا ہے۔</translation> <translation id="5250209940322997802">"نیٹ ورک سے منسلک ہوں"</translation> <translation id="52517543715119994">Chrome کی خصوصیات کے بارے میں جانیں</translation> <translation id="5251803541071282808">کلاؤڈ</translation> @@ -1861,7 +1857,6 @@ <translation id="5541086400771735334">میل باکس 7</translation> <translation id="5541546772353173584">ای میل شامل کریں</translation> <translation id="5543722831081909240">180 ڈگریز</translation> -<translation id="5545756402275714221">آپ کیلئے مضامین</translation> <translation id="5551890439174915351">100 x 200 ملی میٹر</translation> <translation id="5552137475244467770">Chrome وقفے وقفے سے ان فہرستوں کے خلاف پاس ورڈز چیک کرتا ہے جو آن لائن شائع ہوئی ہیں۔ ایسا کرتے وقت، آپ کے پاس ورڈز اور صارف نام مرموزکردہ ہو جاتے ہیں، تاکہ وہ Google سمیت کسی بھی شخص کے ذریعے نہ پڑھے جا سکیں۔</translation> <translation id="5556459405103347317">دوبارہ لوڈ کریں</translation> @@ -2144,14 +2139,12 @@ <translation id="6266934640124581640">ہلکا نیلگوں سبز</translation> <translation id="6272088941196661550">اپنی Chrome کی سرگزشت میں متعلقہ سرگرمی دیکھنے کے لیے دوبارہ اپنا صارف کا تجربہ شروع کریں</translation> <translation id="6272383483618007430">Google اپ ڈیٹ</translation> -<translation id="6276112860590028508">آپ کی پڑھنے کی فہرست کے صفحات یہاں دکھائی دیتے ہیں</translation> <translation id="627746635834430766">اگلی بار زیادہ تیزی سے ادائیگی کرنے کے لیے، اپنے کارڈ اور بلنگ پتہ کو اپنے Google اکاؤنٹ میں محفوظ کریں۔</translation> <translation id="6279183038361895380">اپنا کرسر دکھانے کیلئے |<ph name="ACCELERATOR" />| کو دبائیں</translation> <translation id="6280223929691119688">اس پتے پر ڈیلیوری نہیں ہو سکتی۔ کوئی مختلف پتہ منتخب کریں۔</translation> <translation id="6284292079994426700">26 x 38 انچ</translation> <translation id="6285507000506177184">Chrome بٹن میں ڈاؤن لوڈز کا نظم کریں، Chrome میں ڈاؤن لوڈ کردہ اپنی فائلز کا نظم کرنے کے لیے اینٹر دبائیں</translation> <translation id="6289939620939689042">صفحے کا رنگ</translation> -<translation id="6290238015253830360">آپ کے تجویز کردہ مضامین یہاں ظاہر ہوتے ہیں</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">محفوظ کیا جا رہا ہے…</translation> @@ -2751,7 +2744,6 @@ <translation id="7696089921647603491">کلاسک راک اور پرانے گانے</translation> <translation id="769721561045429135">ابھی، آپ کے پاس ایسے کارڈز ہیں جنہیں صرف اس آلہ پر استعمال کیا جا سکتا ہے کارڈز کا جائزہ لینے کیلئے 'جاری رکھیں' پر کلک کریں۔</translation> <translation id="7698864304447945242">Google Play سروسز برائے AR کو اپ ڈیٹ کریں؟</translation> -<translation id="7699293099605015246">مضامین ابھی دستیاب نہیں ہیں</translation> <translation id="7701040980221191251">کوئی نہیں</translation> <translation id="7701544340847569275">خرابیوں کے ساتھ اپ ڈیٹ مکمل ہو گئی</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> کی طرف بڑھیں (غیر محفوظ)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_uz.xtb b/components/strings/components_strings_uz.xtb index 5a269a9..f0d1a58 100644 --- a/components/strings/components_strings_uz.xtb +++ b/components/strings/components_strings_uz.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Parolingizni tashkilot domenidan tashqaridagi saytda kiritdingiz. Hisobingizni himoyalash uchun tashqi ilova va saytlarda parolingizni qayta kiritmang.</translation> <translation id="1257553931232494454">masshtab</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome sozlamalari orqali boshqarish uchun avval Tab, keyin Enter tugmasini bosing</translation> -<translation id="1263231323834454256">Mutolaa ro‘yxati</translation> <translation id="1264309058268477500">Muqobil</translation> <translation id="1264974993859112054">Sport</translation> <translation id="1266469291454105242">Qurilma kaliti</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Tarnov 8</translation> <translation id="1530707389502320859">Hozirgina ochilgan sayt soxta shekilli. Odatda shubhali kimsalar URL manzilda kichik oʻzgarishlar kiritib, saytlarga soxta nusxalar yasaydi.</translation> <translation id="1532118530259321453">Amalni tasdiqlang</translation> -<translation id="153384715582417236">Hozircha hammasi shu</translation> <translation id="1536390784834419204">Sahifani tarjima qilish</translation> <translation id="1539840569003678498">Hisobot yuborildi:</translation> <translation id="1549470594296187301">Bu xususiyatdan foydalanish uchun JavaScript yoqilgan bo‘lishi lozim.</translation> @@ -347,7 +345,6 @@ <translation id="1745880797583122200">Bu brauzer nazorat ostida</translation> <translation id="1746113442205726301">Tasvirning Y oʻqidagi siljishi</translation> <translation id="1746531169546376413">0 dajara</translation> -<translation id="17513872634828108">Ichki oynalarni ochish</translation> <translation id="1752021286346845558">Pochta qutisi 8</translation> <translation id="1753068535428855445">Tanishuvlar</translation> <translation id="1753706481035618306">Sahifa raqami</translation> @@ -359,7 +356,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Windows tarmoq diagnostikasi bilan tekshirib ko‘ring<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Chromiumdagi Inkognito rejimi haqida batafsil<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Ochiq varaqlar shu yerda ko‘rsatiladi</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, Google hisobingizdagi axborot, maxfiylik va xavfsizlik sozlamalarini boshqarish uchun avval Tab, keyin Enter tugmasini bosing</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, bir nechta amal mavjud, ularga oʻtish uchun Tab tugmasini bosing</translation> @@ -367,6 +363,7 @@ <translation id="1801812870656502108">Virtual karta axboroti</translation> <translation id="1803020234906945288">Sogʻlom ovqatlanish</translation> <translation id="1803351196216024260">Mikrofondan foydalanish uchun ruxsat soʻrashi mumkin</translation> +<translation id="1806174020048213474">Bu ilova Wi-Fi maʼlumotlarini oʻrnatish uchun ruxsat soʻramoqda. Sozlashdan keyin <ph name="DEVICE_TYPE" /> qurilmasi tegishli Wi-Fi tarmoqlarga avtomatik ulanadi. Bu maʼlumotlarni olib tashlash uchun ilovani oʻchirib tashlang.</translation> <translation id="1807246157184219062">Yorqin</translation> <translation id="1807528111851433570">Birinchi varaq</translation> <translation id="180991881384371158">CVC – kartangizning orqa tomonida. U 3 ta oxirgi raqam boʻlib, imzo katagining yuqori oʻng tomonida joylashgan.</translation> @@ -669,7 +666,6 @@ <translation id="257674075312929031">Guruh</translation> <translation id="2576880857912732701">Xavfsizlik sozlamalarini boshqarish tugmasi, Chrome sozlamalari orqali saytlarni xavfsiz kezish va boshqa parametrlarni boshqarish uchun Enter tugmasini bosing</translation> <translation id="2586657967955657006">Klipbord</translation> -<translation id="2587730715158995865">Manba: <ph name="ARTICLE_PUBLISHER" />. Bu va yana <ph name="OTHER_ARTICLE_COUNT" /> ta maqolani mutolaa qilishingiz mumkin.</translation> <translation id="2587841377698384444">Katalog API ID:</translation> <translation id="2594318783181750337">Tezkor veb shakli:</translation> <translation id="2595719060046994702">Bu qurilma va hisob kompaniya yoki tashkilot boshqaruvida emas.</translation> @@ -1336,6 +1332,7 @@ <translation id="4270541775497538019">Taxlovchi 6</translation> <translation id="4274173425554582601">Kompyuterlar va elektronika</translation> <translation id="4275830172053184480">Qurilmangizni qayta yuklang</translation> +<translation id="4276974990916607331">Kerak emas</translation> <translation id="4277028893293644418">Parolni o‘zgartirish</translation> <translation id="4277937682389409325">Mahalliy manzil</translation> <translation id="4278390842282768270">Berilgan ruxsatnomalar</translation> @@ -1659,7 +1656,6 @@ <translation id="5045550434625856497">Parol noto‘g‘ri</translation> <translation id="5051305769747448211">Jonli komediya</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Nearby Share yordamida bu faylni yuborish uchun qurilmangizda (<ph name="DISK_SPACE_SIZE" />) joy boʻshating}other{Nearby Share yordamida bu faylni yuborish uchun qurilmangizda (<ph name="DISK_SPACE_SIZE" />) joy boʻshating}}</translation> -<translation id="5056549851600133418">Sizga atalgan maqolalar</translation> <translation id="5060483733937416656"><ph name="PROVIDER_ORIGIN" /> saytlarida shaxsni Windows Hello yordamida tasdiqlash mumkin. Bu provayder toʻlov usulingiz axborotini saqlashi mumkin, lekin uning <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Buni nazarda tutdingizmi: <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Chop etish tarixi</translation> @@ -1697,6 +1693,7 @@ <translation id="5129534298163637277">Tasdiqlash oynasi</translation> <translation id="5135404736266831032">Manzillar...</translation> <translation id="5136841603454277753">Kerakli kodni kiriting</translation> +<translation id="5137761395480718572">Bu ilova Wi-Fi maʼlumotlarini oʻrnatish uchun ruxsat soʻramoqda. Sozlashdan keyin <ph name="DEVICE_TYPE" /> qurilmasi tegishli Wi-Fi tarmoqlarga avtomatik ulanadi. Bu maʼlumotlarni olib tashlash uchun ilovani oʻchirib tashlang. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Hozirda virtual karta mavjud emas. Bankka murojaat qiling</translation> <translation id="5138227688689900538">Kamroq chiqsin</translation> <translation id="5145883236150621069">Siyosat javobida xato kodi bor</translation> @@ -1751,6 +1748,7 @@ <translation id="5273881944177595304">Veb-ilovalar va onlayn vositalar</translation> <translation id="5274025349362408263">Kitoblar va adabiyot</translation> <translation id="5279286380302340275">Yuklanmalarni boshqarish</translation> +<translation id="5279453600310613955">Kerak emas</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Hujjat parametrlari</translation> <translation id="528468243742722775">Tugatish</translation> @@ -1854,7 +1852,6 @@ <translation id="5541086400771735334">Pochta qutisi 7</translation> <translation id="5541546772353173584">Email manzilini qo‘shing</translation> <translation id="5543722831081909240">180 dajara</translation> -<translation id="5545756402275714221">Sizga atalgan maqolalar</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Vaqti-vaqti bilan Chrome internetda oshkor etilgan roʻyxatlarda parolingiz borligini tekshirib turadi. Bunda parolingiz va foydalanuvchi nomingiz shifrlanadi, hatto Google xodimlariga ham koʻrinmaydi.</translation> <translation id="5556459405103347317">Qayta yuklash</translation> @@ -2135,14 +2132,12 @@ <translation id="6266934640124581640">Och moviy</translation> <translation id="6272088941196661550">Chrome tarixidagi tegishli faollikni koʻrish uchun tarixni qaytaring</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Mutolaa ro‘yxatingizdagi sahifalar bu yerda ko‘rsatiladi</translation> <translation id="627746635834430766">Keyingi safar tezroq to‘lash uchun kartangizni Google hisobingizga saqlang.</translation> <translation id="6279183038361895380">Kursorni ko‘rish uchun |<ph name="ACCELERATOR" />| tugmasini bosing</translation> <translation id="6280223929691119688">Bu manzilga yetkazib bera olmaymiz. Boshqa manzilni tanlang.</translation> <translation id="6284292079994426700">26 x 38 in</translation> <translation id="6285507000506177184">Chromeda yuklanmalarni boshqarish tugmasi, Chromeda yuklab olingan fayllarni boshqarish uchun Enter tugmasini bosing</translation> <translation id="6289939620939689042">Sahifa rangi</translation> -<translation id="6290238015253830360">Tavsiya etiladigan maqolalar shu yerda chiqadi</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC kod:</translation> <translation id="6295855836753816081">Saqlanmoqda...</translation> @@ -2245,6 +2240,7 @@ <translation id="6529173248185917884">Yettinchi oʻram</translation> <translation id="6529602333819889595">&O‘chirishni qaytarish</translation> <translation id="6535751101619004418">Valyuta ayirboshlash</translation> +<translation id="6536221421038631327"><ph name="DEVICE_TYPE" /> qurilmasidan Passpoint ilovasi olib tashlansa, biriktirilgan kanallar ham olib tashlanadi. Obuna tarif rejasiga oʻzgartirish kiritish uchun “<ph name="FRIENDLY_NAME" />” bilan bogʻlaning. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Investitsiya fondlari</translation> <translation id="6545864417968258051">Bluetooth qurilmalarni qidirish</translation> <translation id="6547208576736763147">Chapdan 2 ta teshik ochish</translation> @@ -2742,7 +2738,6 @@ <translation id="7696089921647603491">Klassik rok va oldi</translation> <translation id="769721561045429135">Hozir faqat shu qurilmada ishlaydigan kartalaringiz mavjud. Kartalarni tekshirish uchun davom etish tugmasini bosing.</translation> <translation id="7698864304447945242">AR uchun Google Play xizmatlari yangilansinmi?</translation> -<translation id="7699293099605015246">Hozir maqolalar mavjud emas.</translation> <translation id="7701040980221191251">Hech qanday</translation> <translation id="7701544340847569275">Yangilanish xato bilan yakunlandi</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" /><ph name="SITE" /> saytiga o‘tish (xavfli)<ph name="END_LINK" /></translation> @@ -3341,6 +3336,7 @@ <translation id="9219103736887031265">Rasmlar</translation> <translation id="922152298093051471">Chromeni moslash</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385"><ph name="APP_NAME" /> ilovasi Wi-Fi tarmoqlarni sozlashiga ruxsat berilsinmi?</translation> <translation id="936602727769022409">Google hisobingiz xavf ostida. Parolingizni yangilashni tavsiya qilamiz. Hisobingizga qayta kirishingiz talab qilinadi.</translation> <translation id="937457230470581909">Hayvonot bogʻlari, akvarium va qoʻriqxonalar</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Qanday maʼlumotlar ishlatiladi:<ph name="END_BOLD" /> Reklamalardagi mavzular oxirgi brauzer tarixi asosida aniqlanadi, bunda Chrome orqali shu qurilmada ochilgan saytlar roʻyxati tuziladi.</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb index af5a8ce..5fa5448 100644 --- a/components/strings/components_strings_vi.xtb +++ b/components/strings/components_strings_vi.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Bạn đã nhập mật khẩu của mình trên một trang web không thuộc quyền quản lý của tổ chức bạn. Để bảo vệ tài khoản, không sử dụng lại mật khẩu của bạn trên các ứng dụng và trang web khác.</translation> <translation id="1257553931232494454">mức thu phóng</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Nhấn phím Tab rồi nhấn phím Enter để quản lý chế độ cài đặt Chrome của bạn</translation> -<translation id="1263231323834454256">Danh sách đọc</translation> <translation id="1264309058268477500">Khay thay thế</translation> <translation id="1264974993859112054">Thể thao</translation> <translation id="1266469291454105242">Mở khoá thiết bị</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Khay 8</translation> <translation id="1530707389502320859">Có vẻ như trang web bạn vừa cố truy cập là giả mạo. Kẻ tấn công đôi khi bắt chước các trang web bằng cách thực hiện các thay đổi nhỏ, khó phát hiện đối với URL.</translation> <translation id="1532118530259321453">Trang này cho biết</translation> -<translation id="153384715582417236">Hiện chưa có nội dung</translation> <translation id="1536390784834419204">Dịch trang</translation> <translation id="1539840569003678498">Thời gian gửi báo cáo:</translation> <translation id="1549470594296187301">Bạn phải bật JavaScript để sử dụng tính năng này.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Trình duyệt của bạn được quản lý</translation> <translation id="1746113442205726301">Trục Y của hình ảnh</translation> <translation id="1746531169546376413">0 độ</translation> -<translation id="17513872634828108">Thẻ đang mở</translation> <translation id="1752021286346845558">Hộp thư 8</translation> <translation id="1753068535428855445">Hẹn hò và cá nhân</translation> <translation id="1753706481035618306">Số trang</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Thử chạy Chẩn đoán mạng của Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Tìm hiểu thêm về Chế độ ẩn danh trên Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">Thẻ đang mở của bạn xuất hiện ở đây</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, nhấn phím Tab rồi nhấn phím Enter để quản lý thông tin, quyền riêng tư và chế độ bảo mật cho Tài khoản Google của bạn</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, có nhiều thao tác, nhấn phím Tab để chuyển giữa các thao tác đó</translation> @@ -368,6 +364,7 @@ <translation id="1801812870656502108">Thông tin về thẻ ảo</translation> <translation id="1803020234906945288">Ăn uống lành mạnh</translation> <translation id="1803351196216024260">Trang web có thể yêu cầu dùng micrô của bạn</translation> +<translation id="1806174020048213474">Ứng dụng này yêu cầu cấp quyền cài đặt thông tin xác thực Wi-Fi. Sau khi thiết lập, <ph name="DEVICE_TYPE" /> sẽ tự động kết nối với các mạng Wi-Fi tham gia. Để xoá các thông tin xác thực này, hãy gỡ cài đặt ứng dụng.</translation> <translation id="1807246157184219062">Sáng</translation> <translation id="1807528111851433570">Tờ đầu</translation> <translation id="180991881384371158">CVC của bạn nằm ở mặt sau của thẻ. Đó là 3 chữ số cuối cùng ở góc trên cùng bên phải của ô chữ ký.</translation> @@ -670,7 +667,6 @@ <translation id="257674075312929031">Nhóm</translation> <translation id="2576880857912732701">Nút quản lý chế độ cài đặt bảo mật, nhấn phím Enter để quản lý tính năng Duyệt web an toàn và nhiều tính năng khác trong phần Cài đặt của Chrome</translation> <translation id="2586657967955657006">Bảng nhớ tạm</translation> -<translation id="2587730715158995865">Từ <ph name="ARTICLE_PUBLISHER" />. Đọc tin bài này và <ph name="OTHER_ARTICLE_COUNT" /> tin bài khác.</translation> <translation id="2587841377698384444">ID API thư mục:</translation> <translation id="2594318783181750337">Chế độ xem nhanh trên web:</translation> <translation id="2595719060046994702">Thiết bị và tài khoản này không thuộc quyền quản lý của một công ty hoặc tổ chức khác.</translation> @@ -1341,6 +1337,7 @@ <translation id="4270541775497538019">Khay xếp chồng 6</translation> <translation id="4274173425554582601">Máy tính và đồ điện tử</translation> <translation id="4275830172053184480">Khởi động lại thiết bị của bạn</translation> +<translation id="4276974990916607331">Không, cảm ơn</translation> <translation id="4277028893293644418">Đặt lại mật khẩu</translation> <translation id="4277937682389409325">Địa chỉ tại địa phương</translation> <translation id="4278390842282768270">Được cho phép</translation> @@ -1664,7 +1661,6 @@ <translation id="5045550434625856497">Mật khẩu sai</translation> <translation id="5051305769747448211">Hài kịch trực tiếp</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Để gửi tệp này bằng tính năng Chia sẻ lân cận, hãy giải phóng dung lượng (<ph name="DISK_SPACE_SIZE" />) trên thiết bị của bạn}other{Để gửi các tệp này bằng tính năng Chia sẻ lân cận, hãy giải phóng dung lượng (<ph name="DISK_SPACE_SIZE" />) trên thiết bị của bạn}}</translation> -<translation id="5056549851600133418">Tin bài dành cho bạn</translation> <translation id="5060483733937416656">Bạn đã chọn xác minh với Windows Hello trên các trang web sử dụng <ph name="PROVIDER_ORIGIN" />. Nhà cung cấp này có thể đã lưu trữ thông tin về phương thức thanh toán của bạn mà bạn có thể <ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Ý của bạn là <ph name="LOOKALIKE_DOMAIN" /> phải không?</translation> <translation id="5066056036849835175">Danh sách tài liệu đã in</translation> @@ -1702,6 +1698,7 @@ <translation id="5129534298163637277">Hộp thoại xác nhận</translation> <translation id="5135404736266831032">Quản lý địa chỉ...</translation> <translation id="5136841603454277753">Nhập mã chính xác</translation> +<translation id="5137761395480718572">Ứng dụng này yêu cầu cấp quyền cài đặt thông tin xác thực Wi-Fi. Sau khi thiết lập, <ph name="DEVICE_TYPE" /> sẽ tự động kết nối với các mạng Wi-Fi tham gia. Để xoá các thông tin xác thực này, hãy gỡ cài đặt ứng dụng. <ph name="LEARN_MORE" /></translation> <translation id="5138014172396933048">Thẻ ảo hiện chưa dùng được, vui lòng liên hệ với ngân hàng của bạn</translation> <translation id="5138227688689900538">Ẩn bớt</translation> <translation id="5145883236150621069">Mã lỗi có trong phản hồi chính sách</translation> @@ -1756,6 +1753,7 @@ <translation id="5273881944177595304">Ứng dụng web và công cụ trực tuyến</translation> <translation id="5274025349362408263">Sách và văn học</translation> <translation id="5279286380302340275">Quản lý tệp đã tải xuống</translation> +<translation id="5279453600310613955">Không, cảm ơn</translation> <translation id="5283044957620376778">B1</translation> <translation id="5284295735376057059">Thuộc tính tài liệu</translation> <translation id="528468243742722775">Kết thúc</translation> @@ -1794,6 +1792,7 @@ <translation id="5344579389779391559">Trang này có thể tìm cách tính phí bạn</translation> <translation id="5347645913823149105">Nút tùy chỉnh phông chữ trong Chrome, nhấn phím Enter để tùy chỉnh kích thước phông chữ và kiểu chữ trong Chrome</translation> <translation id="5355557959165512791">Bạn không thể truy cập vào <ph name="SITE" /> ngay bây giờ vì chứng chỉ của trang này đã bị thu hồi. Lỗi mạng và các cuộc tấn công mạng thường chỉ là tạm thời nên trang này có thể sẽ hoạt động lại sau.</translation> +<translation id="5356345925629253198">Bạn có thể sử dụng địa chỉ đã lưu trên các sản phẩm của Google. Địa chỉ này sẽ được lưu trong Tài khoản Google (<ph name="ACCOUNT" />) của bạn.</translation> <translation id="5357848622083956825">Thiết kế và nghệ thuật thị giác</translation> <translation id="536296301121032821">Không thể lưu trữ cài đặt chính sách</translation> <translation id="5363309033720083897">Cổng nối tiếp được quản trị viên của bạn cho phép</translation> @@ -1859,7 +1858,6 @@ <translation id="5541086400771735334">Hộp thư 7</translation> <translation id="5541546772353173584">Thêm email</translation> <translation id="5543722831081909240">180 độ</translation> -<translation id="5545756402275714221">Tin bài dành cho bạn</translation> <translation id="5551890439174915351">100 x 200 mm</translation> <translation id="5552137475244467770">Chrome kiểm tra định kỳ các mật khẩu của bạn so với những danh sách đã đăng trên Internet. Khi thực hiện việc này, mật khẩu và tên người dùng của bạn được mã hóa nên không ai có thể đọc được, kể cả Google.</translation> <translation id="5556459405103347317">Tải lại</translation> @@ -2141,14 +2139,12 @@ <translation id="6266934640124581640">Xanh mòng két nhạt</translation> <translation id="6272088941196661550">Tiếp tục hành trình của bạn để xem hoạt động liên quan trong nhật ký duyệt web trên Chrome</translation> <translation id="6272383483618007430">Google Update</translation> -<translation id="6276112860590028508">Các trang từ danh sách đọc của bạn sẽ xuất hiện tại đây</translation> <translation id="627746635834430766">Để thanh toán nhanh hơn vào lần tiếp theo, hãy lưu địa chỉ thanh toán và thẻ vào Tài khoản Google của bạn.</translation> <translation id="6279183038361895380">Nhấn |<ph name="ACCELERATOR" />| để hiển thị con trỏ của bạn</translation> <translation id="6280223929691119688">Không thể phân phối đến địa chỉ này. Chọn một địa chỉ khác.</translation> <translation id="6284292079994426700">26 x 38 inch</translation> <translation id="6285507000506177184">Nút quản lý tệp đã tải xuống trong Chrome, nhấn phím Enter để quản lý các tệp bạn đã tải xuống trong Chrome</translation> <translation id="6289939620939689042">Màu trang</translation> -<translation id="6290238015253830360">Bài viết đề xuất cho bạn sẽ xuất hiện ở đây</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">Đang lưu...</translation> @@ -2251,6 +2247,7 @@ <translation id="6529173248185917884">Cuộn thứ bảy</translation> <translation id="6529602333819889595">&Làm lại xóa</translation> <translation id="6535751101619004418">Đơn vị tiền tệ và ngoại hối</translation> +<translation id="6536221421038631327">Nếu bạn xoá gói thuê bao Passpoint khỏi <ph name="DEVICE_TYPE" />, các mạng liên kết cũng sẽ bị xoá. Hãy liên hệ với "<ph name="FRIENDLY_NAME" />" nếu bạn muốn thực hiện các thay đổi đối với gói thuê bao. <ph name="LEARN_MORE" /></translation> <translation id="6540534463546766581">Quỹ tương hỗ</translation> <translation id="6545864417968258051">Quét tìm Bluetooth</translation> <translation id="6547208576736763147">Đục 2 lỗ bên trái</translation> @@ -2748,7 +2745,6 @@ <translation id="7696089921647603491">Nhạc rock cổ điển và nhạc xưa</translation> <translation id="769721561045429135">Bạn hiện có các thẻ chỉ dùng được trên thiết bị này. Nhấp vào Tiếp tục để xem lại các thẻ.</translation> <translation id="7698864304447945242">Cập nhật Dịch vụ Google Play cho Thực tế tăng cường?</translation> -<translation id="7699293099605015246">Không có bài viết nào ngay lúc này</translation> <translation id="7701040980221191251">Không có</translation> <translation id="7701544340847569275">Đã cập nhật xong nhưng bị lỗi</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Tiếp tục truy cập <ph name="SITE" /> (không an toàn)<ph name="END_LINK" /></translation> @@ -3348,6 +3344,7 @@ <translation id="9219103736887031265">Hình ảnh</translation> <translation id="922152298093051471">Tuỳ chỉnh Chrome</translation> <translation id="933712198907837967">Diners Club</translation> +<translation id="934634059306213385">Cho phép ứng dụng <ph name="APP_NAME" /> thiết lập mạng Wi-Fi?</translation> <translation id="936602727769022409">Bạn có thể mất quyền truy cập vào Tài khoản Google của mình. Chromium khuyên bạn nên đổi mật khẩu ngay bây giờ. Bạn sẽ được yêu cầu đăng nhập.</translation> <translation id="937457230470581909">Sở thú, thuỷ cung và khu bảo tồn</translation> <translation id="937804173274050966"><ph name="BEGIN_BOLD" />Loại dữ liệu được sử dụng:<ph name="END_BOLD" /> Chủ đề quảng cáo được xác định dựa trên nhật ký duyệt web gần đây của bạn, một danh sách các trang web bạn từng truy cập bằng Chrome trên thiết bị này.</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb index 169348f..660a127 100644 --- a/components/strings/components_strings_zh-CN.xtb +++ b/components/strings/components_strings_zh-CN.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">您在一个不受贵单位管理的网站上输入了您的密码。为了保护您的帐号,请不要在其他应用和网站上重复使用您的密码。</translation> <translation id="1257553931232494454">缩放级别</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />,依次按 Tab 键和 Enter 键即可管理您的 Chrome 设置</translation> -<translation id="1263231323834454256">阅读清单</translation> <translation id="1264309058268477500">备用</translation> <translation id="1264974993859112054">体育</translation> <translation id="1266469291454105242">设备解锁</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">纸匣 8</translation> <translation id="1530707389502320859">您刚才尝试访问的网站貌似为虚假网站。攻击者有时会对网址做些令人难以发现的细微更改来仿冒网站。</translation> <translation id="1532118530259321453">此网页显示</translation> -<translation id="153384715582417236">暂无新内容</translation> <translation id="1536390784834419204">翻译网页</translation> <translation id="1539840569003678498">报告发送时间:</translation> <translation id="1549470594296187301">必须启用 JavaScript 才能使用此功能。</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">您的浏览器受管理</translation> <translation id="1746113442205726301">图片沿 Y 轴位移</translation> <translation id="1746531169546376413">0 度</translation> -<translation id="17513872634828108">目前打开的标签页</translation> <translation id="1752021286346845558">信箱 8</translation> <translation id="1753068535428855445">约会与交友</translation> <translation id="1753706481035618306">页码</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />尝试运行 Windows 网络诊断<ph name="END_LINK" />。</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />详细了解 Chromium 中的无痕模式<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">您打开的标签页会显示在此处</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />,依次按 Tab 键和 Enter 键即可在您的 Google 帐号中管理自己的信息、隐私和安全</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />,可执行多种操作,按 Tab 键可循环浏览这些操作</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">群组</translation> <translation id="2576880857912732701">“管理安全设置”按钮,按 Enter 键即可在 Chrome 设置中管理您的安全浏览设置及其他设置</translation> <translation id="2586657967955657006">剪贴板</translation> -<translation id="2587730715158995865">来自<ph name="ARTICLE_PUBLISHER" />。阅读这篇报道以及其他 <ph name="OTHER_ARTICLE_COUNT" /> 篇报道。</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">快速 Web 查看:</translation> <translation id="2595719060046994702">此设备和帐号不由某个公司或其他组织管理。</translation> @@ -1660,7 +1655,6 @@ <translation id="5045550434625856497">密码不正确</translation> <translation id="5051305769747448211">相声/小品</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{若要使用“附近分享”功能发送这个文件,请先在设备上释放空间 (<ph name="DISK_SPACE_SIZE" />)}other{若要使用“附近分享”功能发送这些文件,请先在设备上释放空间 (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">为您推荐的文章</translation> <translation id="5060483733937416656">您已选择在使用 <ph name="PROVIDER_ORIGIN" /> 的网站上通过 Windows Hello 来验证身份。此提供商可能已存储您的付款方式信息,不过您可以<ph name="LINK_TEXT" />相应信息。</translation> <translation id="5061227663725596739">您是不是要前往 <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">打印记录</translation> @@ -1857,7 +1851,6 @@ <translation id="5541086400771735334">信箱 7</translation> <translation id="5541546772353173584">添加电子邮件地址</translation> <translation id="5543722831081909240">180 度</translation> -<translation id="5545756402275714221">为您推荐的文章</translation> <translation id="5551890439174915351">100 x 200 毫米</translation> <translation id="5552137475244467770">Chrome 会定期检查您的密码是否已被列在网上发布的外泄密码列表内。当 Chrome 进行这项检查时,您的密码和用户名都会被加密,所以绝不会被任何人员/任何一方(包括 Google)读取。</translation> <translation id="5556459405103347317">重新加载</translation> @@ -2138,14 +2131,12 @@ <translation id="6266934640124581640">浅青色</translation> <translation id="6272088941196661550">继续您的历程,以查看您的 Chrome 历史记录中的相关活动记录</translation> <translation id="6272383483618007430">Google 更新</translation> -<translation id="6276112860590028508">您的阅读清单中的网页会显示在此处</translation> <translation id="627746635834430766">若想在下次购物时更快捷地付款,请将您的付款卡信息和帐单邮寄地址保存到您的 Google 帐号中。</translation> <translation id="6279183038361895380">按 |<ph name="ACCELERATOR" />| 可显示鼠标光标</translation> <translation id="6280223929691119688">无法递送到此地址。请另选一个地址。</translation> <translation id="6284292079994426700">26 x 38 英寸</translation> <translation id="6285507000506177184">“管理 Chrome 中的下载内容”按钮,按 Enter 键即可管理您已在 Chrome 中下载的文件</translation> <translation id="6289939620939689042">页面颜色</translation> -<translation id="6290238015253830360">为您推荐的文章会显示在此处</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">正在保存…</translation> @@ -2745,7 +2736,6 @@ <translation id="7696089921647603491">经典摇滚与老歌</translation> <translation id="769721561045429135">此刻,您有一些卡只能在这部设备上使用。点击“继续”即可查看这些卡。</translation> <translation id="7698864304447945242">更新“面向 AR 的 Google Play 服务”?</translation> -<translation id="7699293099605015246">目前没有文章可显示</translation> <translation id="7701040980221191251">无</translation> <translation id="7701544340847569275">更新已完成,但存在错误</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />继续前往<ph name="SITE" />(不安全)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_zh-HK.xtb b/components/strings/components_strings_zh-HK.xtb index ed3b03d..e542f891 100644 --- a/components/strings/components_strings_zh-HK.xtb +++ b/components/strings/components_strings_zh-HK.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">您輸入密碼的網站並非由您的機構管理。為保護您的帳戶,請勿在其他應用程式和網站上重用密碼。</translation> <translation id="1257553931232494454">縮放等級</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以管理 Chrome 設定</translation> -<translation id="1263231323834454256">閱讀清單</translation> <translation id="1264309058268477500">替用匣</translation> <translation id="1264974993859112054">運動</translation> <translation id="1266469291454105242">裝置解鎖</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">紙匣 8</translation> <translation id="1530707389502320859">您剛才嘗試前往的網站可能是假網站。攻擊者有時會在網址中加入難以辨識的細微變更來仿冒網站。</translation> <translation id="1532118530259321453">此網頁顯示:</translation> -<translation id="153384715582417236">暫時沒有其他項目</translation> <translation id="1536390784834419204">翻譯網頁</translation> <translation id="1539840569003678498">報告傳送時間:</translation> <translation id="1549470594296187301">必須啟用 JavaScript 才能使用此功能。</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">您的瀏覽器受管理</translation> <translation id="1746113442205726301">圖片 Y 軸移動</translation> <translation id="1746531169546376413">0 度</translation> -<translation id="17513872634828108">開啟分頁</translation> <translation id="1752021286346845558">出紙槽 8</translation> <translation id="1753068535428855445">約會和交友</translation> <translation id="1753706481035618306">頁碼</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />嘗試執行 Windows 網絡診斷<ph name="END_LINK" />。</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />進一步瞭解 Chromium 無痕模式<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">您最近開啟的分頁會在這裡顯示</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />,㩒一下 Tab 鍵,然後㩒一下 Enter 鍵就可以喺 Google 帳戶度管理你嘅資料、私隱權同埋安全設定</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />,可以進行幾種動作,㩒 Tab 鍵就可以跟次序轉換唔同嘅動作</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">群組</translation> <translation id="2576880857912732701">管理安全設定按鈕,㩒一下 Enter 鍵就可以喺 Chrome 設定度管理安全瀏覽功能之類嘅功能</translation> <translation id="2586657967955657006">剪貼簿</translation> -<translation id="2587730715158995865">來自「<ph name="ARTICLE_PUBLISHER" />」。閱讀這篇和另外 <ph name="OTHER_ARTICLE_COUNT" /> 篇報導。</translation> <translation id="2587841377698384444">目錄 API 識別碼:</translation> <translation id="2594318783181750337">快速網頁檢視:</translation> <translation id="2595719060046994702">此裝置和帳戶未受任何公司或其他機構管理。</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">密碼不正確</translation> <translation id="5051305769747448211">實況喜劇</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{如要使用「咫尺共享」傳送此檔案,請在裝置上騰出空間 (<ph name="DISK_SPACE_SIZE" />)}other{如要使用「咫尺共享」傳送這些檔案,請在裝置上騰出空間 (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">為您推薦的文章</translation> <translation id="5060483733937416656">您已選擇透過 Windows Hello 在使用 <ph name="PROVIDER_ORIGIN" /> 的網站上進行驗證。此供應商可能已儲存您的付款方法相關資料,您可以 <ph name="LINK_TEXT" />。</translation> <translation id="5061227663725596739">您是不是要前往 <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">列印記錄</translation> @@ -1864,7 +1858,6 @@ <translation id="5541086400771735334">出紙槽 7</translation> <translation id="5541546772353173584">新增電郵地址</translation> <translation id="5543722831081909240">180 度</translation> -<translation id="5545756402275714221">為您推薦的文章</translation> <translation id="5551890439174915351">100 x 200 毫米</translation> <translation id="5552137475244467770">Chrome 會定期將您的密碼與網上發佈的清單互相核對。核對時,您的密碼和使用者名稱將會加密,任何人 (包括 Google) 均無法讀取。</translation> <translation id="5556459405103347317">重新載入</translation> @@ -2146,14 +2139,12 @@ <translation id="6266934640124581640">淺藍綠色</translation> <translation id="6272088941196661550">恢復瀏覽過程以查看 Chrome 記錄中的相關活動</translation> <translation id="6272383483618007430">Google 更新</translation> -<translation id="6276112860590028508">您的閱讀清單中的網頁將會在這裡顯示</translation> <translation id="627746635834430766">只要將此付款卡和帳單地址儲存至您的 Google 帳戶,下次即可更快完成付款程序。</translation> <translation id="6279183038361895380">按下 |<ph name="ACCELERATOR" />| 即可顯示游標</translation> <translation id="6280223929691119688">無法送貨至此地址,請選取其他地址。</translation> <translation id="6284292079994426700">26 x 38 吋</translation> <translation id="6285507000506177184">管理 Chrome 嘅下載項目按鈕,㩒一下 Enter 鍵就可以管理您喺 Chrome 度下載嘅檔案</translation> <translation id="6289939620939689042">頁面顏色</translation> -<translation id="6290238015253830360">為您推薦的文章會在這裡顯示</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">正在儲存...</translation> @@ -2754,7 +2745,6 @@ <translation id="7696089921647603491">經典搖滾和懷舊音樂</translation> <translation id="769721561045429135">目前您有幾張卡只可在此裝置上使用。按一下 [繼續] 即可查看這些卡。</translation> <translation id="7698864304447945242">要更新「Google Play 服務 (AR)」嗎?</translation> -<translation id="7699293099605015246">目前無法顯示文章</translation> <translation id="7701040980221191251">沒有</translation> <translation id="7701544340847569275">更新完成但有錯誤</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />繼續前往 <ph name="SITE" /> 網站 (不安全) <ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb index 03d7f74..1e1e3a1 100644 --- a/components/strings/components_strings_zh-TW.xtb +++ b/components/strings/components_strings_zh-TW.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">你在不是由貴機構管理的網站上輸入了你的密碼。為確保帳戶安全,請勿在其他應用程式和網站上重複使用你的密碼。</translation> <translation id="1257553931232494454">縮放等級</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />;按下 Tab 鍵再按下 Enter 鍵即可管理 Chrome 設定</translation> -<translation id="1263231323834454256">閱讀清單</translation> <translation id="1264309058268477500">替用匣</translation> <translation id="1264974993859112054">運動資訊</translation> <translation id="1266469291454105242">裝置解鎖</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">紙匣 8</translation> <translation id="1530707389502320859">你剛才嘗試造訪的網站可能是假網站。攻擊者有時會在網址中加入難以辨識的細微變更來仿冒網站。</translation> <translation id="1532118530259321453">這個網頁顯示</translation> -<translation id="153384715582417236">暫無內容</translation> <translation id="1536390784834419204">翻譯網頁</translation> <translation id="1539840569003678498">回報時間:</translation> <translation id="1549470594296187301">您必須啟用 JavaScript 才能使用這項功能。</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">你的瀏覽器受到管理</translation> <translation id="1746113442205726301">圖片 Y 批次</translation> <translation id="1746531169546376413">0 度</translation> -<translation id="17513872634828108">開啟的分頁</translation> <translation id="1752021286346845558">出紙槽 8</translation> <translation id="1753068535428855445">約會交友</translation> <translation id="1753706481035618306">頁碼</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />嘗試執行 Windows 網路診斷<ph name="END_LINK" />。</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />進一步瞭解 Chromium 無痕模式<ph name="END_LINK" /></translation> <translation id="1778646502362731194">JIS B0</translation> -<translation id="1787142507584202372">這裡會顯示你最近開啟的分頁</translation> <translation id="1791429645902722292">Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />;按下 Tab 鍵再按下 Enter 鍵即可管理 Google 帳戶的資訊、隱私權和安全性</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />,可執行多個動作,按下 Tab 鍵即可切換不同的動作</translation> @@ -671,7 +667,6 @@ <translation id="257674075312929031">群組</translation> <translation id="2576880857912732701">[管理安全性設定] 按鈕;按下 Enter 鍵即可在 Chrome 設定中管理安全瀏覽等功能</translation> <translation id="2586657967955657006">剪貼簿</translation> -<translation id="2587730715158995865">出自「<ph name="ARTICLE_PUBLISHER" />」。閱讀這篇報導和另外 <ph name="OTHER_ARTICLE_COUNT" /> 篇報導。</translation> <translation id="2587841377698384444">Directory API ID:</translation> <translation id="2594318783181750337">快速網頁檢視:</translation> <translation id="2595719060046994702">這個裝置和帳戶未受到任何公司或其他機構管理。</translation> @@ -1665,7 +1660,6 @@ <translation id="5045550434625856497">密碼不正確</translation> <translation id="5051305769747448211">實況喜劇</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{如要使用鄰近分享功能傳送這個檔案,請釋出裝置的儲存空間 (<ph name="DISK_SPACE_SIZE" />)}other{如要使用鄰近分享功能傳送這些檔案,請釋出裝置的儲存空間 (<ph name="DISK_SPACE_SIZE" />)}}</translation> -<translation id="5056549851600133418">為你推薦的文章</translation> <translation id="5060483733937416656">你已選擇使用 Windows Hello 在使用 <ph name="PROVIDER_ORIGIN" /> 的網站上進行驗證。這個供應商可能已儲存你的付款方式相關資訊,你可以 <ph name="LINK_TEXT" />。</translation> <translation id="5061227663725596739">你是不是要前往 <ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">列印記錄</translation> @@ -1864,7 +1858,6 @@ <translation id="5541086400771735334">出紙槽 7</translation> <translation id="5541546772353173584">新增電子郵件地址</translation> <translation id="5543722831081909240">180 度</translation> -<translation id="5545756402275714221">為你推薦的報導</translation> <translation id="5551890439174915351">100 x 200 公釐</translation> <translation id="5552137475244467770">Chrome 會定期將你的密碼與網路上發布的清單進行比對。在比對過程中,你的密碼和使用者名稱會經過加密,任何人 (包括 Google) 都無法讀取。</translation> <translation id="5556459405103347317">重新載入</translation> @@ -2146,14 +2139,12 @@ <translation id="6266934640124581640">淺藍綠色</translation> <translation id="6272088941196661550">繼續瀏覽歷程即可查看 Chrome 歷史記錄中的相關活動</translation> <translation id="6272383483618007430">Google 更新</translation> -<translation id="6276112860590028508">你的閱讀清單中的頁面會顯示在這裡</translation> <translation id="627746635834430766">只要將卡片資訊與帳單地址儲存到你的 Google 帳戶中,下次即可更快完成付款程序。</translation> <translation id="6279183038361895380">按下 |<ph name="ACCELERATOR" />| 即可顯示游標</translation> <translation id="6280223929691119688">快遞無法送貨到這個地址,請改用其他地址。</translation> <translation id="6284292079994426700">26 x 38 吋</translation> <translation id="6285507000506177184">[管理 Chrome 下載內容] 按鈕;按下 Enter 鍵即可管理在 Chrome 中下載的檔案</translation> <translation id="6289939620939689042">頁面顏色</translation> -<translation id="6290238015253830360">這裡會顯示推薦給你的文章</translation> <translation id="6293309776179964942">JIS B5</translation> <translation id="6295618774959045776">CVC:</translation> <translation id="6295855836753816081">儲存中...</translation> @@ -2754,7 +2745,6 @@ <translation id="7696089921647603491">經典搖滾與懷舊老歌</translation> <translation id="769721561045429135">目前你有某些卡片只能在這部裝置上使用。按一下 [繼續] 即可查看卡片。</translation> <translation id="7698864304447945242">更新「Google Play 服務 - AR 適用」?</translation> -<translation id="7699293099605015246">目前無法顯示文章</translation> <translation id="7701040980221191251">無</translation> <translation id="7701544340847569275">更新完成但有錯誤</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />繼續前往 <ph name="SITE" /> 網站 (不安全)<ph name="END_LINK" /></translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 6a7d579..2003991 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -120,7 +120,6 @@ <translation id="1257286744552378071">Ufake iphasiwedi yakho kusayithi elingaphethwe inhlangano yakho. Ukuze uvikele i-akhawunti yakho, ungaphindi usebenzise iphasiwedi yakho kwezinye izinhlelo zokusebenza namasayithi.</translation> <translation id="1257553931232494454">amaleveli okusondeza</translation> <translation id="1262388120645841613"><ph name="MANAGE_CHROME_SETTINGS_FOCUSED_FRIENDLY_MATCH_TEXT" />, Cindezela u-Tab no-Enter ukuze uphathe amasethingi wakho we-Chrome</translation> -<translation id="1263231323834454256">Uhlu lokufunda</translation> <translation id="1264309058268477500">Okunye</translation> <translation id="1264974993859112054">Ezemidlalo</translation> <translation id="1266469291454105242">Ukuvula idivayisi</translation> @@ -251,7 +250,6 @@ <translation id="1529789484829130889">Ithileyi elingu-8</translation> <translation id="1530707389502320859">Isayithi osanda kuzama ukulivakashela libonakala liyimbumbulu. Abahlaseli kwesinye isikhathi balingisa amasayithi ngokwenza ushintsho oluncane, olubonakala kanzima ku-URL.</translation> <translation id="1532118530259321453">Leli khasi lithi</translation> -<translation id="153384715582417236">Yikho konke lokho okwamanje</translation> <translation id="1536390784834419204">Humusha ikhasi</translation> <translation id="1539840569003678498">Umbiko uthunyelwe:</translation> <translation id="1549470594296187301">I-JavaScript kumele inikwe amandla ukuze isebenzise lesi sici.</translation> @@ -348,7 +346,6 @@ <translation id="1745880797583122200">Isiphequluli sakho siphethwe</translation> <translation id="1746113442205726301">U-shift wesithombe esingu-Y</translation> <translation id="1746531169546376413">ama-degree angu-0</translation> -<translation id="17513872634828108">Vula amathebhu</translation> <translation id="1752021286346845558">Ibhokisi lemeyili elingu-8</translation> <translation id="1753068535428855445">Ukuthandana nobuntu</translation> <translation id="1753706481035618306">Inombolo yekhasi</translation> @@ -360,7 +357,6 @@ <translation id="1768211456781949159"><ph name="BEGIN_LINK" />Zama ukusebenzisa ukuxilongwa kwenethiwekhi ye-Windows<ph name="END_LINK" />.</translation> <translation id="1774592222195216949"><ph name="BEGIN_LINK" />Funda kabanzi nge-Incognito ku-Chromium<ph name="END_LINK" /></translation> <translation id="1778646502362731194">I-JIS B0</translation> -<translation id="1787142507584202372">Amathebhu akho avulekile abonakala lapha</translation> <translation id="1791429645902722292">I-Google Smart Lock</translation> <translation id="1791820510173628507"><ph name="MANAGE_GOOGLE_ACCOUNT_FOCUSED_FRIENDLY_MATCH_TEXT" />, cindezela u-Tab bese u-Enter ukuze uphathe ulwazi lwakho, ubumfihlo, nokuvikeleka Kwi-akhawunti yakho ye-Google</translation> <translation id="1798447301915465742"><ph name="MULTIPLE_ACTIONS_FOCUSED_FRIENDLY_MATCH_TEXT" />, izenzo eziningi ziyatholakala, cindezela Ithebhu ukuzibona</translation> @@ -670,7 +666,6 @@ <translation id="257674075312929031">Iqembu</translation> <translation id="2576880857912732701">Inkinobho yokuphatha amasethingi wokuvikeleka, cindezela u-Enter ukuphatha Ukuphequlula kwakho okuphephile nokuningi kumasethingi we-Chrome</translation> <translation id="2586657967955657006">Ibhodi lokumanathisela</translation> -<translation id="2587730715158995865">Kusukela ku-<ph name="ARTICLE_PUBLISHER" />. Funda lokhu nezinye izindaba ezingu-<ph name="OTHER_ARTICLE_COUNT" />.</translation> <translation id="2587841377698384444">I-API ID yomhlahlandlela:</translation> <translation id="2594318783181750337">Ukubuka kwewebhu okusheshayo:</translation> <translation id="2595719060046994702">Le divayisi ne-akhawunti awaphethwe inkampani noma enye inhlangano.</translation> @@ -1661,7 +1656,6 @@ <translation id="5045550434625856497">Iphasiwedi engalungile</translation> <translation id="5051305769747448211">Ihlaya elibukhoma</translation> <translation id="5056425809654826431">{NUM_FILES,plural, =1{Ukuze uthumele leli fayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}one{Ukuze uthumele lamafayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}other{Ukuze uthumele lamafayela usebenzisa i-Nearby Share, khulula isikhala (<ph name="DISK_SPACE_SIZE" />) kudivayisi yakho}}</translation> -<translation id="5056549851600133418">Ama-athikili akho</translation> <translation id="5060483733937416656">Ukhethe ukuqinisekisa nge-Windows Hello kumawebhusayithi asebenzisa i-<ph name="PROVIDER_ORIGIN" />. Lo mhlinzeki kungenzeka ukuthi ulondoloze ulwazi olumayelana nendlela yakho yokukhokha, ongakwazi uku-<ph name="LINK_TEXT" />.</translation> <translation id="5061227663725596739">Ingabe ubukade usho i-<ph name="LOOKALIKE_DOMAIN" />?</translation> <translation id="5066056036849835175">Umlando wokuphrinta</translation> @@ -1858,7 +1852,6 @@ <translation id="5541086400771735334">Ibhokisi lemeyili elingu-7</translation> <translation id="5541546772353173584">Engeza i-imeyili</translation> <translation id="5543722831081909240">ama-degree angu-180</translation> -<translation id="5545756402275714221">Ama-athikili akho</translation> <translation id="5551890439174915351">U-100 x 200 mm</translation> <translation id="5552137475244467770">I-Chrome ngezikhathi ezithile ihlola amaphasiwedi akho ngokuwaqhathanisa nohlu olushicilelwe ku-inthanethi. Uma kwenziwa lokhu, amaphasiwedi akho namagama abasebenzisi abethelwe, ngakho-ke awakwazi ukufundwa inoma ubani, okufaka i-Google.</translation> <translation id="5556459405103347317">Phinda ulayishe</translation> @@ -2140,14 +2133,12 @@ <translation id="6266934640124581640">I-teal ekhanyayo</translation> <translation id="6272088941196661550">Qhubeka nohambo ukuze ubone umsebenzi ohambisanayo kumlando wakho we-Chrome</translation> <translation id="6272383483618007430">Isibuyekezo se-Google</translation> -<translation id="6276112860590028508">Amakhasi kusukela kuhlu lwakho lokufunda avela lapha</translation> <translation id="627746635834430766">Khokha ngokushesha ngesikhathi esizayo, londoloza ikheli lakho lokukhokha ku-akhawunti yakho ye-Google.</translation> <translation id="6279183038361895380">Cindezela u-|<ph name="ACCELERATOR" />| ukuze ubonise ikhesa lakho</translation> <translation id="6280223929691119688">Ayikwazi ukuletha kuleli kheli. Khetha ikheli elihlukile.</translation> <translation id="6284292079994426700">U-26 x 38 phakathi</translation> <translation id="6285507000506177184">Phatha okudawunilodiwe kwinkinobho ye-Chrome, cindezela u-Enter ukuphatha amafayela owadawunilodile ku-Chrome</translation> <translation id="6289939620939689042">Umbala Wekhasi</translation> -<translation id="6290238015253830360">Ama-athikili akho aphakanyisiwe avela lapha</translation> <translation id="6293309776179964942">I-JIS B5</translation> <translation id="6295618774959045776">I-CVC:</translation> <translation id="6295855836753816081">Iyalondoloza...</translation> @@ -2747,7 +2738,6 @@ <translation id="7696089921647603491">I-rock yakudala nezakudala</translation> <translation id="769721561045429135">Khona manje, unamakhadi angasetshenziswa kuphela kule divayisi. Chofoza okuthi Qhubeka ukuze ubuyekeze amakhadi.</translation> <translation id="7698864304447945242">Ubuyekeza i-Google Play Services for AR?</translation> -<translation id="7699293099605015246">Ama-athikili awatholakali okwamanje</translation> <translation id="7701040980221191251">Lutho</translation> <translation id="7701544340847569275">Ukubuyekeza kuqedwe ngamaphutha</translation> <translation id="7704050614460855821"><ph name="BEGIN_LINK" />Qhubekala ku-<ph name="SITE" /> (akuphephile)<ph name="END_LINK" /></translation>
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc index 608dd86..5f8dc05d 100644 --- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc +++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -520,9 +520,10 @@ // Populate new remote specifics to bridge, which is actually still // |not_rotated_specifics|. - *entity_data.specifics.mutable_nigori() = not_rotated_specifics; + EntityData new_entity_data; + *new_entity_data.specifics.mutable_nigori() = not_rotated_specifics; EXPECT_CALL(*processor(), Put(HasKeystoreNigori())); - EXPECT_THAT(bridge()->ApplySyncChanges(std::move(entity_data)), + EXPECT_THAT(bridge()->ApplySyncChanges(std::move(new_entity_data)), Eq(absl::nullopt)); // Mimic commit completion. @@ -814,9 +815,9 @@ ASSERT_TRUE(passphrase_cryptographer->Encrypt( old_key_key_bag.ToProto(), specifics.mutable_encryption_keybag())); EntityData corrupted_entity_data; - *entity_data.specifics.mutable_nigori() = specifics; + *corrupted_entity_data.specifics.mutable_nigori() = specifics; - EXPECT_THAT(bridge()->ApplySyncChanges(std::move(entity_data)), + EXPECT_THAT(bridge()->ApplySyncChanges(std::move(corrupted_entity_data)), Ne(absl::nullopt)); }
diff --git a/components/sync/test/bookmark_entity_builder.cc b/components/sync/test/bookmark_entity_builder.cc index a7ef18dd..79ef46b 100644 --- a/components/sync/test/bookmark_entity_builder.cc +++ b/components/sync/test/bookmark_entity_builder.cc
@@ -120,7 +120,7 @@ parent_id_ = LoopbackServerEntity::CreateId(syncer::BOOKMARKS, "bookmark_bar"); parent_guid_ = base::Uuid::ParseLowercase( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); } if (bookmark_generation_ >= BookmarkGeneration::kValidGuidAndLegacyTitle) {
diff --git a/components/sync_bookmarks/bookmark_local_changes_builder.cc b/components/sync_bookmarks/bookmark_local_changes_builder.cc index 0b109b2..e8feedd 100644 --- a/components/sync_bookmarks/bookmark_local_changes_builder.cc +++ b/components/sync_bookmarks/bookmark_local_changes_builder.cc
@@ -61,7 +61,7 @@ data->client_tag_hash == syncer::ClientTagHash::FromUnhashed( syncer::BOOKMARKS, - entity->bookmark_node()->guid().AsLowercaseString())); + entity->bookmark_node()->uuid().AsLowercaseString())); if (!metadata.is_deleted()) { const bookmarks::BookmarkNode* node = entity->bookmark_node(); @@ -80,7 +80,7 @@ DCHECK(node); DCHECK_EQ(syncer::ClientTagHash::FromUnhashed( - syncer::BOOKMARKS, node->guid().AsLowercaseString()), + syncer::BOOKMARKS, node->uuid().AsLowercaseString()), syncer::ClientTagHash::FromHashed(metadata.client_tag_hash())); const bookmarks::BookmarkNode* parent = node->parent();
diff --git a/components/sync_bookmarks/bookmark_model_merger.cc b/components/sync_bookmarks/bookmark_model_merger.cc index 3d2c2dbc..097ea442 100644 --- a/components/sync_bookmarks/bookmark_model_merger.cc +++ b/components/sync_bookmarks/bookmark_model_merger.cc
@@ -9,7 +9,6 @@ #include <utility> #include "base/containers/contains.h" -#include "base/guid.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/ranges/algorithm.h" @@ -17,6 +16,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/sync/base/hash_util.h" @@ -64,16 +64,16 @@ // The value must be a list since there is a container using pointers to its // elements. -using UpdatesPerParentGUID = - std::unordered_map<base::GUID, +using UpdatesPerParentUuid = + std::unordered_map<base::Uuid, std::list<syncer::UpdateResponseData>, - base::GUIDHash>; + base::UuidHash>; // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. When adding values, be certain to also // update the corresponding definition in enums.xml and the -// ExpectedBookmarksGUIDDuplicates in unittests. -enum class BookmarksGUIDDuplicates { +// ExpectedBookmarksUuidDuplicates in unittests. +enum class BookmarksUuidDuplicates { // Both entities are URLs with matching URLs in specifics. Entities may have // different titles or parents. kMatchingUrls = 0, @@ -103,7 +103,7 @@ kInvalidUniquePosition = 2, // Parent entity not found in server. kMissingParentEntity = 4, - // The bookmark's GUID did not match the originator client item ID. + // The bookmark's UUID did not match the originator client item ID. kUnexpectedGuid = 9, // Parent is not a folder. kParentNotFolder = 10, @@ -136,7 +136,7 @@ DCHECK(!server_defined_unique_tag.empty()); // WARNING: Keep this logic consistent with the analogous in - // GetPermanentFolderGUIDForServerDefinedUniqueTag(). + // GetPermanentFolderUuidForServerDefinedUniqueTag(). if (server_defined_unique_tag == kBookmarkBarTag) { return bookmark_model->bookmark_bar_node(); } @@ -150,29 +150,29 @@ return nullptr; } -// Gets the bookmark GUID corresponding to a permanent folder identified by -// |served_defined_unique_tag| or an invalid GUID if the tag is unknown. +// Gets the bookmark UUID corresponding to a permanent folder identified by +// |served_defined_unique_tag| or an invalid UUID if the tag is unknown. // |server_defined_unique_tag| must not be empty. -base::GUID GetPermanentFolderGUIDForServerDefinedUniqueTag( +base::Uuid GetPermanentFolderUuidForServerDefinedUniqueTag( const std::string& server_defined_unique_tag) { DCHECK(!server_defined_unique_tag.empty()); // WARNING: Keep this logic consistent with the analogous in // GetPermanentFolderForServerDefinedUniqueTag(). if (server_defined_unique_tag == kBookmarkBarTag) { - return base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + return base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); } if (server_defined_unique_tag == kOtherBookmarksTag) { - return base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kOtherBookmarksNodeGuid); + return base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kOtherBookmarksNodeUuid); } if (server_defined_unique_tag == kMobileBookmarksTag) { - return base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kMobileBookmarksNodeGuid); + return base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kMobileBookmarksNodeUuid); } - return base::GUID(); + return base::Uuid(); } std::string LegacyCanonicalizedTitleFromSpecifics( @@ -215,12 +215,12 @@ return true; } -BookmarksGUIDDuplicates MatchBookmarksGUIDDuplicates( +BookmarksUuidDuplicates MatchBookmarksUuidDuplicates( const UpdateResponseData& update, const UpdateResponseData& duplicate_update) { if (update.entity.specifics.bookmark().type() != duplicate_update.entity.specifics.bookmark().type()) { - return BookmarksGUIDDuplicates::kDifferentTypes; + return BookmarksUuidDuplicates::kDifferentTypes; } switch (update.entity.specifics.bookmark().type()) { @@ -231,8 +231,8 @@ const bool matching_urls = update.entity.specifics.bookmark().url() == duplicate_update.entity.specifics.bookmark().url(); - return matching_urls ? BookmarksGUIDDuplicates::kMatchingUrls - : BookmarksGUIDDuplicates::kDifferentUrls; + return matching_urls ? BookmarksUuidDuplicates::kMatchingUrls + : BookmarksUuidDuplicates::kDifferentUrls; } case sync_pb::BookmarkSpecifics::FOLDER: { // Both entities are folders. @@ -241,18 +241,18 @@ update.entity.specifics.bookmark()) == LegacyCanonicalizedTitleFromSpecifics( duplicate_update.entity.specifics.bookmark()); - return matching_titles ? BookmarksGUIDDuplicates::kMatchingFolders - : BookmarksGUIDDuplicates::kDifferentFolders; + return matching_titles ? BookmarksUuidDuplicates::kMatchingFolders + : BookmarksUuidDuplicates::kDifferentFolders; } } NOTREACHED(); - return BookmarksGUIDDuplicates(); + return BookmarksUuidDuplicates(); } // Returns true the |next_update| is selected to keep and the |previous_update| // should be removed. False is returned otherwise. |next_update| and -// |previous_update| must have the same GUID. +// |previous_update| must have the same UUID. bool CompareDuplicateUpdates(const UpdateResponseData& next_update, const UpdateResponseData& previous_update) { DCHECK_EQ(next_update.entity.specifics.bookmark().guid(), @@ -271,46 +271,46 @@ previous_update.entity.creation_time; } -void DeduplicateValidUpdatesByGUID( - UpdatesPerParentGUID* updates_per_parent_guid) { - DCHECK(updates_per_parent_guid); +void DeduplicateValidUpdatesByUuid( + UpdatesPerParentUuid* updates_per_parent_uuid) { + DCHECK(updates_per_parent_uuid); - std::unordered_map<base::GUID, std::list<UpdateResponseData>::iterator, - base::GUIDHash> - guid_to_update; + std::unordered_map<base::Uuid, std::list<UpdateResponseData>::iterator, + base::UuidHash> + uuid_to_update; - for (auto& [parent_guid, updates] : *updates_per_parent_guid) { + for (auto& [parent_uuid, updates] : *updates_per_parent_uuid) { auto updates_iter = updates.begin(); while (updates_iter != updates.end()) { const UpdateResponseData& update = *updates_iter; DCHECK(!update.entity.is_deleted()); DCHECK(update.entity.server_defined_unique_tag.empty()); - const base::GUID guid_in_specifics = - base::GUID::ParseLowercase(update.entity.specifics.bookmark().guid()); - DCHECK(guid_in_specifics.is_valid()); + const base::Uuid uuid_in_specifics = + base::Uuid::ParseLowercase(update.entity.specifics.bookmark().guid()); + DCHECK(uuid_in_specifics.is_valid()); auto [it, success] = - guid_to_update.emplace(guid_in_specifics, updates_iter); + uuid_to_update.emplace(uuid_in_specifics, updates_iter); if (success) { ++updates_iter; continue; } - const auto& [guid, previous_update_it] = *it; - DCHECK_EQ(guid_in_specifics.AsLowercaseString(), + const auto& [uuid, previous_update_it] = *it; + DCHECK_EQ(uuid_in_specifics.AsLowercaseString(), previous_update_it->entity.specifics.bookmark().guid()); - DLOG(ERROR) << "Duplicate guid for new sync ID " << update.entity.id + DLOG(ERROR) << "Duplicate uuid for new sync ID " << update.entity.id << " and original sync ID " << previous_update_it->entity.id; - const BookmarksGUIDDuplicates match_result = - MatchBookmarksGUIDDuplicates(update, *previous_update_it); + const BookmarksUuidDuplicates match_result = + MatchBookmarksUuidDuplicates(update, *previous_update_it); base::UmaHistogramEnumeration("Sync.BookmarksGUIDDuplicates", match_result); if (CompareDuplicateUpdates(/*next_update=*/update, /*previous_update=*/*previous_update_it)) { updates.erase(previous_update_it); - guid_to_update[guid_in_specifics] = updates_iter; + uuid_to_update[uuid_in_specifics] = updates_iter; ++updates_iter; } else { updates_iter = updates.erase(updates_iter); @@ -338,35 +338,35 @@ update_entity.client_tag_hash, update_entity.originator_cache_guid, update_entity.originator_client_item_id)) { - // Ignore updates with an unexpected GUID. - DLOG(ERROR) << "Remote update with unexpected GUID"; + // Ignore updates with an unexpected UUID. + DLOG(ERROR) << "Remote update with unexpected Uuid"; LogProblematicBookmark(RemoteBookmarkUpdateError::kUnexpectedGuid); return false; } return true; } -// Returns the GUID determined by a remote update, which may be an update for a +// Returns the UUID determined by a remote update, which may be an update for a // permanent folder or a regular bookmark node. -base::GUID GetGUIDForUpdate(const UpdateResponseData& update) { +base::Uuid GetUuidForUpdate(const UpdateResponseData& update) { if (!update.entity.server_defined_unique_tag.empty()) { - return GetPermanentFolderGUIDForServerDefinedUniqueTag( + return GetPermanentFolderUuidForServerDefinedUniqueTag( update.entity.server_defined_unique_tag); } DCHECK(IsValidUpdate(update)); - return base::GUID::ParseLowercase(update.entity.specifics.bookmark().guid()); + return base::Uuid::ParseLowercase(update.entity.specifics.bookmark().guid()); } struct GroupedUpdates { - // |updates_per_parent_guid| contains all valid updates grouped by their - // |parent_guid|. Permanent nodes and deletions are filtered out. Permanent + // |updates_per_parent_uuid| contains all valid updates grouped by their + // |parent_uuid|. Permanent nodes and deletions are filtered out. Permanent // nodes are stored in a dedicated list |permanent_node_updates|. - UpdatesPerParentGUID updates_per_parent_guid; + UpdatesPerParentUuid updates_per_parent_uuid; UpdateResponseDataList permanent_node_updates; }; -// Groups all valid updates by the GUID of their parent. Permanent nodes are +// Groups all valid updates by the UUID of their parent. Permanent nodes are // grouped in a dedicated |permanent_node_updates| list in a returned value. GroupedUpdates GroupValidUpdates(UpdateResponseDataList updates) { GroupedUpdates grouped_updates; @@ -395,11 +395,11 @@ } ++num_valid_updates; - const base::GUID parent_guid = base::GUID::ParseLowercase( + const base::Uuid parent_uuid = base::Uuid::ParseLowercase( update_entity.specifics.bookmark().parent_guid()); - DCHECK(parent_guid.is_valid()); + DCHECK(parent_uuid.is_valid()); - grouped_updates.updates_per_parent_guid[parent_guid].push_back( + grouped_updates.updates_per_parent_uuid[parent_uuid].push_back( std::move(update)); } @@ -433,23 +433,23 @@ BookmarkModelMerger::RemoteTreeNode::operator=( BookmarkModelMerger::RemoteTreeNode&&) = default; -void BookmarkModelMerger::RemoteTreeNode::EmplaceSelfAndDescendantsByGUID( - std::unordered_map<base::GUID, const RemoteTreeNode*, base::GUIDHash>* - guid_to_remote_node_map) const { - DCHECK(guid_to_remote_node_map); +void BookmarkModelMerger::RemoteTreeNode::EmplaceSelfAndDescendantsByUuid( + std::unordered_map<base::Uuid, const RemoteTreeNode*, base::UuidHash>* + uuid_to_remote_node_map) const { + DCHECK(uuid_to_remote_node_map); if (entity().server_defined_unique_tag.empty()) { - const base::GUID guid = - base::GUID::ParseLowercase(entity().specifics.bookmark().guid()); - DCHECK(guid.is_valid()); + const base::Uuid uuid = + base::Uuid::ParseLowercase(entity().specifics.bookmark().guid()); + DCHECK(uuid.is_valid()); - // Duplicate GUIDs have been sorted out before. - bool success = guid_to_remote_node_map->emplace(guid, this).second; + // Duplicate UUIDs have been sorted out before. + bool success = uuid_to_remote_node_map->emplace(uuid, this).second; DCHECK(success); } for (const RemoteTreeNode& child : children_) { - child.EmplaceSelfAndDescendantsByGUID(guid_to_remote_node_map); + child.EmplaceSelfAndDescendantsByUuid(uuid_to_remote_node_map); } } @@ -465,13 +465,13 @@ BookmarkModelMerger::RemoteTreeNode::BuildTree( UpdateResponseData update, size_t max_depth, - UpdatesPerParentGUID* updates_per_parent_guid) { - DCHECK(updates_per_parent_guid); + UpdatesPerParentUuid* updates_per_parent_uuid) { + DCHECK(updates_per_parent_uuid); DCHECK(!update.entity.server_defined_unique_tag.empty() || IsValidUpdate(update)); - // |guid| may be invalid for unsupported permanent nodes. - const base::GUID guid = GetGUIDForUpdate(update); + // |uuid| may be invalid for unsupported permanent nodes. + const base::Uuid uuid = GetUuidForUpdate(update); RemoteTreeNode node; node.update_ = std::move(update); @@ -484,15 +484,15 @@ return node; } - // Check to prevent creating empty lists in |updates_per_parent_guid| and + // Check to prevent creating empty lists in |updates_per_parent_uuid| and // unnecessary rehashing. - auto updates_per_parent_guid_iter = updates_per_parent_guid->find(guid); - if (updates_per_parent_guid_iter == updates_per_parent_guid->end()) { + auto updates_per_parent_uuid_iter = updates_per_parent_uuid->find(uuid); + if (updates_per_parent_uuid_iter == updates_per_parent_uuid->end()) { return node; } - DCHECK(!updates_per_parent_guid_iter->second.empty()); - DCHECK(guid.is_valid()); + DCHECK(!updates_per_parent_uuid_iter->second.empty()); + DCHECK(uuid.is_valid()); // Only folders may have descendants (ignore them otherwise). Treat // permanent nodes as folders explicitly. @@ -501,7 +501,7 @@ node.update_.entity.server_defined_unique_tag.empty()) { // Children of a non-folder are ignored. for (UpdateResponseData& child_update : - updates_per_parent_guid_iter->second) { + updates_per_parent_uuid_iter->second) { LogProblematicBookmark(RemoteBookmarkUpdateError::kParentNotFolder); // To avoid double-counting later for bucket |kMissingParentEntity|, // clear the update from the list as if it would have been moved. @@ -511,15 +511,15 @@ } // Populate descendants recursively. - node.children_.reserve(updates_per_parent_guid_iter->second.size()); + node.children_.reserve(updates_per_parent_uuid_iter->second.size()); for (UpdateResponseData& child_update : - updates_per_parent_guid_iter->second) { + updates_per_parent_uuid_iter->second) { DCHECK_EQ(child_update.entity.specifics.bookmark().parent_guid(), - guid.AsLowercaseString()); + uuid.AsLowercaseString()); DCHECK(IsValidBookmarkSpecifics(child_update.entity.specifics.bookmark())); node.children_.push_back(BuildTree(std::move(child_update), max_depth - 1, - updates_per_parent_guid)); + updates_per_parent_uuid)); } // Sort the children according to their unique position. @@ -538,7 +538,7 @@ bookmark_tracker_(bookmark_tracker), remote_updates_size_(updates.size()), remote_forest_(BuildRemoteForest(std::move(updates), bookmark_tracker)), - guid_to_match_map_( + uuid_to_match_map_( FindGuidMatchesOrReassignLocal(remote_forest_, bookmark_model_)) { DCHECK(bookmark_tracker_->IsEmpty()); DCHECK(favicon_service); @@ -559,17 +559,17 @@ // Algorithm description: // Match up the roots and recursively do the following: // * For each remote node for the current remote (sync) parent node, either - // find a local node with equal GUID anywhere throughout the tree or find + // find a local node with equal UUID anywhere throughout the tree or find // the best matching bookmark node under the corresponding local bookmark - // parent node using semantics. If the found node has the same GUID as a + // parent node using semantics. If the found node has the same UUID as a // different remote bookmark, we do not consider it a semantics match, as - // GUID matching takes precedence. If no matching node is found, create a + // UUID matching takes precedence. If no matching node is found, create a // new bookmark node in the same position as the corresponding remote node. // If a matching node is found, update the properties of it from the // corresponding remote node. // * When all children remote nodes are done, add the extra children bookmark // nodes to the remote (sync) parent node, unless they will be later matched - // by GUID. + // by UUID. // // The semantics best match algorithm uses folder title or bookmark title/url // to perform the primary match. If there are multiple match candidates it @@ -584,7 +584,7 @@ // Ignore unsupported permanent folders. if (!permanent_folder) { - DCHECK(!GetPermanentFolderGUIDForServerDefinedUniqueTag( + DCHECK(!GetPermanentFolderUuidForServerDefinedUniqueTag( server_defined_unique_tag) .is_valid()); LogProblematicBookmark( @@ -592,8 +592,8 @@ continue; } - DCHECK_EQ(permanent_folder->guid(), - GetPermanentFolderGUIDForServerDefinedUniqueTag( + DCHECK_EQ(permanent_folder->uuid(), + GetPermanentFolderUuidForServerDefinedUniqueTag( server_defined_unique_tag)); MergeSubtree(/*local_node=*/permanent_folder, /*remote_node=*/root); @@ -625,7 +625,7 @@ // of their parent. GroupedUpdates grouped_updates = GroupValidUpdates(std::move(updates)); - DeduplicateValidUpdatesByGUID(&grouped_updates.updates_per_parent_guid); + DeduplicateValidUpdatesByUuid(&grouped_updates.updates_per_parent_uuid); // Construct one tree per permanent entity. RemoteForest update_forest; @@ -640,14 +640,14 @@ server_defined_unique_tag, RemoteTreeNode::BuildTree(std::move(permanent_node_update), kMaxBookmarkTreeDepth, - &grouped_updates.updates_per_parent_guid)); + &grouped_updates.updates_per_parent_uuid)); } - // All remaining entries in |updates_per_parent_guid| must be unreachable from + // All remaining entries in |updates_per_parent_uuid| must be unreachable from // permanent entities, since otherwise they would have been moved away. - for (const auto& [parent_guid, updates_for_guid] : - grouped_updates.updates_per_parent_guid) { - for (const UpdateResponseData& update : updates_for_guid) { + for (const auto& [parent_uuid, updates_for_uuid] : + grouped_updates.updates_per_parent_uuid) { + for (const UpdateResponseData& update : updates_for_uuid) { if (update.entity.specifics.has_bookmark()) { LogProblematicBookmark(RemoteBookmarkUpdateError::kMissingParentEntity); tracker_for_recording_ignored_updates @@ -671,7 +671,7 @@ } // static -std::unordered_map<base::GUID, BookmarkModelMerger::GuidMatch, base::GUIDHash> +std::unordered_map<base::Uuid, BookmarkModelMerger::GuidMatch, base::UuidHash> BookmarkModelMerger::FindGuidMatchesOrReassignLocal( const RemoteForest& remote_forest, bookmarks::BookmarkModel* bookmark_model) { @@ -679,35 +679,35 @@ TRACE_EVENT0("sync", "BookmarkModelMerger::FindGuidMatchesOrReassignLocal"); - // Build a temporary lookup table for remote GUIDs. - std::unordered_map<base::GUID, const RemoteTreeNode*, base::GUIDHash> - guid_to_remote_node_map; + // Build a temporary lookup table for remote UUIDs. + std::unordered_map<base::Uuid, const RemoteTreeNode*, base::UuidHash> + uuid_to_remote_node_map; for (const auto& [server_defined_unique_tag, root] : remote_forest) { - root.EmplaceSelfAndDescendantsByGUID(&guid_to_remote_node_map); + root.EmplaceSelfAndDescendantsByUuid(&uuid_to_remote_node_map); } - // Iterate through all local bookmarks to find matches by GUID. - std::unordered_map<base::GUID, BookmarkModelMerger::GuidMatch, base::GUIDHash> - guid_to_match_map; - // Because ReplaceBookmarkNodeGUID() cannot be used while iterating the local + // Iterate through all local bookmarks to find matches by UUID. + std::unordered_map<base::Uuid, BookmarkModelMerger::GuidMatch, base::UuidHash> + uuid_to_match_map; + // Because ReplaceBookmarkNodeUuid() cannot be used while iterating the local // bookmark model, a temporary list is constructed first to reassign later. - std::vector<const bookmarks::BookmarkNode*> nodes_to_replace_guid; + std::vector<const bookmarks::BookmarkNode*> nodes_to_replace_uuid; ui::TreeNodeIterator<const bookmarks::BookmarkNode> iterator( bookmark_model->root_node()); while (iterator.has_next()) { const bookmarks::BookmarkNode* const node = iterator.Next(); - DCHECK(node->guid().is_valid()); + DCHECK(node->uuid().is_valid()); - const auto remote_it = guid_to_remote_node_map.find(node->guid()); - if (remote_it == guid_to_remote_node_map.end()) { + const auto remote_it = uuid_to_remote_node_map.find(node->uuid()); + if (remote_it == uuid_to_remote_node_map.end()) { continue; } const RemoteTreeNode* const remote_node = remote_it->second; const syncer::EntityData& remote_entity = remote_node->entity(); - // Permanent nodes don't match by GUID but by |server_defined_unique_tag|. - // As extra precaution, specially with remote GUIDs in mind, let's ignore + // Permanent nodes don't match by UUID but by |server_defined_unique_tag|. + // As extra precaution, specially with remote UUIDs in mind, let's ignore // them explicitly here. DCHECK(remote_entity.server_defined_unique_tag.empty()); if (node->is_permanent_node()) { @@ -719,27 +719,27 @@ (node->is_url() && node->url() != remote_entity.specifics.bookmark().url())) { // If local node and its remote node match are conflicting in node type or - // URL, replace local GUID with a random GUID. - nodes_to_replace_guid.push_back(node); + // URL, replace local UUID with a random UUID. + nodes_to_replace_uuid.push_back(node); continue; } const bool success = - guid_to_match_map.emplace(node->guid(), GuidMatch{node, remote_node}) + uuid_to_match_map.emplace(node->uuid(), GuidMatch{node, remote_node}) .second; - // Insertion must have succeeded unless there were duplicate GUIDs in the + // Insertion must have succeeded unless there were duplicate UUIDs in the // local BookmarkModel (invariant violation that gets resolved upon // restart). DCHECK(success); } - for (const bookmarks::BookmarkNode* node : nodes_to_replace_guid) { - ReplaceBookmarkNodeGUID(node, base::GUID::GenerateRandomV4(), + for (const bookmarks::BookmarkNode* node : nodes_to_replace_uuid) { + ReplaceBookmarkNodeUuid(node, base::Uuid::GenerateRandomV4(), bookmark_model); } - return guid_to_match_map; + return uuid_to_match_map; } void BookmarkModelMerger::MergeSubtree( @@ -780,7 +780,7 @@ bookmark_model_->Move(matching_local_node, local_subtree_root, remote_index); // Since nodes are matching, their subtrees should be merged as well. - matching_local_node = UpdateBookmarkNodeFromSpecificsIncludingGUID( + matching_local_node = UpdateBookmarkNodeFromSpecificsIncludingUuid( matching_local_node, remote_child); MergeSubtree(matching_local_node, remote_child); } @@ -797,8 +797,8 @@ for (size_t i = remote_node.children().size(); i < local_subtree_root->children().size(); ++i) { - // If local node has been or will be matched by GUID, skip it. - if (FindMatchingRemoteNodeByGUID(local_subtree_root->children()[i].get())) { + // If local node has been or will be matched by UUID, skip it. + if (FindMatchingRemoteNodeByUuid(local_subtree_root->children()[i].get())) { continue; } ProcessLocalCreation(local_subtree_root, i); @@ -810,18 +810,18 @@ const bookmarks::BookmarkNode* local_parent, size_t local_child_start_index) const { DCHECK(local_parent); - // Try to match child by GUID. If we can't, try to match child by semantics. - const bookmarks::BookmarkNode* matching_local_node_by_guid = - FindMatchingLocalNodeByGUID(remote_child); - if (matching_local_node_by_guid) { - return matching_local_node_by_guid; + // Try to match child by UUID. If we can't, try to match child by semantics. + const bookmarks::BookmarkNode* matching_local_node_by_uuid = + FindMatchingLocalNodeByUuid(remote_child); + if (matching_local_node_by_uuid) { + return matching_local_node_by_uuid; } // All local nodes up to |remote_index-1| have processed already. Look for a // matching local node starting with the local node at position // |local_child_start_index|. FindMatchingChildBySemanticsStartingAt() // returns kInvalidIndex in the case where no semantics match was found or - // the semantics match found is GUID-matchable to a different node. + // the semantics match found is UUID-matchable to a different node. const size_t local_index = FindMatchingChildBySemanticsStartingAt( /*remote_node=*/remote_child, /*local_parent=*/local_parent, @@ -832,15 +832,15 @@ } // The child at |local_index| has matched by semantics, which also means it - // does not match by GUID to any other remote node. + // does not match by UUID to any other remote node. const bookmarks::BookmarkNode* matching_local_node_by_semantics = local_parent->children()[local_index].get(); - DCHECK(!FindMatchingRemoteNodeByGUID(matching_local_node_by_semantics)); + DCHECK(!FindMatchingRemoteNodeByUuid(matching_local_node_by_semantics)); return matching_local_node_by_semantics; } const bookmarks::BookmarkNode* -BookmarkModelMerger::UpdateBookmarkNodeFromSpecificsIncludingGUID( +BookmarkModelMerger::UpdateBookmarkNodeFromSpecificsIncludingUuid( const bookmarks::BookmarkNode* local_node, const RemoteTreeNode& remote_node) { DCHECK(local_node); @@ -854,29 +854,29 @@ const sync_pb::BookmarkSpecifics& specifics = remote_update_entity.specifics.bookmark(); - // Update the local GUID if necessary for semantic matches (it's obviously not - // needed for GUID-based matches). + // Update the local UUID if necessary for semantic matches (it's obviously not + // needed for UUID-based matches). const bookmarks::BookmarkNode* possibly_replaced_local_node = local_node; if (!specifics.guid().empty() && - specifics.guid() != local_node->guid().AsLowercaseString()) { + specifics.guid() != local_node->uuid().AsLowercaseString()) { // If it's a semantic match, neither of the nodes should be involved in any - // GUID-based match. - DCHECK(!FindMatchingLocalNodeByGUID(remote_node)); - DCHECK(!FindMatchingRemoteNodeByGUID(local_node)); + // UUID-based match. + DCHECK(!FindMatchingLocalNodeByUuid(remote_node)); + DCHECK(!FindMatchingRemoteNodeByUuid(local_node)); - possibly_replaced_local_node = ReplaceBookmarkNodeGUID( - local_node, base::GUID::ParseLowercase(specifics.guid()), + possibly_replaced_local_node = ReplaceBookmarkNodeUuid( + local_node, base::Uuid::ParseLowercase(specifics.guid()), bookmark_model_); // TODO(rushans): remove the code below since DCHECKs above guarantee that - // |guid_to_match_map_| has no such GUID. + // |uuid_to_match_map_| has no such UUID. // - // Update |guid_to_match_map_| to avoid pointing to a deleted node. This + // Update |uuid_to_match_map_| to avoid pointing to a deleted node. This // should not be required in practice, because the algorithm processes each - // GUID once, but let's update nevertheless to avoid future issues. + // UUID once, but let's update nevertheless to avoid future issues. const auto it = - guid_to_match_map_.find(possibly_replaced_local_node->guid()); - if (it != guid_to_match_map_.end() && it->second.local_node == local_node) { + uuid_to_match_map_.find(possibly_replaced_local_node->uuid()); + if (it != uuid_to_match_map_.end() && it->second.local_node == local_node) { it->second.local_node = possibly_replaced_local_node; } } @@ -893,7 +893,7 @@ const bookmarks::BookmarkNode* local_parent, size_t index) { TRACE_EVENT0("sync", "BookmarkModelMerger::ProcessRemoteCreation"); - DCHECK(!FindMatchingLocalNodeByGUID(remote_node)); + DCHECK(!FindMatchingLocalNodeByUuid(remote_node)); const EntityData& remote_update_entity = remote_node.entity(); DCHECK(IsValidBookmarkSpecifics(remote_update_entity.specifics.bookmark())); @@ -913,7 +913,7 @@ } LogBookmarkReuploadNeeded(is_reupload_needed); - // Recursively, match by GUID or, if not possible, create local node for all + // Recursively, match by UUID or, if not possible, create local node for all // child remote nodes. size_t i = 0; for (const RemoteTreeNode& remote_child : remote_node.children()) { @@ -921,14 +921,14 @@ // crashes. CHECK_LE(i, bookmark_node->children().size()); const bookmarks::BookmarkNode* local_child = - FindMatchingLocalNodeByGUID(remote_child); + FindMatchingLocalNodeByUuid(remote_child); if (!local_child) { ProcessRemoteCreation(remote_child, bookmark_node, i++); continue; } bookmark_model_->Move(local_child, bookmark_node, i++); local_child = - UpdateBookmarkNodeFromSpecificsIncludingGUID(local_child, remote_child); + UpdateBookmarkNodeFromSpecificsIncludingUuid(local_child, remote_child); MergeSubtree(local_child, remote_child); } } @@ -945,13 +945,13 @@ // Assign a temp server id for the entity. Will be overridden by the actual // server id upon receiving commit response. const bookmarks::BookmarkNode* node = parent->children()[index].get(); - DCHECK(!FindMatchingRemoteNodeByGUID(node)); + DCHECK(!FindMatchingRemoteNodeByUuid(node)); - // The node's GUID cannot run into collisions because - // FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if - // they won't actually be merged with the remote bookmark with the same GUID + // The node's UUID cannot run into collisions because + // FindGuidMatchesOrReassignLocal() takes care of reassigning local UUIDs if + // they won't actually be merged with the remote bookmark with the same UUID // (e.g. incompatible types). - const std::string sync_id = node->guid().AsLowercaseString(); + const std::string sync_id = node->uuid().AsLowercaseString(); const int64_t server_version = syncer::kUncommittedVersion; const base::Time creation_time = base::Time::Now(); const std::string& suffix = syncer::GenerateSyncableBookmarkHash( @@ -968,9 +968,9 @@ bookmark_tracker_->IncrementSequenceNumber(entity); for (size_t i = 0; i < node->children().size(); ++i) { // If a local node hasn't matched with any remote entity, its descendants - // will neither, unless they have been or will be matched by GUID, in which + // will neither, unless they have been or will be matched by UUID, in which // case we skip them for now. - if (FindMatchingRemoteNodeByGUID(node->children()[i].get())) { + if (FindMatchingRemoteNodeByUuid(node->children()[i].get())) { continue; } ProcessLocalCreation(/*parent=*/node, i); @@ -1002,7 +1002,7 @@ children.cbegin() + starting_child_index, children.cend(), [this, &remote_canonicalized_title, &remote_url, remote_type](const auto& child) { - return !FindMatchingRemoteNodeByGUID(child.get()) && + return !FindMatchingRemoteNodeByUuid(child.get()) && NodeSemanticsMatch(child.get(), remote_canonicalized_title, remote_url, remote_type); }); @@ -1010,12 +1010,12 @@ } const BookmarkModelMerger::RemoteTreeNode* -BookmarkModelMerger::FindMatchingRemoteNodeByGUID( +BookmarkModelMerger::FindMatchingRemoteNodeByUuid( const bookmarks::BookmarkNode* local_node) const { DCHECK(local_node); - const auto it = guid_to_match_map_.find(local_node->guid()); - if (it == guid_to_match_map_.end()) { + const auto it = uuid_to_match_map_.find(local_node->uuid()); + if (it == uuid_to_match_map_.end()) { return nullptr; } @@ -1023,12 +1023,12 @@ return it->second.remote_node; } -const bookmarks::BookmarkNode* BookmarkModelMerger::FindMatchingLocalNodeByGUID( +const bookmarks::BookmarkNode* BookmarkModelMerger::FindMatchingLocalNodeByUuid( const RemoteTreeNode& remote_node) const { const syncer::EntityData& remote_entity = remote_node.entity(); - const auto it = guid_to_match_map_.find( - base::GUID::ParseLowercase(remote_entity.specifics.bookmark().guid())); - if (it == guid_to_match_map_.end()) { + const auto it = uuid_to_match_map_.find( + base::Uuid::ParseLowercase(remote_entity.specifics.bookmark().guid())); + if (it == uuid_to_match_map_.end()) { return nullptr; } @@ -1042,7 +1042,7 @@ size_t index, const std::string& suffix) const { // Try to find last tracked preceding entity. It is not always the previous - // one as it might be skipped if it has unprocessed remote matching by GUID + // one as it might be skipped if it has unprocessed remote matching by UUID // update. for (size_t i = index; i > 0; --i) { const SyncedBookmarkTrackerEntity* predecessor_entity = @@ -1054,7 +1054,7 @@ predecessor_entity->metadata().unique_position()), suffix); } - DCHECK(FindMatchingRemoteNodeByGUID(parent->children()[i - 1].get())); + DCHECK(FindMatchingRemoteNodeByUuid(parent->children()[i - 1].get())); } return syncer::UniquePosition::InitialPosition(suffix); }
diff --git a/components/sync_bookmarks/bookmark_model_merger.h b/components/sync_bookmarks/bookmark_model_merger.h index d4620df..40ceb74 100644 --- a/components/sync_bookmarks/bookmark_model_merger.h +++ b/components/sync_bookmarks/bookmark_model_merger.h
@@ -11,9 +11,9 @@ #include <unordered_map> #include <vector> -#include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" +#include "base/uuid.h" #include "components/sync/base/unique_position.h" #include "components/sync/engine/commit_and_get_updates_types.h" @@ -59,23 +59,23 @@ // Internal representation of a remote tree, composed of nodes. class RemoteTreeNode final { private: - using UpdatesPerParentGUID = - std::unordered_map<base::GUID, + using UpdatesPerParentUuid = + std::unordered_map<base::Uuid, std::list<syncer::UpdateResponseData>, - base::GUIDHash>; + base::UuidHash>; public: // Constructs a tree given |update| as root and recursively all descendants - // by traversing |*updates_per_parent_guid|. |update| and - // |updates_per_parent_guid| must not be null. All updates - // |*updates_per_parent_guid| must represent valid updates. Updates + // by traversing |*updates_per_parent_uuid|. |update| and + // |updates_per_parent_uuid| must not be null. All updates + // |*updates_per_parent_uuid| must represent valid updates. Updates // corresponding from descendant nodes are moved away from - // |*updates_per_parent_guid|. |max_depth| is the max tree depth to sync + // |*updates_per_parent_uuid|. |max_depth| is the max tree depth to sync // after which content is silently ignored. static RemoteTreeNode BuildTree( syncer::UpdateResponseData update, size_t max_depth, - UpdatesPerParentGUID* updates_per_parent_guid); + UpdatesPerParentUuid* updates_per_parent_uuid); ~RemoteTreeNode(); @@ -90,11 +90,11 @@ // guaranteed to be valid updates (e.g. IsValidBookmarkSpecifics()). const std::vector<RemoteTreeNode>& children() const { return children_; } - // Recursively emplaces all GUIDs (this node and descendants) into - // |*guid_to_remote_node_map|, which must not be null. - void EmplaceSelfAndDescendantsByGUID( - std::unordered_map<base::GUID, const RemoteTreeNode*, base::GUIDHash>* - guid_to_remote_node_map) const; + // Recursively emplaces all UUIDs (this node and descendants) into + // |*uuid_to_remote_node_map|, which must not be null. + void EmplaceSelfAndDescendantsByUuid( + std::unordered_map<base::Uuid, const RemoteTreeNode*, base::UuidHash>* + uuid_to_remote_node_map) const; private: static bool UniquePositionLessThan(const RemoteTreeNode& lhs, @@ -114,7 +114,7 @@ using RemoteForest = std::unordered_map<std::string, RemoteTreeNode>; // Represents a pair of bookmarks, one local and one remote, that have been - // matched by GUID. They are guaranteed to have the same type and URL (if + // matched by UUID. They are guaranteed to have the same type and URL (if // applicable). struct GuidMatch { raw_ptr<const bookmarks::BookmarkNode> local_node; @@ -138,10 +138,10 @@ static int CountRemoteTreeNodeDescendantsForUma( const BookmarkModelMerger::RemoteTreeNode& node); - // Computes bookmark pairs that should be matched by GUID. Local bookmark - // GUIDs may be regenerated for the case where they collide with a remote GUID + // Computes bookmark pairs that should be matched by UUID. Local bookmark + // UUIDs may be regenerated for the case where they collide with a remote UUID // that is not compatible (e.g. folder vs non-folder). - static std::unordered_map<base::GUID, GuidMatch, base::GUIDHash> + static std::unordered_map<base::Uuid, GuidMatch, base::UuidHash> FindGuidMatchesOrReassignLocal(const RemoteForest& remote_forest, bookmarks::BookmarkModel* bookmark_model); @@ -151,11 +151,11 @@ void MergeSubtree(const bookmarks::BookmarkNode* local_node, const RemoteTreeNode& remote_node); - // Updates |local_node| to hold same GUID and semantics as its |remote_node| + // Updates |local_node| to hold same UUID and semantics as its |remote_node| // match. The input nodes are two equivalent local and remote bookmarks that // are about to be merged. The output node is the potentially replaced // |local_node|. |local_node| must not be a BookmarkPermanentNode. - const bookmarks::BookmarkNode* UpdateBookmarkNodeFromSpecificsIncludingGUID( + const bookmarks::BookmarkNode* UpdateBookmarkNodeFromSpecificsIncludingUuid( const bookmarks::BookmarkNode* local_node, const RemoteTreeNode& remote_node); @@ -176,27 +176,27 @@ // Looks for a local node under |local_parent| that matches |remote_node|, // starting at index |local_child_start_index|. First attempts to find a match - // by GUID and otherwise attempts to find one by semantics. If no match is + // by UUID and otherwise attempts to find one by semantics. If no match is // found, a nullptr is returned. const bookmarks::BookmarkNode* FindMatchingLocalNode( const RemoteTreeNode& remote_node, const bookmarks::BookmarkNode* local_parent, size_t local_child_start_index) const; - // If |local_node| has a remote counterpart of the same GUID, returns the + // If |local_node| has a remote counterpart of the same UUID, returns the // corresponding remote node, otherwise returns a nullptr. |local_node| must // not be null. - const RemoteTreeNode* FindMatchingRemoteNodeByGUID( + const RemoteTreeNode* FindMatchingRemoteNodeByUuid( const bookmarks::BookmarkNode* local_node) const; - // If |remote_node| has a local counterpart of the same GUID, returns the + // If |remote_node| has a local counterpart of the same UUID, returns the // corresponding local node, otherwise returns a nullptr. - const bookmarks::BookmarkNode* FindMatchingLocalNodeByGUID( + const bookmarks::BookmarkNode* FindMatchingLocalNodeByUuid( const RemoteTreeNode& remote_node) const; // Tries to find a child local node under |local_parent| that matches // |remote_node| semantically and returns the index of that node, as long as - // this local child cannot be matched by GUID to a different node. Matching is + // this local child cannot be matched by UUID to a different node. Matching is // decided using NodeSemanticsMatch(). It searches in the children list // starting from position |search_starting_child_index|. In case of no match // is found, it returns |kInvalidIndex|. @@ -226,7 +226,7 @@ // Preprocessed remote nodes in the form a forest where each tree's root is a // permanent node. Computed upon construction via BuildRemoteForest(). const RemoteForest remote_forest_; - std::unordered_map<base::GUID, GuidMatch, base::GUIDHash> guid_to_match_map_; + std::unordered_map<base::Uuid, GuidMatch, base::UuidHash> uuid_to_match_map_; }; } // namespace sync_bookmarks
diff --git a/components/sync_bookmarks/bookmark_model_merger_unittest.cc b/components/sync_bookmarks/bookmark_model_merger_unittest.cc index 8064d29..d7a73c4f 100644 --- a/components/sync_bookmarks/bookmark_model_merger_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_merger_unittest.cc
@@ -9,12 +9,12 @@ #include <utility> #include <vector> -#include "base/guid.h" #include "base/ranges/algorithm.h" #include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/test/test_bookmark_client.h" @@ -42,8 +42,8 @@ return arg->GetTitle() == title; } -// Copy of BookmarksGUIDDuplicates. -enum class ExpectedBookmarksGUIDDuplicates { +// Copy of BookmarksUuidDuplicates. +enum class ExpectedBookmarksUuidDuplicates { kMatchingUrls = 0, kMatchingFolders = 1, kDifferentUrls = 2, @@ -59,7 +59,7 @@ kInvalidSpecifics = 1, kInvalidUniquePosition = 2, kMissingParentEntity = 4, - kUnexpectedGuid = 9, + kUnexpectedUuid = 9, kParentNotFolder = 10, kUnsupportedPermanentFolder = 13, kDescendantOfRootNodeWithoutPermanentFolder = 14, @@ -82,34 +82,34 @@ return arg[0].get() == expected_raw_ptr0 && arg[1].get() == expected_raw_ptr1; } -base::GUID BookmarkBarGuid() { - return base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); +base::Uuid BookmarkBarUuid() { + return base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); } // Returns a sync ID mimic-ing what a real server could return, which means it -// generally opaque for the client but deterministic given |guid|, because the -// sync ID is roughly a hashed GUID, at least in normal circumnstances where the -// GUID is used either as client tag hash or as originator client item ID. -std::string GetFakeServerIdFromGUID(const base::GUID& guid) { - // For convenience in tests, |guid| may refer to permanent nodes too, +// generally opaque for the client but deterministic given |uuid|, because the +// sync ID is roughly a hashed UUID, at least in normal circumnstances where the +// UUID is used either as client tag hash or as originator client item ID. +std::string GetFakeServerIdFromUuid(const base::Uuid& uuid) { + // For convenience in tests, |uuid| may refer to permanent nodes too, // and yet the returned sync ID will honor the sync ID constants for permanent // nodes. - if (guid.AsLowercaseString() == - bookmarks::BookmarkNode::kBookmarkBarNodeGuid) { + if (uuid.AsLowercaseString() == + bookmarks::BookmarkNode::kBookmarkBarNodeUuid) { return kBookmarkBarId; } - return base::StrCat({"server_id_for_", guid.AsLowercaseString()}); + return base::StrCat({"server_id_for_", uuid.AsLowercaseString()}); } class UpdateResponseDataBuilder { public: - UpdateResponseDataBuilder(const base::GUID& guid, - const base::GUID& parent_guid, + UpdateResponseDataBuilder(const base::Uuid& uuid, + const base::Uuid& parent_uuid, const std::string& title, const syncer::UniquePosition& unique_position) { - data_.id = GetFakeServerIdFromGUID(guid); - data_.originator_client_item_id = guid.AsLowercaseString(); + data_.id = GetFakeServerIdFromUuid(uuid); + data_.originator_client_item_id = uuid.AsLowercaseString(); sync_pb::BookmarkSpecifics* bookmark_specifics = data_.specifics.mutable_bookmark(); @@ -117,8 +117,8 @@ bookmark_specifics->set_full_title(title); bookmark_specifics->set_type(sync_pb::BookmarkSpecifics::FOLDER); *bookmark_specifics->mutable_unique_position() = unique_position.ToProto(); - bookmark_specifics->set_guid(guid.AsLowercaseString()); - bookmark_specifics->set_parent_guid(parent_guid.AsLowercaseString()); + bookmark_specifics->set_guid(uuid.AsLowercaseString()); + bookmark_specifics->set_parent_guid(parent_uuid.AsLowercaseString()); } UpdateResponseDataBuilder& SetUrl(const GURL& url) { @@ -153,15 +153,15 @@ }; syncer::UpdateResponseData CreateUpdateResponseData( - const base::GUID& guid, - const base::GUID& parent_guid, + const base::Uuid& uuid, + const base::Uuid& parent_uuid, const std::string& title, const std::string& url, bool is_folder, const syncer::UniquePosition& unique_position, const std::string& icon_url = std::string(), const std::string& icon_data = std::string()) { - UpdateResponseDataBuilder builder(guid, parent_guid, title, unique_position); + UpdateResponseDataBuilder builder(uuid, parent_uuid, title, unique_position); if (!is_folder) { builder.SetUrl(GURL(url)); } @@ -249,12 +249,12 @@ const std::string kUrl4 = "http://www.url4.com"; const std::string kAnotherUrl2 = "http://www.another-url2.com"; - const base::GUID kFolder1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder3Guid = base::GUID::GenerateRandomV4(); - const base::GUID kUrl1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kUrl2Guid = base::GUID::GenerateRandomV4(); - const base::GUID kUrl3Guid = base::GUID::GenerateRandomV4(); - const base::GUID kUrl4Guid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolder1Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder3Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kUrl1Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kUrl2Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kUrl3Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kUrl4Uuid = base::Uuid::GenerateRandomV4(); // -------- The local model -------- // bookmark_bar @@ -319,25 +319,25 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder1Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder1Title, + /*uuid=*/kFolder1Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder1Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrl1Guid, /*parent_guid=*/kFolder1Guid, kUrl1Title, kUrl1, + /*uuid=*/kUrl1Uuid, /*parent_uuid=*/kFolder1Uuid, kUrl1Title, kUrl1, /*is_folder=*/false, /*unique_position=*/posUrl1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrl2Guid, /*parent_guid=*/kFolder1Guid, kUrl2Title, + /*uuid=*/kUrl2Uuid, /*parent_uuid=*/kFolder1Uuid, kUrl2Title, kAnotherUrl2, /*is_folder=*/false, /*unique_position=*/posUrl2)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder3Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder3Title, + /*uuid=*/kFolder3Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder3Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder3)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrl3Guid, /*parent_guid=*/kFolder3Guid, kUrl3Title, kUrl3, + /*uuid=*/kUrl3Uuid, /*parent_uuid=*/kFolder3Uuid, kUrl3Title, kUrl3, /*is_folder=*/false, /*unique_position=*/posUrl3)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrl4Guid, /*parent_guid=*/kFolder3Guid, kUrl4Title, kUrl4, + /*uuid=*/kUrl4Uuid, /*parent_uuid=*/kFolder3Uuid, kUrl4Title, kUrl4, /*is_folder=*/false, /*unique_position=*/posUrl4)); // -------- The expected merge outcome -------- @@ -439,9 +439,9 @@ const std::string kFolder2Title = "folder2"; const std::string kFolder3Title = "folder3"; - const base::GUID kFolder1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder2Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder3Guid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolder1Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder2Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder3Uuid = base::Uuid::GenerateRandomV4(); // -------- The local model -------- // bookmark_bar @@ -483,15 +483,15 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder1Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder1Title, + /*uuid=*/kFolder1Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder1Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder2Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder2Title, + /*uuid=*/kFolder2Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder2Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder2)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder3Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder3Title, + /*uuid=*/kFolder3Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder3Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder3)); @@ -545,7 +545,7 @@ // |- title 2 const std::string kTitle2 = "title2"; - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); const GURL kUrl2("http://www.url2.com"); const GURL kIcon2Url("http://www.icon-url.com"); syncer::UniquePosition pos2 = syncer::UniquePosition::InitialPosition( @@ -554,7 +554,7 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid2, /*parent_guid=*/BookmarkBarGuid(), kTitle2, kUrl2.spec(), + /*uuid=*/kUuid2, /*parent_uuid=*/BookmarkBarUuid(), kTitle2, kUrl2.spec(), /*is_folder=*/false, /*unique_position=*/pos2, kIcon2Url.spec(), /*icon_data=*/"PNG")); @@ -583,7 +583,7 @@ ShouldMergeLocalAndRemoteNodesWhenRemoteHasLegacyCanonicalTitle) { const std::string kLocalTitle = ""; const std::string kRemoteTitle = " "; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -602,8 +602,8 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); - updates.push_back(UpdateResponseDataBuilder(/*guid=*/kGuid, - /*parent_guid=*/BookmarkBarGuid(), + updates.push_back(UpdateResponseDataBuilder(/*uuid=*/kUuid, + /*parent_uuid=*/BookmarkBarUuid(), kRemoteTitle, /*unique_position=*/pos) .SetLegacyTitleOnly() @@ -633,7 +633,7 @@ "uvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN" "OPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh" "ijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -653,7 +653,7 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kRemoteTruncatedTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kRemoteTruncatedTitle, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/pos)); @@ -674,7 +674,7 @@ ShouldMergeNodesWhenRemoteHasLegacyTruncatedTitleInFullTitle) { const std::string kLocalLongTitle(300, 'A'); const std::string kRemoteTruncatedFullTitle(255, 'A'); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -694,7 +694,7 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kRemoteTruncatedFullTitle, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/pos)); @@ -721,7 +721,7 @@ ShouldMergeLocalAndRemoteNodesWhenLocalHasLegacyTruncatedTitle) { const std::string kRemoteFullTitle(300, 'A'); const std::string kLocalTruncatedTitle(255, 'A'); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -741,7 +741,7 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), sync_bookmarks::FullTitleToLegacyCanonicalizedTitle(kRemoteFullTitle), /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/pos)); @@ -765,10 +765,10 @@ EXPECT_THAT(tracker->TrackedEntitiesCountForTest(), Eq(2U)); } -TEST(BookmarkModelMergerTest, ShouldMergeAndUseRemoteGUID) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); +TEST(BookmarkModelMergerTest, ShouldMergeAndUseRemoteUuid) { + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; - const base::GUID kRemoteGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kRemoteUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -784,25 +784,25 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kRemoteGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kRemoteUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get()); - // Node should have been replaced and GUID should be set to that stored in the + // Node should have been replaced and UUID should be set to that stored in the // specifics. ASSERT_EQ(bookmark_bar_node->children().size(), 1u); const bookmarks::BookmarkNode* bookmark = bookmark_model->bookmark_bar_node()->children()[0].get(); - EXPECT_EQ(bookmark->guid(), kRemoteGuid); + EXPECT_EQ(bookmark->uuid(), kRemoteUuid); EXPECT_THAT(tracker->GetEntityForBookmarkNode(bookmark), NotNull()); } TEST(BookmarkModelMergerTest, - ShouldMergeAndKeepOldGUIDWhenRemoteGUIDIsInvalid) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + ShouldMergeAndKeepOldUuidWhenRemoteUuidIsInvalid) { + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = @@ -814,14 +814,14 @@ const bookmarks::BookmarkNode* folder = bookmark_model->AddFolder( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle)); ASSERT_TRUE(folder); - const base::GUID old_guid = folder->guid(); + const base::Uuid old_uuid = folder->uuid(); // -------- The remote model -------- syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/base::Uuid::GenerateRandomV4(), + /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); @@ -830,44 +830,44 @@ std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get()); - // Node should not have been replaced and GUID should not have been set to + // Node should not have been replaced and UUID should not have been set to // that stored in the specifics, as it was invalid. ASSERT_EQ(bookmark_bar_node->children().size(), 1u); const bookmarks::BookmarkNode* bookmark = bookmark_model->bookmark_bar_node()->children()[0].get(); - EXPECT_EQ(bookmark->guid(), old_guid); + EXPECT_EQ(bookmark->uuid(), old_uuid); EXPECT_THAT(tracker->GetEntityForBookmarkNode(bookmark), NotNull()); } -TEST(BookmarkModelMergerTest, ShouldMergeBookmarkByGUID) { +TEST(BookmarkModelMergerTest, ShouldMergeBookmarkByUuid) { const std::string kLocalTitle = "Title 1"; const std::string kRemoteTitle = "Title 2"; const std::string kUrl = "http://www.foo.com/"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - bookmark(kGuid/kLocalTitle) + // | - bookmark(kUuid/kLocalTitle) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kLocalTitle), - GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // | - bookmark(kGuid/kRemoteTitle) + // | - bookmark(kUuid/kRemoteTitle) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kRemoteTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kRemoteTitle, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -877,7 +877,7 @@ // -------- The merged model -------- // bookmark_bar - // |- bookmark(kGuid/kRemoteTitle) + // |- bookmark(kUuid/kRemoteTitle) // Node should have been merged. EXPECT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); @@ -885,11 +885,11 @@ EXPECT_THAT(tracker->GetEntityForBookmarkNode(bookmark), NotNull()); } -TEST(BookmarkModelMergerTest, ShouldMergeBookmarkByGUIDAndReparent) { +TEST(BookmarkModelMergerTest, ShouldMergeBookmarkByUuidAndReparent) { const std::string kLocalTitle = "Title 1"; const std::string kRemoteTitle = "Title 2"; const std::string kUrl = "http://www.foo.com/"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -897,7 +897,7 @@ // -------- The local model -------- // bookmark_bar // | - folder - // | - bookmark(kGuid) + // | - bookmark(kUuid) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); @@ -905,7 +905,7 @@ /*parent=*/bookmark_bar_node, /*index=*/0, u"Folder Title"); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/folder, /*index=*/0, base::UTF8ToUTF16(kLocalTitle), - GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(folder); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(folder)); @@ -913,12 +913,12 @@ // -------- The remote model -------- // bookmark_bar - // |- bookmark(kGuid) + // |- bookmark(kUuid) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kRemoteTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kRemoteTitle, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -928,7 +928,7 @@ // -------- The merged model -------- // bookmark_bar - // | - bookmark(kGuid/kRemoteTitle) + // | - bookmark(kUuid/kRemoteTitle) // | - folder // Node should have been merged and the local node should have been @@ -941,30 +941,30 @@ EXPECT_THAT(tracker->GetEntityForBookmarkNode(folder), NotNull()); } -TEST(BookmarkModelMergerTest, ShouldMergeFolderByGUIDAndNotSemantics) { +TEST(BookmarkModelMergerTest, ShouldMergeFolderByUuidAndNotSemantics) { const std::string kFolderId = "Folder Id"; const std::string kTitle1 = "Title 1"; const std::string kTitle2 = "Title 2"; const std::string kUrl = "http://www.foo.com/"; - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - folder 1 (kGuid1/kTitle1) - // | - folder 2 (kGuid2/kTitle2) + // | - folder 1 (kUuid1/kTitle1) + // | - folder 2 (kUuid2/kTitle2) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* folder1 = bookmark_model->AddFolder( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle1), - /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kGuid1); + /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kUuid1); const bookmarks::BookmarkNode* folder2 = bookmark_model->AddFolder( /*parent=*/folder1, /*index=*/0, base::UTF8ToUTF16(kTitle2), - /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kGuid2); + /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kUuid2); ASSERT_TRUE(folder1); ASSERT_TRUE(folder2); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(folder1)); @@ -972,15 +972,15 @@ // -------- The remote model -------- // bookmark_bar - // | - folder (kGuid2/kTitle1) + // | - folder (kUuid2/kTitle1) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); - // Add a remote folder to correspond to the local folder by GUID and + // Add a remote folder to correspond to the local folder by UUID and // semantics. updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid2, /*parent_guid=*/BookmarkBarGuid(), kTitle1, + /*uuid=*/kUuid2, /*parent_uuid=*/BookmarkBarUuid(), kTitle1, /*url=*/"", /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); @@ -990,16 +990,16 @@ // -------- The merged model -------- // bookmark_bar - // | - folder 2 (kGuid2/kTitle1) - // | - folder 1 (kGuid1/kTitle1) + // | - folder 2 (kUuid2/kTitle1) + // | - folder 1 (kUuid1/kTitle1) - // Node should have been merged with its GUID match. + // Node should have been merged with its UUID match. EXPECT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(folder2, folder1)); - EXPECT_EQ(folder1->guid(), kGuid1); + EXPECT_EQ(folder1->uuid(), kUuid1); EXPECT_EQ(folder1->GetTitle(), base::UTF8ToUTF16(kTitle1)); EXPECT_EQ(folder1->children().size(), 0u); - EXPECT_EQ(folder2->guid(), kGuid2); + EXPECT_EQ(folder2->uuid(), kUuid2); EXPECT_EQ(folder2->GetTitle(), base::UTF8ToUTF16(kTitle1)); EXPECT_THAT(tracker->GetEntityForBookmarkNode(folder1), NotNull()); EXPECT_THAT(tracker->GetEntityForBookmarkNode(folder2), NotNull()); @@ -1009,14 +1009,14 @@ const std::string kChildId = "child_id"; const std::string kParentTitle = "Parent Title"; const std::string kChildTitle = "Child Title"; - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); const std::string kUrl1 = "http://www.foo.com/"; const std::string kUrl2 = "http://www.bar.com/"; // -------- The remote model -------- // bookmark_bar - // | - bookmark (kGuid1/kParentTitle, not a folder) + // | - bookmark (kUuid1/kParentTitle, not a folder) // | - bookmark syncer::UpdateResponseDataList updates; @@ -1029,13 +1029,13 @@ syncer::UniquePosition::After(pos1, suffix); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid1, /*parent_guid=*/BookmarkBarGuid(), kParentTitle, + /*uuid=*/kUuid1, /*parent_uuid=*/BookmarkBarUuid(), kParentTitle, /*url=*/kUrl1, /*is_folder=*/false, /*unique_position=*/pos1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid2, /*parent_guid=*/kGuid1, kChildTitle, + /*uuid=*/kUuid2, /*parent_uuid=*/kUuid1, kChildTitle, /*url=*/kUrl2, /*is_folder=*/false, /*unique_position=*/pos2)); @@ -1047,13 +1047,13 @@ // -------- The merged model -------- // bookmark_bar - // | - bookmark (kGuid1/kParentTitle) + // | - bookmark (kUuid1/kParentTitle) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); ASSERT_EQ(bookmark_bar_node->children().size(), 1u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid1); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid1); EXPECT_EQ(bookmark_bar_node->children()[0]->GetTitle(), base::UTF8ToUTF16(kParentTitle)); EXPECT_EQ(bookmark_bar_node->children()[0]->children().size(), 0u); @@ -1062,20 +1062,20 @@ TEST( BookmarkModelMergerTest, - ShouldIgnoreFolderSemanticsMatchAndLaterMatchByGUIDWithSemanticsNodeFirst) { + ShouldIgnoreFolderSemanticsMatchAndLaterMatchByUuidWithSemanticsNodeFirst) { const std::string kFolderId1 = "Folder Id 1"; const std::string kFolderId2 = "Folder Id 2"; const std::string kOriginalTitle = "Original Title"; const std::string kNewTitle = "New Title"; - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - folder (kGuid1/kOriginalTitle) + // | - folder (kUuid1/kOriginalTitle) // | - bookmark const bookmarks::BookmarkNode* bookmark_bar_node = @@ -1083,7 +1083,7 @@ const bookmarks::BookmarkNode* folder = bookmark_model->AddFolder( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kOriginalTitle), /*meta_info=*/nullptr, - /*creation_time=*/base::Time::Now(), kGuid1); + /*creation_time=*/base::Time::Now(), kUuid1); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/folder, /*index=*/0, u"Bookmark Title", GURL("http://foo.com/")); @@ -1094,8 +1094,8 @@ // -------- The remote model -------- // bookmark_bar - // | - folder (kGuid2/kOriginalTitle) - // | - folder (kGuid1/kNewTitle) + // | - folder (kUuid2/kOriginalTitle) + // | - folder (kUuid1/kNewTitle) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); @@ -1105,17 +1105,17 @@ syncer::UniquePosition pos2 = syncer::UniquePosition::After(pos1, suffix); // Add a remote folder to correspond to the local folder by semantics and not - // GUID. + // UUID. updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid2, /*parent_guid=*/BookmarkBarGuid(), kOriginalTitle, + /*uuid=*/kUuid2, /*parent_uuid=*/BookmarkBarUuid(), kOriginalTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/pos1)); - // Add a remote folder to correspond to the local folder by GUID and not + // Add a remote folder to correspond to the local folder by UUID and not // semantics. updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid1, /*parent_guid=*/BookmarkBarGuid(), kNewTitle, + /*uuid=*/kUuid1, /*parent_uuid=*/BookmarkBarUuid(), kNewTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/pos2)); @@ -1125,17 +1125,17 @@ // -------- The merged model -------- // bookmark_bar - // | - folder (kGuid2/kOriginalTitle) - // | - folder (kGuid1/kNewTitle) + // | - folder (kUuid2/kOriginalTitle) + // | - folder (kUuid1/kNewTitle) // | - bookmark - // Node should have been merged with its GUID match. + // Node should have been merged with its UUID match. ASSERT_EQ(bookmark_bar_node->children().size(), 2u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid2); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid2); EXPECT_EQ(bookmark_bar_node->children()[0]->GetTitle(), base::UTF8ToUTF16(kOriginalTitle)); EXPECT_EQ(bookmark_bar_node->children()[0]->children().size(), 0u); - EXPECT_EQ(bookmark_bar_node->children()[1]->guid(), kGuid1); + EXPECT_EQ(bookmark_bar_node->children()[1]->uuid(), kUuid1); EXPECT_EQ(bookmark_bar_node->children()[1]->GetTitle(), base::UTF8ToUTF16(kNewTitle)); EXPECT_EQ(bookmark_bar_node->children()[1]->children().size(), 1u); @@ -1143,20 +1143,20 @@ } TEST(BookmarkModelMergerTest, - ShouldIgnoreFolderSemanticsMatchAndLaterMatchByGUIDWithGUIDNodeFirst) { + ShouldIgnoreFolderSemanticsMatchAndLaterMatchByUuidWithUuidNodeFirst) { const std::string kFolderId1 = "Folder Id 1"; const std::string kFolderId2 = "Folder Id 2"; const std::string kOriginalTitle = "Original Title"; const std::string kNewTitle = "New Title"; - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - folder (kGuid1/kOriginalTitle) + // | - folder (kUuid1/kOriginalTitle) // | - bookmark const bookmarks::BookmarkNode* bookmark_bar_node = @@ -1164,7 +1164,7 @@ const bookmarks::BookmarkNode* folder = bookmark_model->AddFolder( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kOriginalTitle), /*meta_info=*/nullptr, - /*creation_time=*/base::Time::Now(), kGuid1); + /*creation_time=*/base::Time::Now(), kUuid1); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/folder, /*index=*/0, u"Bookmark Title", GURL("http://foo.com/")); @@ -1175,8 +1175,8 @@ // -------- The remote model -------- // bookmark_bar - // | - folder (kGuid1/kNewTitle) - // | - folder (kGuid2/kOriginalTitle) + // | - folder (kUuid1/kNewTitle) + // | - folder (kUuid2/kOriginalTitle) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); @@ -1185,18 +1185,18 @@ syncer::UniquePosition pos1 = syncer::UniquePosition::InitialPosition(suffix); syncer::UniquePosition pos2 = syncer::UniquePosition::After(pos1, suffix); - // Add a remote folder to correspond to the local folder by GUID and not + // Add a remote folder to correspond to the local folder by UUID and not // semantics. updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid1, /*parent_guid=*/BookmarkBarGuid(), kNewTitle, + /*uuid=*/kUuid1, /*parent_uuid=*/BookmarkBarUuid(), kNewTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/pos1)); // Add a remote folder to correspond to the local folder by - // semantics and not GUID. + // semantics and not UUID. updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid2, /*parent_guid=*/BookmarkBarGuid(), kOriginalTitle, + /*uuid=*/kUuid2, /*parent_uuid=*/BookmarkBarUuid(), kOriginalTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/pos2)); @@ -1205,51 +1205,51 @@ // -------- The merged model -------- // bookmark_bar - // | - folder (kGuid1/kNewTitle) - // | - folder (kGuid2/kOriginalTitle) + // | - folder (kUuid1/kNewTitle) + // | - folder (kUuid2/kOriginalTitle) - // Node should have been merged with its GUID match. + // Node should have been merged with its UUID match. ASSERT_EQ(bookmark_bar_node->children().size(), 2u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid1); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid1); EXPECT_EQ(bookmark_bar_node->children()[0]->GetTitle(), base::UTF8ToUTF16(kNewTitle)); EXPECT_EQ(bookmark_bar_node->children()[0]->children().size(), 1u); - EXPECT_EQ(bookmark_bar_node->children()[1]->guid(), kGuid2); + EXPECT_EQ(bookmark_bar_node->children()[1]->uuid(), kUuid2); EXPECT_EQ(bookmark_bar_node->children()[1]->GetTitle(), base::UTF8ToUTF16(kOriginalTitle)); EXPECT_EQ(bookmark_bar_node->children()[1]->children().size(), 0u); } -TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingURLs) { +TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkUuidWithConflictingURLs) { const std::string kTitle = "Title"; const std::string kUrl1 = "http://www.foo.com/"; const std::string kUrl2 = "http://www.bar.com/"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - bookmark (kGuid/kUril1) + // | - bookmark (kUuid/kUril1) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), - GURL(kUrl1), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kUrl1), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // | - bookmark (kGuid/kUrl2) + // | - bookmark (kUuid/kUrl2) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( // Remote B - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/kUrl2, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1258,46 +1258,46 @@ // -------- The merged model -------- // bookmark_bar - // | - bookmark (kGuid/kUrl2) - // | - bookmark ([new GUID]/kUrl1) + // | - bookmark (kUuid/kUrl2) + // | - bookmark ([new UUID]/kUrl1) - // Conflicting node GUID should have been replaced. + // Conflicting node UUID should have been replaced. ASSERT_EQ(bookmark_bar_node->children().size(), 2u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid); EXPECT_EQ(bookmark_bar_node->children()[0]->url(), kUrl2); - EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid); + EXPECT_NE(bookmark_bar_node->children()[1]->uuid(), kUuid); EXPECT_EQ(bookmark_bar_node->children()[1]->url(), kUrl1); } -TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingTypes) { +TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkUuidWithConflictingTypes) { const std::string kTitle = "Title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - bookmark (kGuid) + // | - bookmark (kUuid) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), GURL("http://www.foo.com/"), /*meta_info=*/nullptr, base::Time::Now(), - kGuid); + kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // | - folder(kGuid) + // | - folder(kUuid) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( // Remote B - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); @@ -1306,38 +1306,38 @@ // -------- The merged model -------- // bookmark_bar - // | - folder (kGuid) - // | - bookmark ([new GUID]) + // | - folder (kUuid) + // | - bookmark ([new UUID]) - // Conflicting node GUID should have been replaced. + // Conflicting node UUID should have been replaced. ASSERT_EQ(bookmark_bar_node->children().size(), 2u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid); EXPECT_TRUE(bookmark_bar_node->children()[0]->is_folder()); - EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid); + EXPECT_NE(bookmark_bar_node->children()[1]->uuid(), kUuid); EXPECT_FALSE(bookmark_bar_node->children()[1]->is_folder()); } TEST(BookmarkModelMergerTest, - ShouldReplaceBookmarkGUIDWithConflictingTypesAndLocalChildren) { - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + ShouldReplaceBookmarkUuidWithConflictingTypesAndLocalChildren) { + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - folder (kGuid1) - // | - bookmark (kGuid2) + // | - folder (kUuid1) + // | - bookmark (kUuid2) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* folder = bookmark_model->AddFolder( /*parent=*/bookmark_bar_node, /*index=*/0, u"Folder Title", - /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kGuid1); + /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kUuid1); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/folder, /*index=*/0, u"Foo's title", GURL("http://foo.com"), - /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kGuid2); + /*meta_info=*/nullptr, /*creation_time=*/base::Time::Now(), kUuid2); ASSERT_TRUE(folder); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(folder)); @@ -1345,13 +1345,13 @@ // -------- The remote model -------- // bookmark_bar - // | - bookmark (kGuid1) + // | - bookmark (kUuid1) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid1, /*parent_guid=*/BookmarkBarGuid(), "Bar's title", + /*uuid=*/kUuid1, /*parent_uuid=*/BookmarkBarUuid(), "Bar's title", "http://bar.com/", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1360,56 +1360,56 @@ // -------- The merged model -------- // bookmark_bar - // | - bookmark (kGuid1) - // | - folder ([new GUID]) - // | - bookmark (kGuid2) + // | - bookmark (kUuid1) + // | - folder ([new UUID]) + // | - bookmark (kUuid2) - // Conflicting node GUID should have been replaced. + // Conflicting node UUID should have been replaced. ASSERT_EQ(bookmark_bar_node->children().size(), 2u); - EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid1); - EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid1); - EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid2); + EXPECT_EQ(bookmark_bar_node->children()[0]->uuid(), kUuid1); + EXPECT_NE(bookmark_bar_node->children()[1]->uuid(), kUuid1); + EXPECT_NE(bookmark_bar_node->children()[1]->uuid(), kUuid2); EXPECT_FALSE(bookmark_bar_node->children()[0]->is_folder()); EXPECT_TRUE(bookmark_bar_node->children()[1]->is_folder()); EXPECT_EQ(bookmark_bar_node->children()[1]->children().size(), 1u); EXPECT_FALSE(bookmark_bar_node->children()[1]->children()[0]->is_folder()); - EXPECT_EQ(bookmark_bar_node->children()[1]->children()[0]->guid(), kGuid2); + EXPECT_EQ(bookmark_bar_node->children()[1]->children()[0]->uuid(), kUuid2); } -// Tests that the GUID-based matching algorithm handles well the case where a +// Tests that the UUID-based matching algorithm handles well the case where a // local bookmark matches a remote bookmark that is orphan. In this case the // remote node should be ignored and the local bookmark included in the merged // tree. -TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteGUIDIfOrphanNode) { +TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteUuidIfOrphanNode) { const std::string kInexistentParentId = "InexistentParentId"; const std::string kTitle = "Title"; const std::string kUrl = "http://www.foo.com/"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); - const base::GUID kInexistentParentGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kInexistentParentUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - bookmark(kGuid/kTitle) + // | - bookmark(kUuid/kTitle) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), - GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // Orphan node: bookmark(kGuid/kTitle) + // Orphan node: bookmark(kUuid/kTitle) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/kInexistentParentGuid, kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/kInexistentParentUuid, kTitle, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1419,50 +1419,50 @@ // -------- The merged model -------- // bookmark_bar - // |- bookmark(kGuid/kTitle) + // |- bookmark(kUuid/kTitle) // The local node should have been tracked. EXPECT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); EXPECT_EQ(bookmark->GetTitle(), base::UTF8ToUTF16(kTitle)); EXPECT_THAT(tracker->GetEntityForBookmarkNode(bookmark), NotNull()); - EXPECT_THAT(tracker->GetEntityForGUID(kGuid), NotNull()); - EXPECT_THAT(tracker->GetEntityForGUID(kInexistentParentGuid), IsNull()); + EXPECT_THAT(tracker->GetEntityForUuid(kUuid), NotNull()); + EXPECT_THAT(tracker->GetEntityForUuid(kInexistentParentUuid), IsNull()); } -// Tests that the GUID-based matching algorithm handles well the case where a +// Tests that the UUID-based matching algorithm handles well the case where a // local bookmark matches a remote bookmark that contains invalid specifics // (e.g. invalid URL). In this case the remote node should be ignored and the // local bookmark included in the merged tree. -TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteGUIDIfInvalidSpecifics) { +TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteUuidIfInvalidSpecifics) { const std::string kTitle = "Title"; const std::string kLocalUrl = "http://www.foo.com/"; const std::string kInvalidUrl = "invalidurl"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- // bookmark_bar - // | - bookmark(kGuid/kLocalUrl/kTitle) + // | - bookmark(kUuid/kLocalUrl/kTitle) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kTitle), - GURL(kLocalUrl), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kLocalUrl), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // | - bookmark (kGuid/kInvalidURL/kTitle) + // | - bookmark (kUuid/kInvalidURL/kTitle) syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/kInvalidUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1472,7 +1472,7 @@ // -------- The merged model -------- // bookmark_bar - // |- bookmark(kGuid/kLocalUrl/kTitle) + // |- bookmark(kUuid/kLocalUrl/kTitle) // The local node should have been tracked. EXPECT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); @@ -1481,35 +1481,35 @@ EXPECT_THAT(tracker->GetEntityForBookmarkNode(bookmark), NotNull()); } -// Tests that updates with a GUID that is different to originator client item ID +// Tests that updates with a UUID that is different to originator client item ID // are ignored. -TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteUpdateWithInvalidGUID) { - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); +TEST(BookmarkModelMergerTest, ShouldIgnoreRemoteUpdateWithInvalidUuid) { + const base::Uuid kUuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kUuid2 = base::Uuid::GenerateRandomV4(); const std::string kTitle1 = "Title1"; const std::string kTitle2 = "Title2"; const std::string kLocalTitle = "LocalTitle"; const std::string kUrl = "http://www.foo.com/"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); - const base::GUID kUnexpectedOriginatorItemId = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kUnexpectedOriginatorItemId = base::Uuid::GenerateRandomV4(); std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); // -------- The local model -------- - // | - bookmark(kGuid/kUrl/kLocalTitle) + // | - bookmark(kUuid/kUrl/kLocalTitle) const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model->bookmark_bar_node(); const bookmarks::BookmarkNode* bookmark = bookmark_model->AddURL( /*parent=*/bookmark_bar_node, /*index=*/0, base::UTF8ToUTF16(kLocalTitle), - GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kGuid); + GURL(kUrl), /*meta_info=*/nullptr, base::Time::Now(), kUuid); ASSERT_TRUE(bookmark); ASSERT_THAT(bookmark_bar_node->children(), ElementRawPointersAre(bookmark)); // -------- The remote model -------- // bookmark_bar - // | - bookmark (kGuid/kUrl/kTitle1) - // | - bookmark (kGuid/kUrl/kTitle2) + // | - bookmark (kUuid/kUrl/kTitle1) + // | - bookmark (kUuid/kUrl/kTitle2) const std::string suffix = syncer::UniquePosition::RandomSuffix(); syncer::UniquePosition position1 = syncer::UniquePosition::InitialPosition(suffix); @@ -1519,11 +1519,11 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle1, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle1, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/position1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle2, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle2, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/position2)); @@ -1532,19 +1532,19 @@ updates.back().entity.originator_client_item_id = kUnexpectedOriginatorItemId.AsLowercaseString(); updates.back().entity.id = - GetFakeServerIdFromGUID(kUnexpectedOriginatorItemId); + GetFakeServerIdFromUuid(kUnexpectedOriginatorItemId); std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get()); // -------- The merged model -------- - // | - bookmark (kGuid/kUrl/kTitle1) + // | - bookmark (kUuid/kUrl/kTitle1) // The second remote node should have been filtered out. ASSERT_EQ(bookmark_bar_node->children().size(), 1u); const bookmarks::BookmarkNode* merged_bookmark = bookmark_model->bookmark_bar_node()->children()[0].get(); - EXPECT_THAT(merged_bookmark->guid(), Eq(kGuid)); + EXPECT_THAT(merged_bookmark->uuid(), Eq(kUuid)); EXPECT_THAT(tracker->GetEntityForBookmarkNode(merged_bookmark), NotNull()); } @@ -1562,8 +1562,8 @@ const std::string kUrl1 = "http://www.url1.com/"; const std::string kUrl2 = "http://www.url2.com/"; - const base::GUID kFolder1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder2Guid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolder1Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder2Uuid = base::Uuid::GenerateRandomV4(); const std::string kUrl1Id = "Url1Id"; // It is needed to use at least two folders to reproduce the crash. It is @@ -1595,7 +1595,7 @@ // The remote model contains two folders. The first one is the same as in // local model, but it does not contain any urls. The second one has the url1 - // from first folder with same GUID. This will cause skip local creation for + // from first folder with same UUID. This will cause skip local creation for // |url1| while processing |folder1|. // // -------- The remote model -------- @@ -1616,15 +1616,15 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder1Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder1Title, + /*uuid=*/kFolder1Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder1Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder1)); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder2Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder2Title, + /*uuid=*/kFolder2Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder2Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder2)); updates.push_back(CreateUpdateResponseData( - /*guid=*/folder1_url1_node->guid(), /*parent_guid=*/kFolder2Guid, + /*uuid=*/folder1_url1_node->uuid(), /*parent_uuid=*/kFolder2Uuid, kUrl1Title, kUrl1, /*is_folder=*/false, /*unique_position=*/posUrl1)); @@ -1684,8 +1684,8 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - /*parent_guid=*/BookmarkBarGuid(), "Title", + /*uuid=*/base::Uuid::GenerateRandomV4(), + /*parent_uuid=*/BookmarkBarUuid(), "Title", /*url=*/"invalidurl", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1702,7 +1702,7 @@ std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); // -------- The remote model -------- // bookmark_bar @@ -1714,22 +1714,22 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), "Title1", + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), "Title1", /*url=*/"http://url1", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, "Title2", + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Title2", /*url=*/"http://url2", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, "Title3", + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Title3", /*url=*/"http://url3", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, "Title4", + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Title4", /*url=*/"http://url4", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1753,8 +1753,8 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - /*parent_guid=*/base::GUID::GenerateRandomV4(), "Title1", + /*uuid=*/base::Uuid::GenerateRandomV4(), + /*parent_uuid=*/base::Uuid::GenerateRandomV4(), "Title1", /*url=*/"http://url1", /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); @@ -1809,8 +1809,8 @@ syncer::ModelTypeToProtocolRootTag(syncer::BOOKMARKS); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - base::GUID::ParseLowercase(bookmarks::BookmarkNode::kRootNodeGuid), + /*uuid=*/base::Uuid::GenerateRandomV4(), + base::Uuid::ParseLowercase(bookmarks::BookmarkNode::kRootNodeUuid), "Title1", /*url=*/"http://url1", /*is_folder=*/false, @@ -1824,22 +1824,22 @@ /*expected_bucket_count=*/1); } -TEST(BookmarkModelMergerTest, ShouldRemoveMatchingDuplicatesByGUID) { +TEST(BookmarkModelMergerTest, ShouldRemoveMatchingDuplicatesByUuid) { const std::string kTitle1 = "Title 1"; const std::string kTitle2 = "Title 2"; const std::string kTitle3 = "Title 3"; const std::string kUrl = "http://www.url.com/"; - const base::GUID kUrlGUID = base::GUID::GenerateRandomV4(); + const base::Uuid kUrlUuid = base::Uuid::GenerateRandomV4(); // The remote model has 2 duplicate folders with the same title and 2 // duplicate bookmarks with the same URL. // // -------- The remote model -------- // bookmark_bar - // |- url1(http://www.url.com, UrlGUID) - // |- url2(http://www.url.com, UrlGUID) - // |- url3(http://www.url.com, <other-guid>) + // |- url1(http://www.url.com, UrlUuid) + // |- url2(http://www.url.com, UrlUuid) + // |- url3(http://www.url.com, <other-uuid>) std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -1847,20 +1847,20 @@ updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrlGUID, /*parent_guid=*/BookmarkBarGuid(), kTitle1, + /*uuid=*/kUrlUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle1, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id1"; updates.back().entity.creation_time = base::Time::Now() - base::Days(1); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrlGUID, /*parent_guid=*/BookmarkBarGuid(), kTitle2, + /*uuid=*/kUrlUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle2, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id2"; updates.back().entity.creation_time = base::Time::Now(); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - /*parent_guid=*/BookmarkBarGuid(), kTitle3, + /*uuid=*/base::Uuid::GenerateRandomV4(), + /*parent_uuid=*/BookmarkBarUuid(), kTitle3, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id3"; @@ -1880,28 +1880,28 @@ Eq(4)); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kMatchingUrls, + /*sample=*/ExpectedBookmarksUuidDuplicates::kMatchingUrls, /*expected_count=*/1); EXPECT_THAT(histogram_tester.GetTotalSum( "Sync.BookmarkModelMerger.ReachableInputUpdates"), Eq(3)); } -TEST(BookmarkModelMergerTest, ShouldRemoveDifferentDuplicatesByGUID) { +TEST(BookmarkModelMergerTest, ShouldRemoveDifferentDuplicatesByUuid) { const std::string kTitle1 = "Title 1"; const std::string kTitle2 = "Title 2"; const std::string kUrl = "http://www.url.com/"; const std::string kDifferentUrl = "http://www.different-url.com/"; - const base::GUID kUrlGUID = base::GUID::GenerateRandomV4(); + const base::Uuid kUrlUuid = base::Uuid::GenerateRandomV4(); // The remote model will have 2 duplicate folders with // different titles and 2 duplicate bookmarks with different URLs // // -------- The remote model -------- // bookmark_bar - // |- url1(http://www.url.com, UrlGUID) - // |- url2(http://www.different-url.com, UrlGUID) + // |- url1(http://www.url.com, UrlUUID) + // |- url2(http://www.different-url.com, UrlUUID) std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -1909,13 +1909,13 @@ updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrlGUID, /*parent_guid=*/BookmarkBarGuid(), kTitle1, + /*uuid=*/kUrlUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle1, /*url=*/kUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id1"; updates.back().entity.creation_time = base::Time::Now(); updates.push_back(CreateUpdateResponseData( - /*guid=*/kUrlGUID, /*parent_guid=*/BookmarkBarGuid(), kTitle2, + /*uuid=*/kUrlUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle2, /*url=*/kDifferentUrl, /*is_folder=*/false, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id2"; @@ -1930,22 +1930,22 @@ UnorderedElementsAre(HasTitle(base::UTF8ToUTF16(kTitle1)))); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentUrls, + /*sample=*/ExpectedBookmarksUuidDuplicates::kDifferentUrls, /*expected_count=*/1); } -TEST(BookmarkModelMergerTest, ShouldRemoveMatchingFolderDuplicatesByGUID) { +TEST(BookmarkModelMergerTest, ShouldRemoveMatchingFolderDuplicatesByUuid) { const std::string kTitle = "Title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); // The remote model has 2 duplicate folders with the same title and 2 // duplicate bookmarks with the same URL. // // -------- The remote model -------- // bookmark_bar - // |- folder1(Title, GUID) - // |- folder2(Title, GUID) + // |- folder1(Title, UUID) + // |- folder2(Title, UUID) std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -1953,13 +1953,13 @@ updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id1"; updates.back().entity.creation_time = base::Time::Now() - base::Days(1); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"", /*is_folder=*/true, /*unique_position=*/MakeRandomPosition())); updates.back().entity.id = "Id2"; @@ -1973,26 +1973,26 @@ ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kMatchingFolders, + /*sample=*/ExpectedBookmarksUuidDuplicates::kMatchingFolders, /*expected_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), IsNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), NotNull()); } -TEST(BookmarkModelMergerTest, ShouldRemoveDifferentFolderDuplicatesByGUID) { +TEST(BookmarkModelMergerTest, ShouldRemoveDifferentFolderDuplicatesByUuid) { const std::string kTitle1 = "Title 1"; const std::string kTitle2 = "Title 2"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); // The remote model has 2 duplicate folders with the same title and 2 // duplicate bookmarks with the same URL. // // -------- The remote model -------- // bookmark_bar - // |- folder1(Title, GUID) + // |- folder1(Title, UUID) // |- folder11 - // |- folder2(Title, GUID) + // |- folder2(Title, UUID) // |- folder21 std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -2001,23 +2001,23 @@ updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle1, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle1, /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); updates.back().entity.id = "Id1"; updates.back().entity.creation_time = base::Time::Now(); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Some title", /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle2, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle2, /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); updates.back().entity.id = "Id2"; updates.back().entity.creation_time = base::Time::Now() - base::Days(1); updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Some title 2", /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); @@ -2029,7 +2029,7 @@ ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); histogram_tester.ExpectBucketCount( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentFolders, + /*sample=*/ExpectedBookmarksUuidDuplicates::kDifferentFolders, /*expected_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), NotNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), IsNull()); @@ -2064,16 +2064,16 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); - base::GUID parent_guid = BookmarkBarGuid(); + base::Uuid parent_uuid = BookmarkBarUuid(); // Create a tree with depth |kRemoteUpdatesDepth| to verify the limit of // kMaxBookmarkTreeDepth is enforced. for (size_t i = 1; i < kRemoteUpdatesDepth; ++i) { - base::GUID folder_guid = base::GUID::GenerateRandomV4(); + base::Uuid folder_uuid = base::Uuid::GenerateRandomV4(); updates.push_back(CreateUpdateResponseData( - /*guid=*/folder_guid, /*parent_guid=*/parent_guid, kRemoteTitle, + /*uuid=*/folder_uuid, /*parent_uuid=*/parent_uuid, kRemoteTitle, /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); - parent_guid = folder_guid; + parent_uuid = folder_uuid; } ASSERT_THAT(updates.size(), Eq(kRemoteUpdatesDepth)); @@ -2098,8 +2098,8 @@ const std::string kFolder1Title = "folder1"; const std::string kFolder2Title = "folder2"; - const base::GUID kFolder1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder2Guid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolder1Uuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder2Uuid = base::Uuid::GenerateRandomV4(); const std::string suffix = syncer::UniquePosition::RandomSuffix(); const syncer::UniquePosition posFolder1 = @@ -2114,7 +2114,7 @@ syncer::UpdateResponseDataList updates; updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder1Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder1Title, + /*uuid=*/kFolder1Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder1Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder1)); @@ -2124,7 +2124,7 @@ true; updates.push_back(CreateUpdateResponseData( - /*guid=*/kFolder2Guid, /*parent_guid=*/BookmarkBarGuid(), kFolder2Title, + /*uuid=*/kFolder2Uuid, /*parent_uuid=*/BookmarkBarUuid(), kFolder2Title, /*url=*/std::string(), /*is_folder=*/true, /*unique_position=*/posFolder2)); @@ -2132,29 +2132,29 @@ std::unique_ptr<SyncedBookmarkTracker> tracker = Merge(std::move(updates), bookmark_model.get()); - ASSERT_THAT(tracker->GetEntityForGUID(kFolder1Guid), NotNull()); - ASSERT_THAT(tracker->GetEntityForGUID(kFolder2Guid), NotNull()); + ASSERT_THAT(tracker->GetEntityForUuid(kFolder1Uuid), NotNull()); + ASSERT_THAT(tracker->GetEntityForUuid(kFolder2Uuid), NotNull()); - EXPECT_TRUE(tracker->GetEntityForGUID(kFolder1Guid)->IsUnsynced()); - EXPECT_FALSE(tracker->GetEntityForGUID(kFolder2Guid)->IsUnsynced()); + EXPECT_TRUE(tracker->GetEntityForUuid(kFolder1Uuid)->IsUnsynced()); + EXPECT_FALSE(tracker->GetEntityForUuid(kFolder2Uuid)->IsUnsynced()); EXPECT_THAT(histogram_tester.GetTotalSum( "Sync.BookmarkModelMerger.UnsyncedEntitiesUponCompletion"), Eq(1)); } -TEST(BookmarkModelMergerTest, ShouldRemoveDifferentTypeDuplicatesByGUID) { +TEST(BookmarkModelMergerTest, ShouldRemoveDifferentTypeDuplicatesByUuid) { const std::string kTitle = "Title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kUuid = base::Uuid::GenerateRandomV4(); // The remote model has 2 duplicates, a folder and a URL. // // -------- The remote model -------- // bookmark_bar - // |- folder1(GUID) + // |- folder1(UUID) // |- folder11 - // |- URL1(GUID) + // |- URL1(UUID) std::unique_ptr<bookmarks::BookmarkModel> bookmark_model = bookmarks::TestBookmarkClient::CreateModel(); @@ -2162,17 +2162,17 @@ updates.push_back(CreateBookmarkBarNodeUpdateData()); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); updates.back().entity.id = "Id1"; updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), /*parent_guid=*/kGuid, + /*uuid=*/base::Uuid::GenerateRandomV4(), /*parent_uuid=*/kUuid, "Some title", /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); updates.push_back(CreateUpdateResponseData( - /*guid=*/kGuid, /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/kUuid, /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"http://url1.com", /*is_folder=*/false, MakeRandomPosition())); updates.back().entity.id = "Id2"; @@ -2184,7 +2184,7 @@ ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); histogram_tester.ExpectUniqueSample( "Sync.BookmarksGUIDDuplicates", - /*sample=*/ExpectedBookmarksGUIDDuplicates::kDifferentTypes, + /*sample=*/ExpectedBookmarksUuidDuplicates::kDifferentTypes, /*expected_bucket_count=*/1); EXPECT_THAT(tracker->GetEntityForSyncId("Id1"), NotNull()); EXPECT_THAT(tracker->GetEntityForSyncId("Id2"), IsNull()); @@ -2202,8 +2202,8 @@ // Create 10k+ bookmarks to verify reported metrics. for (size_t i = 0; i < 10001; ++i) { updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID::GenerateRandomV4(), - /*parent_guid=*/BookmarkBarGuid(), kTitle, + /*uuid=*/base::Uuid::GenerateRandomV4(), + /*parent_uuid=*/BookmarkBarUuid(), kTitle, /*url=*/"", /*is_folder=*/true, MakeRandomPosition())); }
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc index 86ee487..da650d9 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -6,8 +6,8 @@ #include <utility> -#include "base/guid.h" #include "base/no_destructor.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/sync/base/hash_util.h" @@ -160,7 +160,7 @@ DCHECK(parent_entity); const syncer::UniquePosition unique_position = - ComputePosition(*parent, index, node->guid().AsLowercaseString()); + ComputePosition(*parent, index, node->uuid().AsLowercaseString()); sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode( node, model, unique_position.ToProto(), /*force_favicon_load=*/true); @@ -169,7 +169,7 @@ // the tombstone was not committed yet. In that case the existing entity // should be updated. const SyncedBookmarkTrackerEntity* entity = - bookmark_tracker_->GetEntityForGUID(node->guid()); + bookmark_tracker_->GetEntityForUuid(node->uuid()); const base::Time creation_time = base::Time::Now(); if (entity) { // If there is a tracked entity with the same client tag hash (effectively @@ -180,7 +180,7 @@ bookmark_tracker_->Update(entity, entity->metadata().server_version(), creation_time, specifics); } else { - entity = bookmark_tracker_->Add(node, node->guid().AsLowercaseString(), + entity = bookmark_tracker_->Add(node, node->uuid().AsLowercaseString(), syncer::kUncommittedVersion, creation_time, specifics); }
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc index 6adbfe2..59889ba 100644 --- a/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_observer_impl_unittest.cc
@@ -186,7 +186,7 @@ ASSERT_THAT(local_changes.size(), 1U); EXPECT_THAT(local_changes[0]->bookmark_node(), Eq(bookmark_node)); EXPECT_THAT(local_changes[0]->metadata().server_id(), - Eq(bookmark_node->guid().AsLowercaseString())); + Eq(bookmark_node->uuid().AsLowercaseString())); } TEST_F(BookmarkModelObserverImplTest, @@ -907,7 +907,7 @@ const bookmarks::BookmarkNode* folder = bookmark_model()->AddFolder(bookmark_bar_node, 0, u"Title"); const syncer::ClientTagHash folder_client_tag_hash = - SyncedBookmarkTracker::GetClientTagHashFromGUID(folder->guid()); + SyncedBookmarkTracker::GetClientTagHashFromUuid(folder->uuid()); // Check that the bookmark was added by observer. const SyncedBookmarkTrackerEntity* folder_entity = bookmark_tracker()->GetEntityForBookmarkNode(folder);
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.cc b/components/sync_bookmarks/bookmark_model_type_processor.cc index 238a031..ab84151 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor.cc
@@ -201,7 +201,7 @@ absl::optional<sync_pb::GarbageCollectionDirective> gc_directive) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!model_type_state.cache_guid().empty()); - DCHECK_EQ(model_type_state.cache_guid(), cache_guid_); + DCHECK_EQ(model_type_state.cache_guid(), cache_uuid_); DCHECK(syncer::IsInitialSyncDone(model_type_state.initial_sync_state())); DCHECK(start_callback_.is_null()); // Processor should never connect if @@ -215,7 +215,7 @@ syncer::BOOKMARKS, /*is_initial_sync=*/!bookmark_tracker_, updates.size()); - // Clients before M94 did not populate the parent GUID in specifics. + // Clients before M94 did not populate the parent UUID in specifics. PopulateParentGuidInSpecifics(bookmark_tracker_.get(), &updates); if (!bookmark_tracker_) { @@ -383,7 +383,7 @@ if (bookmark_tracker_) { memory_usage += bookmark_tracker_->EstimateMemoryUsage(); } - memory_usage += EstimateMemoryUsage(cache_guid_); + memory_usage += EstimateMemoryUsage(cache_uuid_); return memory_usage; } @@ -402,11 +402,11 @@ DCHECK(favicon_service_); DVLOG(1) << "Sync is starting for Bookmarks"; - cache_guid_ = request.cache_guid; + cache_uuid_ = request.cache_guid; start_callback_ = std::move(start_callback); error_handler_ = request.error_handler; - DCHECK(!cache_guid_.empty()); + DCHECK(!cache_uuid_.empty()); DCHECK(error_handler_); ConnectIfReady(); } @@ -457,12 +457,12 @@ return; } - DCHECK(!cache_guid_.empty()); + DCHECK(!cache_uuid_.empty()); if (bookmark_tracker_ && - bookmark_tracker_->model_type_state().cache_guid() != cache_guid_) { + bookmark_tracker_->model_type_state().cache_guid() != cache_uuid_) { // TODO(crbug.com/820049): Add basic unit testing. - // In case of a cache guid mismatch, treat it as a corrupted metadata and + // In case of a cache uuid mismatch, treat it as a corrupted metadata and // start clean. StopTrackingMetadataAndResetTracker(); } @@ -476,7 +476,7 @@ sync_pb::ModelTypeState model_type_state; model_type_state.mutable_progress_marker()->set_data_type_id( GetSpecificsFieldNumberFromModelType(syncer::BOOKMARKS)); - model_type_state.set_cache_guid(cache_guid_); + model_type_state.set_cache_guid(cache_uuid_); activation_context->model_type_state = model_type_state; } activation_context->type_processor = @@ -495,7 +495,7 @@ DCHECK(bookmark_model_); DCHECK(!start_callback_); - cache_guid_.clear(); + cache_uuid_.clear(); worker_.reset(); switch (metadata_fate) {
diff --git a/components/sync_bookmarks/bookmark_model_type_processor.h b/components/sync_bookmarks/bookmark_model_type_processor.h index 12e0d42..1416e08 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor.h +++ b/components/sync_bookmarks/bookmark_model_type_processor.h
@@ -192,9 +192,9 @@ // uninitialized). bool last_initial_merge_remote_updates_exceeded_limit_ = false; - // GUID string that identifies the sync client and is received from the sync + // UUID string that identifies the sync client and is received from the sync // engine. - std::string cache_guid_; + std::string cache_uuid_; syncer::ModelErrorHandler error_handler_;
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc index 5c09bf6..c6e3532 100644 --- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc +++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -10,7 +10,6 @@ #include <vector> #include "base/functional/callback_helpers.h" -#include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" @@ -19,6 +18,7 @@ #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/test/test_bookmark_client.h" #include "components/favicon/core/test/mock_favicon_service.h" @@ -69,10 +69,10 @@ std::string server_tag; }; -MATCHER_P(CommitRequestDataMatchesGuid, guid, "") { +MATCHER_P(CommitRequestDataMatchesGuid, uuid, "") { const syncer::CommitRequestData* data = arg.get(); return data != nullptr && data->entity != nullptr && - data->entity->specifics.bookmark().guid() == guid.AsLowercaseString(); + data->entity->specifics.bookmark().guid() == uuid.AsLowercaseString(); } MATCHER_P(TrackedEntityCorrespondsToBookmarkNode, bookmark_node, "") { @@ -84,16 +84,16 @@ const BookmarkInfo& bookmark_info, const syncer::UniquePosition& unique_position, int response_version, - const base::GUID& guid) { + const base::Uuid& uuid) { syncer::EntityData data; data.id = bookmark_info.server_id; data.legacy_parent_id = bookmark_info.parent_id; data.server_defined_unique_tag = bookmark_info.server_tag; - data.originator_client_item_id = guid.AsLowercaseString(); + data.originator_client_item_id = uuid.AsLowercaseString(); sync_pb::BookmarkSpecifics* bookmark_specifics = data.specifics.mutable_bookmark(); - bookmark_specifics->set_guid(guid.AsLowercaseString()); + bookmark_specifics->set_guid(uuid.AsLowercaseString()); bookmark_specifics->set_legacy_canonicalized_title(bookmark_info.title); bookmark_specifics->set_full_title(bookmark_info.title); *bookmark_specifics->mutable_unique_position() = unique_position.ToProto(); @@ -117,7 +117,7 @@ int response_version) { return CreateUpdateResponseData(bookmark_info, unique_position, response_version, - base::GUID::GenerateRandomV4()); + base::Uuid::GenerateRandomV4()); } sync_pb::ModelTypeState CreateDummyModelTypeState() { @@ -140,7 +140,7 @@ bookmark_metadata.mutable_metadata()->set_server_id(server_id); bookmark_metadata.mutable_metadata()->set_client_tag_hash( syncer::ClientTagHash::FromUnhashed(syncer::BOOKMARKS, - node->guid().AsLowercaseString()) + node->uuid().AsLowercaseString()) .value()); *bookmark_metadata.mutable_metadata()->mutable_unique_position() = unique_position.ToProto(); @@ -276,7 +276,7 @@ } *model_metadata.add_bookmarks_metadata() = CreateNodeMetadata( - node, /*server_id=*/"id_" + node->guid().AsLowercaseString(), + node, /*server_id=*/"id_" + node->uuid().AsLowercaseString(), next_unique_position); next_unique_position = syncer::UniquePosition::After( next_unique_position, syncer::UniquePosition::RandomSuffix()); @@ -442,7 +442,7 @@ updates.push_back(CreateUpdateResponseData( {entity->metadata().server_id(), kNewTitle, kNewUrl, kBookmarkBarId, /*server_tag=*/std::string()}, - kRandomPosition, /*response_version=*/1, bookmark_node->guid())); + kRandomPosition, /*response_version=*/1, bookmark_node->uuid())); base::HistogramTester histogram_tester; processor()->OnUpdateReceived(CreateDummyModelTypeState(), std::move(updates), @@ -484,7 +484,7 @@ updates.push_back(CreateUpdateResponseData( {entity->metadata().server_id(), kTitle, kUrl.spec(), kBookmarkBarId, /*server_tag=*/std::string()}, - kRandomPosition, /*response_version=*/1, bookmark_node->guid())); + kRandomPosition, /*response_version=*/1, bookmark_node->uuid())); updates[0].response_version++; EXPECT_CALL(*schedule_save_closure(), Run()); @@ -787,7 +787,7 @@ gfx::Image()); ASSERT_TRUE(node->is_favicon_loaded()); EXPECT_THAT(GetLocalChangesFromProcessor(/*max_entries=*/10), - ElementsAre(CommitRequestDataMatchesGuid(node->guid()))); + ElementsAre(CommitRequestDataMatchesGuid(node->uuid()))); } TEST_F(BookmarkModelTypeProcessorTest, @@ -846,7 +846,7 @@ EXPECT_THAT(GetLocalChangesFromProcessor(/*max_entries=*/1), ElementsAre(CommitRequestDataMatchesGuid( - unsynced_entities[1]->bookmark_node()->guid()))); + unsynced_entities[1]->bookmark_node()->uuid()))); // |unsynced_entities[0]| has been excluded from the result above because the // favicon isn't loaded, but the loading process should have started now (see
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc index 34d055f..afefa4650 100644 --- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc +++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -11,12 +11,12 @@ #include <unordered_set> #include <utility> -#include "base/guid.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/ranges/algorithm.h" #include "base/trace_event/trace_event.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_metrics.h" @@ -55,11 +55,11 @@ kMissingParentNodeInConflict = 7, // Failed to create a bookmark. kCreationFailure = 8, - // The bookmark's GUID did not match the originator client item ID. + // The bookmark's UUID did not match the originator client item ID. kUnexpectedGuid = 9, // Parent is not a folder. kParentNotFolder = 10, - // The GUID changed for an already-tracked server ID. + // The UUID changed for an already-tracked server ID. kGuidChangedForTrackedServerId = 11, // An update to a permanent node received without a server-defined unique tag. kTrackedServerIdWithoutServerTagMatchesPermanentNode = 12, @@ -75,26 +75,26 @@ // emit updates in top-down order. |ordered_updates| must not be null because // traversed updates are appended to |*ordered_updates|. void TraverseAndAppendChildren( - const base::GUID& node_guid, - const std::unordered_multimap<base::GUID, + const base::Uuid& node_uuid, + const std::unordered_multimap<base::Uuid, const syncer::UpdateResponseData*, - base::GUIDHash>& guid_to_updates, - const std::unordered_map<base::GUID, - std::vector<base::GUID>, - base::GUIDHash>& node_to_children, + base::UuidHash>& uuid_to_updates, + const std::unordered_map<base::Uuid, + std::vector<base::Uuid>, + base::UuidHash>& node_to_children, std::vector<const syncer::UpdateResponseData*>* ordered_updates) { // If no children to traverse, we are done. - if (node_to_children.count(node_guid) == 0) { + if (node_to_children.count(node_uuid) == 0) { return; } // Recurse over all children. - for (const base::GUID& child : node_to_children.at(node_guid)) { - auto [begin, end] = guid_to_updates.equal_range(child); + for (const base::Uuid& child : node_to_children.at(node_uuid)) { + auto [begin, end] = uuid_to_updates.equal_range(child); DCHECK(begin != end); for (auto it = begin; it != end; ++it) { ordered_updates->push_back(it->second); } - TraverseAndAppendChildren(child, guid_to_updates, node_to_children, + TraverseAndAppendChildren(child, uuid_to_updates, node_to_children, ordered_updates); } } @@ -158,8 +158,8 @@ update_entity.client_tag_hash, update_entity.originator_cache_guid, update_entity.originator_client_item_id)) { - // Ignore updates with an unexpected GUID. - DLOG(ERROR) << "Couldn't process an update bookmark with unexpected GUID: " + // Ignore updates with an unexpected UUID. + DLOG(ERROR) << "Couldn't process an update bookmark with unexpected UUID: " << update_entity.specifics.bookmark().guid(); LogProblematicBookmark(RemoteBookmarkUpdateError::kUnexpectedGuid); return false; @@ -168,14 +168,14 @@ return true; } -// Determines the parent's GUID included in |update_entity|. |update_entity| +// Determines the parent's UUID included in |update_entity|. |update_entity| // must be a valid update as defined in IsValidUpdate(). -base::GUID GetParentGUIDInUpdate(const syncer::EntityData& update_entity) { +base::Uuid GetParentUuidInUpdate(const syncer::EntityData& update_entity) { DCHECK(IsValidUpdate(update_entity)); - base::GUID parent_guid = base::GUID::ParseLowercase( + base::Uuid parent_uuid = base::Uuid::ParseLowercase( update_entity.specifics.bookmark().parent_guid()); - DCHECK(parent_guid.is_valid()); - return parent_guid; + DCHECK(parent_uuid.is_valid()); + return parent_uuid; } void ApplyRemoteUpdate( @@ -194,8 +194,8 @@ DCHECK(tracker); DCHECK(favicon_service); DCHECK_EQ( - tracked_entity->bookmark_node()->guid(), - base::GUID::ParseLowercase(update_entity.specifics.bookmark().guid())); + tracked_entity->bookmark_node()->uuid(), + base::Uuid::ParseLowercase(update_entity.specifics.bookmark().guid())); const bookmarks::BookmarkNode* node = tracked_entity->bookmark_node(); const bookmarks::BookmarkNode* old_parent = node->parent(); @@ -294,10 +294,10 @@ update->response_version) { if (update_entity.id == tracked_entity->metadata().server_id()) { // Seen this update before. This update may be a reflection and may have - // missing the GUID in specifics. Next reupload will populate GUID in + // missing the UUID in specifics. Next reupload will populate UUID in // specifics and this codepath will not repeat indefinitely. This logic // is needed for the case when there is only one device and hence the - // GUID will not be set by other devices. + // UUID will not be set by other devices. ReuploadEntityIfNeeded(update_entity, tracked_entity); } continue; @@ -318,7 +318,7 @@ // fast enough(e.g. before shutdown or crash), then the |bookmark_tracker_| // might assume that it was never committed. The server will track the // client that sent up the original commit and return this in a get updates - // response. This also may happen due to duplicate GUIDs. In this case it's + // response. This also may happen due to duplicate UUIDs. In this case it's // better to update to the latest server ID. if (tracked_entity) { bookmark_tracker_->UpdateSyncIdIfNeeded(tracked_entity, @@ -428,15 +428,15 @@ // 3. Start at each root in |roots|, emit the update and recurse over its // children. - // Normally there shouldn't be multiple updates for the same GUID, but let's + // Normally there shouldn't be multiple updates for the same UUID, but let's // avoiding dedupping here just in case (e.g. the could in theory be a // combination of client-tagged and non-client-tagged updated that // ModelTypeWorker failed to deduplicate. - std::unordered_multimap<base::GUID, const syncer::UpdateResponseData*, - base::GUIDHash> - guid_to_updates; + std::unordered_multimap<base::Uuid, const syncer::UpdateResponseData*, + base::UuidHash> + uuid_to_updates; - // Add only valid, non-deletions to |guid_to_updates|. + // Add only valid, non-deletions to |uuid_to_updates|. int invalid_updates_count = 0; int root_node_updates_count = 0; for (const syncer::UpdateResponseData& update : *updates) { @@ -453,34 +453,34 @@ ++invalid_updates_count; continue; } - base::GUID guid = - base::GUID::ParseLowercase(update_entity.specifics.bookmark().guid()); - DCHECK(guid.is_valid()); - guid_to_updates.emplace(std::move(guid), &update); + base::Uuid uuid = + base::Uuid::ParseLowercase(update_entity.specifics.bookmark().guid()); + DCHECK(uuid.is_valid()); + uuid_to_updates.emplace(std::move(uuid), &update); } - // Iterate over |guid_to_updates| and construct |roots| and + // Iterate over |uuid_to_updates| and construct |roots| and // |parent_to_children|. - std::set<base::GUID> roots; - std::unordered_map<base::GUID, std::vector<base::GUID>, base::GUIDHash> + std::set<base::Uuid> roots; + std::unordered_map<base::Uuid, std::vector<base::Uuid>, base::UuidHash> parent_to_children; - for (const auto& [guid, update] : guid_to_updates) { - base::GUID parent_guid = GetParentGUIDInUpdate(update->entity); - base::GUID child_guid = - base::GUID::ParseLowercase(update->entity.specifics.bookmark().guid()); - DCHECK(child_guid.is_valid()); + for (const auto& [uuid, update] : uuid_to_updates) { + base::Uuid parent_uuid = GetParentUuidInUpdate(update->entity); + base::Uuid child_uuid = + base::Uuid::ParseLowercase(update->entity.specifics.bookmark().guid()); + DCHECK(child_uuid.is_valid()); - parent_to_children[parent_guid].emplace_back(std::move(child_guid)); + parent_to_children[parent_uuid].emplace_back(std::move(child_uuid)); // If this entity's parent has no pending update, add it to |roots|. - if (guid_to_updates.count(parent_guid) == 0) { - roots.insert(std::move(parent_guid)); + if (uuid_to_updates.count(parent_uuid) == 0) { + roots.insert(std::move(parent_uuid)); } } // |roots| contains only root of all trees in the forest all of which are // ready to be processed because none has a pending update. std::vector<const syncer::UpdateResponseData*> ordered_updates; - for (const base::GUID& root : roots) { - TraverseAndAppendChildren(root, guid_to_updates, parent_to_children, + for (const base::Uuid& root : roots) { + TraverseAndAppendChildren(root, uuid_to_updates, parent_to_children, &ordered_updates); } // Add deletions. @@ -515,7 +515,7 @@ const syncer::ClientTagHash client_tag_hash_in_update = !update_entity.client_tag_hash.value().empty() ? update_entity.client_tag_hash - : SyncedBookmarkTracker::GetClientTagHashFromGUID( + : SyncedBookmarkTracker::GetClientTagHashFromUuid( InferGuidFromLegacyOriginatorId( update_entity.originator_cache_guid, update_entity.originator_client_item_id)); @@ -533,7 +533,7 @@ return tracked_entity_by_client_tag; } - // Client-tags (GUIDs) are known at all times and immutable (as opposed to + // Client-tags (UUIDs) are known at all times and immutable (as opposed to // server IDs which get a temp value for local creations), so they cannot have // changed. if (tracked_entity_by_sync_id && @@ -543,7 +543,7 @@ // protocol violation. This should be practically unreachable, but guard // against misbehaving servers. DLOG(ERROR) << "Ignoring remote bookmark update with protocol violation: " - "GUID must be immutable"; + "UUID must be immutable"; LogProblematicBookmark( RemoteBookmarkUpdateError::kGuidChangedForTrackedServerId); *should_ignore_update = true; @@ -614,7 +614,7 @@ DCHECK(old_parent->is_folder()); const SyncedBookmarkTrackerEntity* new_parent_entity = - bookmark_tracker_->GetEntityForGUID(GetParentGUIDInUpdate(update_entity)); + bookmark_tracker_->GetEntityForUuid(GetParentUuidInUpdate(update_entity)); if (!new_parent_entity) { LogProblematicBookmark(RemoteBookmarkUpdateError::kMissingParentEntity); return; @@ -724,7 +724,7 @@ DCHECK(old_parent->is_folder()); const SyncedBookmarkTrackerEntity* new_parent_entity = - bookmark_tracker_->GetEntityForGUID(GetParentGUIDInUpdate(update_entity)); + bookmark_tracker_->GetEntityForUuid(GetParentUuidInUpdate(update_entity)); // The |new_parent_entity| could be null in some racy conditions. For // example, when a client A moves a node and deletes the old parent and @@ -793,7 +793,7 @@ DCHECK(IsValidBookmarkSpecifics(update_entity.specifics.bookmark())); const SyncedBookmarkTrackerEntity* parent_entity = - bookmark_tracker_->GetEntityForGUID(GetParentGUIDInUpdate(update_entity)); + bookmark_tracker_->GetEntityForUuid(GetParentUuidInUpdate(update_entity)); if (!parent_entity) { return nullptr; }
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc index 3344917..05adf3a 100644 --- a/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc +++ b/components/sync_bookmarks/bookmark_remote_updates_handler_unittest.cc
@@ -8,13 +8,13 @@ #include <string> #include <utility> -#include "base/guid.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/common/bookmark_metrics.h" #include "components/bookmarks/test/test_bookmark_client.h" @@ -84,20 +84,20 @@ // generally opaque for the client but deterministic given |guid|, because the // sync ID is roughly a hashed GUID, at least in normal circumnstances where the // GUID is used either as client tag hash or as originator client item ID. -std::string GetFakeServerIdFromGUID(const base::GUID& guid) { +std::string GetFakeServerIdFromGUID(const base::Uuid& guid) { // For convenience in tests, |guid| may refer to permanent nodes too, // and yet the returned sync ID will honor the sync ID constants for permanent // nodes. if (guid.AsLowercaseString() == - bookmarks::BookmarkNode::kBookmarkBarNodeGuid) { + bookmarks::BookmarkNode::kBookmarkBarNodeUuid) { return kBookmarkBarId; } if (guid.AsLowercaseString() == - bookmarks::BookmarkNode::kOtherBookmarksNodeGuid) { + bookmarks::BookmarkNode::kOtherBookmarksNodeUuid) { return kOtherBookmarksId; } if (guid.AsLowercaseString() == - bookmarks::BookmarkNode::kMobileBookmarksNodeGuid) { + bookmarks::BookmarkNode::kMobileBookmarksNodeUuid) { return kMobileBookmarksId; } return base::StrCat({"server_id_for_", guid.AsLowercaseString()}); @@ -111,10 +111,10 @@ sync_pb::BookmarkMetadata bookmark_metadata; bookmark_metadata.set_id(node->id()); bookmark_metadata.mutable_metadata()->set_server_id( - GetFakeServerIdFromGUID(node->guid())); + GetFakeServerIdFromGUID(node->uuid())); bookmark_metadata.mutable_metadata()->set_client_tag_hash( syncer::ClientTagHash::FromUnhashed(syncer::BOOKMARKS, - node->guid().AsLowercaseString()) + node->uuid().AsLowercaseString()) .value()); *bookmark_metadata.mutable_metadata()->mutable_unique_position() = unique_position.ToProto(); @@ -151,7 +151,7 @@ return model_metadata; } -syncer::UpdateResponseData CreateTombstoneResponseData(const base::GUID& guid, +syncer::UpdateResponseData CreateTombstoneResponseData(const base::Uuid& guid, int version) { syncer::EntityData data; data.id = GetFakeServerIdFromGUID(guid); @@ -167,8 +167,8 @@ } syncer::UpdateResponseData CreateUpdateResponseData( - const base::GUID& guid, - const base::GUID& parent_guid, + const base::Uuid& guid, + const base::Uuid& parent_guid, const std::string& title, int version, const syncer::UniquePosition& unique_position) { @@ -193,8 +193,8 @@ // Overload that assign a random position. Should only be used when the title, // version and position are irrelevant. syncer::UpdateResponseData CreateUpdateResponseData( - const base::GUID& guid, - const base::GUID& parent_guid) { + const base::Uuid& guid, + const base::Uuid& parent_guid) { return CreateUpdateResponseData( guid, parent_guid, base::StrCat({"Title for ", guid.AsLowercaseString()}), /*version=*/0, RandomUniquePosition()); @@ -261,8 +261,8 @@ favicon::MockFaviconService* favicon_service() { return &favicon_service_; } BookmarkRemoteUpdatesHandler* updates_handler() { return &updates_handler_; } - const base::GUID kBookmarkBarGuid = - base::GUID::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + const base::Uuid kBookmarkBarGuid = + base::Uuid::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); private: std::unique_ptr<bookmarks::BookmarkModel> bookmark_model_; @@ -293,14 +293,14 @@ ShouldIgnoreInvalidSpecifics) { const std::string kTitle = "title"; const syncer::UniquePosition kPosition = RandomUniquePosition(); - const base::GUID kBookmarkBarGuid = - base::GUID::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + const base::Uuid kBookmarkBarGuid = + base::Uuid::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); syncer::UpdateResponseDataList updates; // Create update with an invalid GUID. updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID(), + /*guid=*/base::Uuid(), /*parent_guid=*/kBookmarkBarGuid, /*title=*/kTitle, /*version=*/0, @@ -321,8 +321,8 @@ TEST(BookmarkRemoteUpdatesHandlerReorderUpdatesTest, ShouldReorderParentsUpdateBeforeChildrenAndBothBeforeDeletions) { - const base::GUID kBookmarkBarGuid = - base::GUID::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + const base::Uuid kBookmarkBarGuid = + base::Uuid::ParseLowercase(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); // Prepare creation updates to build this structure: // bookmark_bar @@ -337,11 +337,11 @@ // Constuct the updates list to have deletion first, and then all creations in // reverse shuffled order (from child to parent). - std::vector<base::GUID> guids; + std::vector<base::Uuid> guids; for (int i = 0; i < 7; i++) { // Use non-random GUIDs to produce a deterministic test outcome, since the // precise sync IDs can change the final order in ways that don't matter. - guids.push_back(base::GUID::ParseLowercase( + guids.push_back(base::Uuid::ParseLowercase( base::StringPrintf("00000000-0000-4000-a000-00000000000%d", i))); } @@ -397,9 +397,9 @@ // |- node1 // |- node2 - const base::GUID kGuid0 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid0 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid2 = base::Uuid::GenerateRandomV4(); // Constuct the updates list to have creations randomly ordered. syncer::UpdateResponseDataList updates; @@ -421,19 +421,19 @@ const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); - EXPECT_THAT(bookmark_bar_node->children().front()->guid(), Eq(kGuid0)); + EXPECT_THAT(bookmark_bar_node->children().front()->uuid(), Eq(kGuid0)); ASSERT_THAT(bookmark_bar_node->children().front()->children().size(), Eq(1u)); const bookmarks::BookmarkNode* grandchild = bookmark_bar_node->children().front()->children().front().get(); - EXPECT_THAT(grandchild->guid(), Eq(kGuid1)); + EXPECT_THAT(grandchild->uuid(), Eq(kGuid1)); ASSERT_THAT(grandchild->children().size(), Eq(1u)); - EXPECT_THAT(grandchild->children().front()->guid(), Eq(kGuid2)); + EXPECT_THAT(grandchild->children().front()->uuid(), Eq(kGuid2)); EXPECT_THAT(grandchild->children().front()->children().size(), Eq(0u)); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldLogFreshnessToUma) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; updates.push_back(CreateUpdateResponseData(/*guid=*/kGuid, @@ -484,9 +484,9 @@ // |- node1 // |- node2 - const base::GUID kGuid0 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid0 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid2 = base::Uuid::GenerateRandomV4(); // Construct the updates list to create that structure syncer::UpdateResponseDataList updates; @@ -522,7 +522,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldProcessDeletionWithServerIdOnly) { - const base::GUID kGuid0 = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid0 = base::Uuid::GenerateRandomV4(); // Construct the updates list to create that structure syncer::UpdateResponseDataList updates; @@ -558,7 +558,7 @@ // Create update with an invalid GUID. updates.push_back(CreateUpdateResponseData( - /*guid=*/base::GUID(), + /*guid=*/base::Uuid(), /*parent_guid=*/kBookmarkBarGuid, /*title=*/kTitle, /*version=*/0, @@ -577,8 +577,8 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldIgnoreRemoteCreationWithUnexpectedGuidInSpecifics) { - const base::GUID kOriginalGuid = base::GUID::GenerateRandomV4(); - const base::GUID kGuidInSpecifics = base::GUID::GenerateRandomV4(); + const base::Uuid kOriginalGuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuidInSpecifics = base::Uuid::GenerateRandomV4(); const std::string kTitle = "title"; const syncer::UniquePosition kPosition = RandomUniquePosition(); @@ -600,8 +600,8 @@ base::HistogramTester histogram_tester; updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - EXPECT_THAT(tracker()->GetEntityForGUID(kOriginalGuid), IsNull()); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuidInSpecifics), IsNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kOriginalGuid), IsNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuidInSpecifics), IsNull()); histogram_tester.ExpectBucketCount( "Sync.ProblematicServerSideBookmarks", @@ -612,8 +612,8 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldIgnoreMisbehavingServerWithRemoteGuidUpdate) { const std::string kTitle = "title"; - const base::GUID kOldGuid = base::GUID::GenerateRandomV4(); - const base::GUID kNewGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kOldGuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kNewGuid = base::Uuid::GenerateRandomV4(); const syncer::UniquePosition kPosition = RandomUniquePosition(); syncer::UpdateResponseDataList updates; @@ -628,8 +628,8 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - ASSERT_THAT(tracker()->GetEntityForGUID(kOldGuid), NotNull()); - ASSERT_THAT(tracker()->GetEntityForGUID(kNewGuid), IsNull()); + ASSERT_THAT(tracker()->GetEntityForUuid(kOldGuid), NotNull()); + ASSERT_THAT(tracker()->GetEntityForUuid(kNewGuid), IsNull()); // Push an update for the same entity with a new GUID. Note that this is a // protocol violation, because |originator_client_item_id| cannot have changed @@ -647,14 +647,14 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - EXPECT_THAT(tracker()->GetEntityForGUID(kOldGuid), NotNull()); - EXPECT_THAT(tracker()->GetEntityForGUID(kNewGuid), IsNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kOldGuid), NotNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kNewGuid), IsNull()); // The GUID should not have been updated. const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); - EXPECT_THAT(bookmark_bar_node->children().front()->guid(), Eq(kOldGuid)); + EXPECT_THAT(bookmark_bar_node->children().front()->uuid(), Eq(kOldGuid)); histogram_tester.ExpectBucketCount( "Sync.ProblematicServerSideBookmarks", @@ -670,8 +670,8 @@ // Push an update for a permanent entity, but without a unique server tag. syncer::UpdateResponseDataList updates; updates.push_back(CreateUpdateResponseData( - /*guid=*/bookmark_model()->bookmark_bar_node()->guid(), - /*parent_guid=*/base::GUID::GenerateRandomV4(), + /*guid=*/bookmark_model()->bookmark_bar_node()->uuid(), + /*parent_guid=*/base::Uuid::GenerateRandomV4(), /*title=*/"title", /*version=*/1, /*unique_position=*/RandomUniquePosition())); @@ -696,9 +696,9 @@ // |- node1 // |- node2 - const base::GUID kGuid0 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid1 = base::GUID::GenerateRandomV4(); - const base::GUID kGuid2 = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid0 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid1 = base::Uuid::GenerateRandomV4(); + const base::Uuid kGuid2 = base::Uuid::GenerateRandomV4(); const std::string kTitle0 = "title 0"; const std::string kTitle1 = "title 1"; @@ -736,9 +736,9 @@ const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); ASSERT_THAT(bookmark_bar_node->children().size(), Eq(3u)); - EXPECT_THAT(bookmark_bar_node->children()[0]->guid(), Eq(kGuid0)); - EXPECT_THAT(bookmark_bar_node->children()[1]->guid(), Eq(kGuid1)); - EXPECT_THAT(bookmark_bar_node->children()[2]->guid(), Eq(kGuid2)); + EXPECT_THAT(bookmark_bar_node->children()[0]->uuid(), Eq(kGuid0)); + EXPECT_THAT(bookmark_bar_node->children()[1]->uuid(), Eq(kGuid1)); + EXPECT_THAT(bookmark_bar_node->children()[2]->uuid(), Eq(kGuid2)); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, @@ -752,7 +752,7 @@ // |- node4 std::vector<std::string> ids; - std::vector<base::GUID> guids; + std::vector<base::Uuid> guids; std::vector<syncer::UniquePosition> positions; syncer::UniquePosition position = syncer::UniquePosition::InitialPosition( @@ -760,7 +760,7 @@ syncer::UpdateResponseDataList updates; for (int i = 0; i < 5; i++) { ids.push_back("node" + base::NumberToString(i)); - guids.push_back(base::GUID::GenerateRandomV4()); + guids.push_back(base::Uuid::GenerateRandomV4()); position = syncer::UniquePosition::After( position, syncer::UniquePosition::RandomSuffix()); positions.push_back(position); @@ -800,7 +800,7 @@ // Model should have been updated. ASSERT_THAT(bookmark_bar_node->children().size(), Eq(5u)); - EXPECT_THAT(bookmark_bar_node->children()[2]->guid(), Eq(guids[3])); + EXPECT_THAT(bookmark_bar_node->children()[2]->uuid(), Eq(guids[3])); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, @@ -814,7 +814,7 @@ // |- node4 std::vector<std::string> ids; - std::vector<base::GUID> guids; + std::vector<base::Uuid> guids; std::vector<syncer::UniquePosition> positions; syncer::UniquePosition position = syncer::UniquePosition::InitialPosition( @@ -822,7 +822,7 @@ syncer::UpdateResponseDataList updates; for (int i = 0; i < 5; i++) { ids.push_back("node" + base::NumberToString(i)); - guids.push_back(base::GUID::GenerateRandomV4()); + guids.push_back(base::Uuid::GenerateRandomV4()); position = syncer::UniquePosition::After( position, syncer::UniquePosition::RandomSuffix()); positions.push_back(position); @@ -862,7 +862,7 @@ // Model should have been updated. ASSERT_THAT(bookmark_bar_node->children().size(), Eq(5u)); - EXPECT_THAT(bookmark_bar_node->children()[3]->guid(), Eq(guids[1])); + EXPECT_THAT(bookmark_bar_node->children()[3]->uuid(), Eq(guids[1])); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, @@ -876,7 +876,7 @@ // |- node4 std::vector<std::string> ids; - std::vector<base::GUID> guids; + std::vector<base::Uuid> guids; std::vector<syncer::UniquePosition> positions; syncer::UniquePosition position = syncer::UniquePosition::InitialPosition( @@ -884,7 +884,7 @@ syncer::UpdateResponseDataList updates; for (int i = 0; i < 5; i++) { ids.push_back("node" + base::NumberToString(i)); - guids.push_back(base::GUID::GenerateRandomV4()); + guids.push_back(base::Uuid::GenerateRandomV4()); position = syncer::UniquePosition::After( position, syncer::UniquePosition::RandomSuffix()); positions.push_back(position); @@ -923,7 +923,7 @@ // Model should have been updated. ASSERT_THAT(bookmark_bar_node->children().size(), Eq(4u)); ASSERT_THAT(bookmark_bar_node->children()[1]->children().size(), Eq(1u)); - EXPECT_THAT(bookmark_bar_node->children()[1]->children()[0]->guid(), + EXPECT_THAT(bookmark_bar_node->children()[1]->children()[0]->uuid(), Eq(guids[4])); } @@ -932,8 +932,8 @@ // Prepare creation updates to construct this structure: // bookmark_bar - const base::GUID kMissingParentGuid = base::GUID::GenerateRandomV4(); - const base::GUID kChildGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kMissingParentGuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kChildGuid = base::Uuid::GenerateRandomV4(); const std::string kChildId = "child_id"; const std::string kTitle = "Title"; const GURL kUrl("http://www.url.com"); @@ -966,8 +966,8 @@ // |- node0 (is_folder=false) // |- node1 - const base::GUID kParentGuid = base::GUID::GenerateRandomV4(); - const base::GUID kChildGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kParentGuid = base::Uuid::GenerateRandomV4(); + const base::Uuid kChildGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; const GURL kUrl("http://www.url.com"); @@ -978,7 +978,7 @@ data.specifics.mutable_bookmark(); bookmark_specifics->set_guid(kParentGuid.AsLowercaseString()); bookmark_specifics->set_parent_guid( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); bookmark_specifics->set_legacy_canonicalized_title(kTitle); bookmark_specifics->set_url(kUrl.spec()); bookmark_specifics->set_type(sync_pb::BookmarkSpecifics::URL); @@ -1028,9 +1028,9 @@ sync_pb::BookmarkSpecifics* bookmark_specifics = data.specifics.mutable_bookmark(); bookmark_specifics->set_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); bookmark_specifics->set_parent_guid( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); // Use the server id as the title for simplicity. bookmark_specifics->set_legacy_canonicalized_title(kTitle); bookmark_specifics->set_url(kUrl.spec()); @@ -1072,9 +1072,9 @@ sync_pb::BookmarkSpecifics* bookmark_specifics = data.specifics.mutable_bookmark(); bookmark_specifics->set_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); bookmark_specifics->set_parent_guid( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); // Use the server id as the title for simplicity. bookmark_specifics->set_legacy_canonicalized_title(kTitle); bookmark_specifics->set_url(kUrl.spec()); @@ -1105,7 +1105,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldUpdateSyncIdWhenRecevingUpdateForNewlyCreatedLocalNode) { const std::string kCacheGuid = "generated_id"; - const base::GUID kBookmarkGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kBookmarkGuid = base::Uuid::GenerateRandomV4(); const std::string kOriginatorClientItemId = kBookmarkGuid.AsLowercaseString(); const std::string kSyncId = "server_id"; const int64_t kServerVersion = 1000; @@ -1118,9 +1118,9 @@ sync_pb::EntitySpecifics specifics; sync_pb::BookmarkSpecifics* bookmark_specifics = specifics.mutable_bookmark(); bookmark_specifics->set_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); bookmark_specifics->set_parent_guid( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bookmarks::BookmarkNode::kBookmarkBarNodeUuid); bookmark_specifics->set_legacy_canonicalized_title("Title"); bookmark_specifics->set_type(sync_pb::BookmarkSpecifics::FOLDER); *bookmark_specifics->mutable_unique_position() = @@ -1128,7 +1128,7 @@ ASSERT_TRUE(IsValidBookmarkSpecifics(*bookmark_specifics)); - bookmarks::BookmarkNode parent(/*id=*/1, base::GUID::GenerateRandomV4(), + bookmarks::BookmarkNode parent(/*id=*/1, base::Uuid::GenerateRandomV4(), GURL()); bookmarks::BookmarkNode* node = parent.Add(std::make_unique<bookmarks::BookmarkNode>( @@ -1177,12 +1177,12 @@ TEST_F( BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldUpdateSyncIdWhenRecevingUpdateForNewlyCreatedLocalNodeWithClientTag) { - const base::GUID kBookmarkGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kBookmarkGuid = base::Uuid::GenerateRandomV4(); const std::string kSyncId = "server_id"; const int64_t kServerVersion = 1000; const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); - bookmarks::BookmarkNode parent(/*id=*/1, base::GUID::GenerateRandomV4(), + bookmarks::BookmarkNode parent(/*id=*/1, base::Uuid::GenerateRandomV4(), GURL()); sync_pb::ModelTypeState model_type_state; @@ -1192,7 +1192,7 @@ sync_pb::EntitySpecifics specifics; sync_pb::BookmarkSpecifics* bookmark_specifics = specifics.mutable_bookmark(); bookmark_specifics->set_guid(kBookmarkGuid.AsLowercaseString()); - bookmark_specifics->set_parent_guid(parent.guid().AsLowercaseString()); + bookmark_specifics->set_parent_guid(parent.uuid().AsLowercaseString()); bookmark_specifics->set_legacy_canonicalized_title("Title"); bookmark_specifics->set_type(sync_pb::BookmarkSpecifics::FOLDER); *bookmark_specifics->mutable_unique_position() = @@ -1246,7 +1246,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldRecommitWhenEncryptionIsOutOfDate) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); sync_pb::ModelTypeState model_type_state; model_type_state.set_encryption_key_name("encryption_key_name"); @@ -1261,15 +1261,15 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid), NotNull()); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid)->IsUnsynced(), Eq(true)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid), NotNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid)->IsUnsynced(), Eq(true)); } // Tests that recommit will be initiated in case when there is a local tombstone // and server's update has out of date encryption. TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldRecommitWhenEncryptionIsOutOfDateOnConflict) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); sync_pb::ModelTypeState model_type_state; model_type_state.set_encryption_key_name("encryption_key_name"); @@ -1289,10 +1289,10 @@ /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->bookmark_node(), NotNull()); - ASSERT_THAT(entity->bookmark_node()->guid(), Eq(kGuid)); + ASSERT_THAT(entity->bookmark_node()->uuid(), Eq(kGuid)); auto* node = entity->bookmark_node(); tracker()->MarkDeleted(entity); @@ -1317,7 +1317,7 @@ /*got_new_encryption_requirements=*/false); // |entity| may be deleted here while processing update during conflict // resolution. - entity = tracker()->GetEntityForGUID(kGuid); + entity = tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); EXPECT_THAT(entity->IsUnsynced(), Eq(true)); EXPECT_THAT(entity->bookmark_node(), NotNull()); @@ -1325,19 +1325,19 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldRecommitWhenGotNewEncryptionRequirements) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; updates.push_back(CreateUpdateResponseData(/*guid=*/kGuid, /*parent_guid=*/kBookmarkBarGuid)); updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid), NotNull()); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid)->IsUnsynced(), Eq(false)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid), NotNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid)->IsUnsynced(), Eq(false)); updates_handler()->Process(syncer::UpdateResponseDataList(), /*got_new_encryption_requirements=*/true); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid)->IsUnsynced(), Eq(true)); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid)->IsUnsynced(), Eq(true)); // Permanent nodes shouldn't be committed. They are only created on the server // and synced down. EXPECT_THAT(tracker()->GetEntityForSyncId(kBookmarkBarId)->IsUnsynced(), @@ -1353,7 +1353,7 @@ // Create the bookmark with same encryption key name. const std::string kTitle = "title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; syncer::UpdateResponseData response_data = @@ -1369,13 +1369,13 @@ bookmark_model()->bookmark_bar_node(); ASSERT_THAT(bookmark_bar_node->children().size(), Eq(1u)); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); // Mark the entity as deleted locally. tracker()->MarkDeleted(entity); tracker()->IncrementSequenceNumber(entity); - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid)->IsUnsynced(), Eq(true)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid)->IsUnsynced(), Eq(true)); // Remove the bookmark from the local bookmark model. bookmark_model()->Remove(bookmark_bar_node->children().front().get(), @@ -1398,20 +1398,20 @@ // There should have been conflict, and it should have been resolved by // removing local entity since both changes are deletions. - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid), IsNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid), IsNull()); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldNotRecommitUptoDateEntitiesWhenGotNewEncryptionRequirements) { - const base::GUID kGuid0 = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid0 = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; updates.push_back(CreateUpdateResponseData(/*guid=*/kGuid0, /*parent_guid=*/kBookmarkBarGuid)); updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid0), NotNull()); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid0)->IsUnsynced(), Eq(false)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid0), NotNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid0)->IsUnsynced(), Eq(false)); // Push another update to for the same entity. syncer::UpdateResponseData response_data = @@ -1425,13 +1425,13 @@ new_updates.push_back(std::move(response_data)); updates_handler()->Process(new_updates, /*got_new_encryption_requirements=*/true); - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid0)->IsUnsynced(), Eq(false)); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid0)->IsUnsynced(), Eq(false)); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldResolveConflictBetweenLocalAndRemoteDeletionsByMatchingThem) { const std::string kTitle = "title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; @@ -1445,7 +1445,7 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->IsUnsynced(), Eq(false)); const bookmarks::BookmarkNode* bookmark_bar_node = @@ -1473,7 +1473,7 @@ // There should have been conflict, and it should have been resolved by // removing local entity since both changes are deletions. - EXPECT_THAT(tracker()->GetEntityForGUID(kGuid), IsNull()); + EXPECT_THAT(tracker()->GetEntityForUuid(kGuid), IsNull()); // Make sure the bookmark hasn't been resurrected. EXPECT_THAT(bookmark_bar_node->children().size(), Eq(0u)); } @@ -1481,7 +1481,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldResolveConflictBetweenLocalUpdateAndRemoteDeletionWithLocal) { const std::string kTitle = "title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; @@ -1495,7 +1495,7 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->IsUnsynced(), Eq(false)); @@ -1514,7 +1514,7 @@ // There should have been conflict, and it should have been resolved with the // local version that will be committed later. - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid), Eq(entity)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid), Eq(entity)); EXPECT_THAT(entity->IsUnsynced(), Eq(true)); const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); @@ -1524,7 +1524,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldResolveConflictBetweenLocalDeletionAndRemoteUpdateByRemote) { const std::string kTitle = "title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; @@ -1538,10 +1538,10 @@ updates_handler()->Process(updates, /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->bookmark_node(), NotNull()); - ASSERT_THAT(entity->bookmark_node()->guid(), Eq(kGuid)); + ASSERT_THAT(entity->bookmark_node()->uuid(), Eq(kGuid)); ASSERT_THAT(entity->IsUnsynced(), Eq(false)); const bookmarks::BookmarkNode* bookmark_bar_node = @@ -1573,7 +1573,7 @@ // There should have been conflict, and it should have been resolved with the // remote version. The implementation may or may not reuse |entity|, so let's // look it up again. - entity = tracker()->GetEntityForGUID(kGuid); + entity = tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); EXPECT_THAT(entity->IsUnsynced(), Eq(false)); EXPECT_THAT(entity->metadata().is_deleted(), Eq(false)); @@ -1584,7 +1584,7 @@ TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldResolveConflictBetweenLocalAndRemoteUpdatesWithMatchingThem) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "title"; syncer::UpdateResponseDataList updates; @@ -1600,7 +1600,7 @@ /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->IsUnsynced(), Eq(false)); @@ -1622,13 +1622,13 @@ // There should have been conflict but both local and remote updates should // match. The conflict should have been resolved. - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid), Eq(entity)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid), Eq(entity)); EXPECT_THAT(entity->IsUnsynced(), Eq(false)); } TEST_F(BookmarkRemoteUpdatesHandlerWithInitialMergeTest, ShouldResolveConflictBetweenLocalAndRemoteUpdatesWithRemote) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "title"; const std::string kNewRemoteTitle = "remote title"; @@ -1646,7 +1646,7 @@ updates_handler.Process(updates, /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_THAT(entity->IsUnsynced(), Eq(false)); @@ -1667,7 +1667,7 @@ // There should have been conflict, and it should have been resolved with the // remote version. - ASSERT_THAT(tracker()->GetEntityForGUID(kGuid), Eq(entity)); + ASSERT_THAT(tracker()->GetEntityForUuid(kGuid), Eq(entity)); EXPECT_THAT(entity->IsUnsynced(), Eq(false)); const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); @@ -1681,7 +1681,7 @@ base::test::ScopedFeatureList override_features; override_features.InitAndEnableFeature(switches::kSyncReuploadBookmarks); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; updates.push_back( @@ -1697,7 +1697,7 @@ /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_FALSE(entity->IsUnsynced()); @@ -1717,7 +1717,7 @@ ShouldIncrementSequenceNumberOnConflict) { base::test::ScopedFeatureList override_features; override_features.InitAndEnableFeature(switches::kSyncReuploadBookmarks); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "title"; const std::string kNewTitle = "New title"; @@ -1740,7 +1740,7 @@ } const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_TRUE(entity->IsUnsynced()); @@ -1783,7 +1783,7 @@ ShouldIncrementSequenceNumberOnUpdate) { base::test::ScopedFeatureList override_features; override_features.InitAndEnableFeature(switches::kSyncReuploadBookmarks); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "title"; const std::string kRemoteTitle = "New title"; @@ -1802,7 +1802,7 @@ } const SyncedBookmarkTrackerEntity* entity = - tracker()->GetEntityForGUID(kGuid); + tracker()->GetEntityForUuid(kGuid); ASSERT_THAT(entity, NotNull()); ASSERT_FALSE(entity->IsUnsynced()); @@ -1836,8 +1836,8 @@ const std::string kFolder1Title = "folder1"; const std::string kFolder2Title = "folder2"; - const base::GUID kFolder1Guid = base::GUID::GenerateRandomV4(); - const base::GUID kFolder2Guid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolder1Guid = base::Uuid::GenerateRandomV4(); + const base::Uuid kFolder2Guid = base::Uuid::GenerateRandomV4(); syncer::UpdateResponseDataList updates; updates.push_back(CreateUpdateResponseData( @@ -1865,9 +1865,9 @@ /*got_new_encryption_requirements=*/false); const SyncedBookmarkTrackerEntity* entity1 = - tracker()->GetEntityForGUID(kFolder1Guid); + tracker()->GetEntityForUuid(kFolder1Guid); const SyncedBookmarkTrackerEntity* entity2 = - tracker()->GetEntityForGUID(kFolder2Guid); + tracker()->GetEntityForUuid(kFolder2Guid); ASSERT_THAT(entity1, NotNull()); ASSERT_THAT(entity2, NotNull()); @@ -1882,7 +1882,7 @@ base::test::ScopedFeatureList override_features; override_features.InitAndEnableFeature(switches::kSyncReuploadBookmarks); const std::string kFolderTitle = "folder"; - const base::GUID kFolderGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kFolderGuid = base::Uuid::GenerateRandomV4(); const bookmarks::BookmarkNode* bookmark_bar_node = bookmark_model()->bookmark_bar_node(); @@ -1903,7 +1903,7 @@ ASSERT_EQ(4u, tracker->GetAllEntities().size()); const SyncedBookmarkTrackerEntity* entity = - tracker->GetEntityForGUID(kFolderGuid); + tracker->GetEntityForUuid(kFolderGuid); ASSERT_THAT(entity, NotNull()); ASSERT_FALSE(entity->IsUnsynced()); @@ -1924,7 +1924,7 @@ bookmark_model(), favicon_service(), tracker.get()); updates_handler.Process(std::move(updates), /*got_new_encryption_requirements=*/false); - ASSERT_EQ(entity, tracker->GetEntityForGUID(kFolderGuid)); + ASSERT_EQ(entity, tracker->GetEntityForUuid(kFolderGuid)); EXPECT_TRUE(entity->IsUnsynced()); } @@ -1935,7 +1935,7 @@ const std::string kServerId2 = "server_id_2"; const std::string kTitle = "Title"; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); // Initialize the model with one node. syncer::UpdateResponseDataList updates; @@ -1974,7 +1974,7 @@ tracker()->GetEntityForSyncId(kServerId2); EXPECT_THAT(entity, NotNull()); EXPECT_THAT(entity->bookmark_node(), NotNull()); - EXPECT_THAT(entity->bookmark_node()->guid(), Eq(kGuid)); + EXPECT_THAT(entity->bookmark_node()->uuid(), Eq(kGuid)); } TEST(BookmarkRemoteUpdatesHandlerTest,
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.cc b/components/sync_bookmarks/bookmark_specifics_conversions.cc index a484be6..773ed0a 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions.cc +++ b/components/sync_bookmarks/bookmark_specifics_conversions.cc
@@ -12,7 +12,6 @@ #include "base/containers/contains.h" #include "base/containers/span.h" #include "base/feature_list.h" -#include "base/guid.h" #include "base/hash/sha1.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" @@ -21,6 +20,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_metrics.h" @@ -149,8 +149,8 @@ // This implementation is based on the equivalent logic in base/guid.cc. - // Set the GUID to version 4 as described in RFC 4122, section 4.4. - // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, + // Set the UUID to version 4 as described in RFC 4122, section 4.4. + // The format of UUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, // where y is one of [8, 9, A, B]. // Clear the version bits and set the version to 4: @@ -172,23 +172,23 @@ // ModelTypeWorker. The reason why this is non-trivial today is that some users // are known to contain corrupt data in the sense that several different // entities (identified by their server-provided ID) use the same client tag -// (and GUID). Currently BookmarkModelMerger has logic to prefer folders over -// regular URLs and reassign GUIDs. +// (and UUID). Currently BookmarkModelMerger has logic to prefer folders over +// regular URLs and reassign UUIDs. std::string InferGuidForLegacyBookmark( const std::string& originator_cache_guid, const std::string& originator_client_item_id) { DCHECK( - !base::GUID::ParseCaseInsensitive(originator_client_item_id).is_valid()); + !base::Uuid::ParseCaseInsensitive(originator_client_item_id).is_valid()); const std::string unique_tag = base::StrCat({originator_cache_guid, originator_client_item_id}); const base::SHA1Digest hash = base::SHA1HashSpan(base::as_bytes(base::make_span(unique_tag))); - static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer GUID"); + static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer UUID"); const std::string guid = ComputeGuidFromBytes(base::make_span(hash)); - DCHECK(base::GUID::ParseLowercase(guid).is_valid()); + DCHECK(base::Uuid::ParseLowercase(guid).is_valid()); return guid; } @@ -286,12 +286,12 @@ bm_specifics->set_url(node->url().spec()); } - DCHECK(node->guid().is_valid()) << "Actual: " << node->guid(); - bm_specifics->set_guid(node->guid().AsLowercaseString()); + DCHECK(node->uuid().is_valid()) << "Actual: " << node->uuid(); + bm_specifics->set_guid(node->uuid().AsLowercaseString()); - DCHECK(node->parent()->guid().is_valid()) - << "Actual: " << node->parent()->guid(); - bm_specifics->set_parent_guid(node->parent()->guid().AsLowercaseString()); + DCHECK(node->parent()->uuid().is_valid()) + << "Actual: " << node->parent()->uuid(); + bm_specifics->set_parent_guid(node->parent()->uuid().AsLowercaseString()); const std::string node_title = base::UTF16ToUTF8(node->GetTitle()); bm_specifics->set_legacy_canonicalized_title( @@ -354,13 +354,13 @@ DCHECK(IsValidBookmarkSpecifics(specifics)); TRACE_EVENT0("sync", "CreateBookmarkNodeFromSpecifics"); - const base::GUID guid = base::GUID::ParseLowercase(specifics.guid()); + const base::Uuid guid = base::Uuid::ParseLowercase(specifics.guid()); DCHECK(guid.is_valid()); - const base::GUID parent_guid = - base::GUID::ParseLowercase(specifics.parent_guid()); + const base::Uuid parent_guid = + base::Uuid::ParseLowercase(specifics.parent_guid()); DCHECK(parent_guid.is_valid()); - DCHECK_EQ(parent_guid, parent->guid()); + DCHECK_EQ(parent_guid, parent->uuid()); bookmarks::BookmarkNode::MetaInfoMap metainfo = GetBookmarkMetaInfo(specifics); @@ -409,10 +409,10 @@ DCHECK(model); DCHECK(favicon_service); // We shouldn't try to update the properties of the BookmarkNode before - // resolving any conflict in GUID. Either GUIDs are the same, or the GUID in + // resolving any conflict in UUID. Either UUIDs are the same, or the UUID in // specifics is invalid, and hence we can ignore it. - base::GUID guid = base::GUID::ParseLowercase(specifics.guid()); - DCHECK(!guid.is_valid() || guid == node->guid()); + base::Uuid guid = base::Uuid::ParseLowercase(specifics.guid()); + DCHECK(!guid.is_valid() || guid == node->uuid()); model->SetTitle(node, NodeTitleFromSpecifics(specifics), bookmarks::metrics::BookmarkEditSource::kOther); @@ -451,13 +451,13 @@ } } -const bookmarks::BookmarkNode* ReplaceBookmarkNodeGUID( +const bookmarks::BookmarkNode* ReplaceBookmarkNodeUuid( const bookmarks::BookmarkNode* node, - const base::GUID& guid, + const base::Uuid& guid, bookmarks::BookmarkModel* model) { DCHECK(guid.is_valid()); - if (node->guid() == guid) { + if (node->uuid() == guid) { // Nothing to do. return node; } @@ -487,23 +487,23 @@ LogInvalidSpecifics(InvalidBookmarkSpecificsError::kEmptySpecifics); is_valid = false; } - const base::GUID guid = base::GUID::ParseLowercase(specifics.guid()); + const base::Uuid guid = base::Uuid::ParseLowercase(specifics.guid()); if (!guid.is_valid()) { - DLOG(ERROR) << "Invalid bookmark: invalid GUID in specifics."; + DLOG(ERROR) << "Invalid bookmark: invalid UUID in specifics."; LogInvalidSpecifics(InvalidBookmarkSpecificsError::kInvalidGUID); is_valid = false; } else if (guid.AsLowercaseString() == - bookmarks::BookmarkNode::kBannedGuidDueToPastSyncBug) { - DLOG(ERROR) << "Invalid bookmark: banned GUID in specifics."; + bookmarks::BookmarkNode::kBannedUuidDueToPastSyncBug) { + DLOG(ERROR) << "Invalid bookmark: banned UUID in specifics."; LogInvalidSpecifics(InvalidBookmarkSpecificsError::kBannedGUID); is_valid = false; } - const base::GUID parent_guid = - base::GUID::ParseLowercase(specifics.parent_guid()); + const base::Uuid parent_guid = + base::Uuid::ParseLowercase(specifics.parent_guid()); if (!parent_guid.is_valid()) { - DLOG(ERROR) << "Invalid bookmark: invalid parent GUID in specifics."; + DLOG(ERROR) << "Invalid bookmark: invalid parent UUID in specifics."; LogInvalidSpecifics(InvalidBookmarkSpecificsError::kInvalidParentGUID); is_valid = false; } @@ -560,17 +560,17 @@ return is_valid; } -base::GUID InferGuidFromLegacyOriginatorId( +base::Uuid InferGuidFromLegacyOriginatorId( const std::string& originator_cache_guid, const std::string& originator_client_item_id) { - // Bookmarks created around 2016, between [M44..M52) use an uppercase GUID + // Bookmarks created around 2016, between [M44..M52) use an uppercase UUID // as originator client item ID, so it requires case-insensitive parsing. - base::GUID guid = base::GUID::ParseCaseInsensitive(originator_client_item_id); + base::Uuid guid = base::Uuid::ParseCaseInsensitive(originator_client_item_id); if (guid.is_valid()) { return guid; } - return base::GUID::ParseLowercase(InferGuidForLegacyBookmark( + return base::Uuid::ParseLowercase(InferGuidForLegacyBookmark( originator_cache_guid, originator_client_item_id)); } @@ -578,19 +578,19 @@ const syncer::ClientTagHash& client_tag_hash, const std::string& originator_cache_guid, const std::string& originator_client_item_id) { - DCHECK(base::GUID::ParseLowercase(specifics.guid()).is_valid()); + DCHECK(base::Uuid::ParseLowercase(specifics.guid()).is_valid()); if (!client_tag_hash.value().empty()) { return syncer::ClientTagHash::FromUnhashed( syncer::BOOKMARKS, specifics.guid()) == client_tag_hash; } - // Guard against returning true for cases where the GUID cannot be inferred. + // Guard against returning true for cases where the UUID cannot be inferred. if (originator_cache_guid.empty() && originator_client_item_id.empty()) { return false; } - return base::GUID::ParseLowercase(specifics.guid()) == + return base::Uuid::ParseLowercase(specifics.guid()) == InferGuidFromLegacyOriginatorId(originator_cache_guid, originator_client_item_id); }
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions.h b/components/sync_bookmarks/bookmark_specifics_conversions.h index 5622069..23d51dd 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions.h +++ b/components/sync_bookmarks/bookmark_specifics_conversions.h
@@ -9,7 +9,7 @@ #include <string> -#include "base/guid.h" +#include "base/uuid.h" #include "components/sync/protocol/bookmark_specifics.pb.h" namespace bookmarks { @@ -72,13 +72,13 @@ const bookmarks::BookmarkNode* node); // Replaces |node| with a BookmarkNode of equal properties and original node -// creation timestamp but a different GUID, set to |guid|, which must be a -// valid version 4 GUID. Intended to be used in cases where the GUID must be +// creation timestamp but a different UUID, set to |guid|, which must be a +// valid version 4 UUID. Intended to be used in cases where the UUID must be // modified despite being immutable within the BookmarkNode itself. Returns // the newly created node, and the original node gets deleted. -const bookmarks::BookmarkNode* ReplaceBookmarkNodeGUID( +const bookmarks::BookmarkNode* ReplaceBookmarkNodeUuid( const bookmarks::BookmarkNode* node, - const base::GUID& guid, + const base::Uuid& guid, bookmarks::BookmarkModel* model); // Checks if a bookmark specifics represents a valid bookmark. Valid specifics @@ -86,12 +86,12 @@ // meta_info must be unique. bool IsValidBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics); -// Returns the inferred GUID for given remote update's originator information. -base::GUID InferGuidFromLegacyOriginatorId( +// Returns the inferred UUID for given remote update's originator information. +base::Uuid InferGuidFromLegacyOriginatorId( const std::string& originator_cache_guid, const std::string& originator_client_item_id); -// Checks if bookmark specifics contain a GUID that matches the value that would +// Checks if bookmark specifics contain a UUID that matches the value that would // be inferred from other redundant fields. |specifics| must be valid as per // IsValidBookmarkSpecifics(). bool HasExpectedBookmarkGuid(const sync_pb::BookmarkSpecifics& specifics,
diff --git a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc index b81a75e..1e439e9b 100644 --- a/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc +++ b/components/sync_bookmarks/bookmark_specifics_conversions_unittest.cc
@@ -9,11 +9,11 @@ #include <utility> #include <vector> -#include "base/guid.h" #include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/time.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/test/test_bookmark_client.h" @@ -51,12 +51,12 @@ kIconURLWithoutFavicon = 2, kInvalidIconURL = 3, kNonUniqueMetaInfoKeys = 4, - kInvalidGUID = 5, - kInvalidParentGUID = 6, + kInvalidUuid = 5, + kInvalidParentUuid = 6, kInvalidUniquePosition = 7, - kBannedGUID = 8, + kBannedUuid = 8, - kMaxValue = kBannedGUID, + kMaxValue = kBannedUuid, }; sync_pb::UniquePosition RandomUniquePosition() { @@ -102,9 +102,9 @@ node, model.get(), kUniquePosition.ToProto(), /*force_favicon_load=*/false); const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); - EXPECT_THAT(bm_specifics.guid(), Eq(node->guid().AsLowercaseString())); + EXPECT_THAT(bm_specifics.guid(), Eq(node->uuid().AsLowercaseString())); EXPECT_THAT(bm_specifics.parent_guid(), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); EXPECT_THAT(bm_specifics.type(), Eq(sync_pb::BookmarkSpecifics::URL)); EXPECT_THAT(bm_specifics.legacy_canonicalized_title(), Eq(kTitle)); EXPECT_THAT(GURL(bm_specifics.url()), Eq(kUrl)); @@ -143,9 +143,9 @@ node, model.get(), kUniquePosition.ToProto(), /*force_favicon_load=*/false); const sync_pb::BookmarkSpecifics& bm_specifics = specifics.bookmark(); - EXPECT_THAT(bm_specifics.guid(), Eq(node->guid().AsLowercaseString())); + EXPECT_THAT(bm_specifics.guid(), Eq(node->uuid().AsLowercaseString())); EXPECT_THAT(bm_specifics.parent_guid(), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); EXPECT_FALSE(bm_specifics.has_last_used_time_us()); } @@ -321,7 +321,7 @@ TEST(BookmarkSpecificsConversionsTest, ShouldCreateNonFolderBookmarkNodeFromSpecifics) { const GURL kUrl("http://www.url.com"); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; const base::Time kTime = base::Time::Now(); const GURL kIconUrl("http://www.icon-url.com"); @@ -342,9 +342,9 @@ kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); - // Parent GUID and unique position are ignored by + // Parent UUID and unique position are ignored by // CreateBookmarkNodeFromSpecifics(), but are required here to pass DCHECKs. - bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); sync_pb::MetaInfo* meta_info1 = bm_specifics.add_meta_info(); @@ -367,7 +367,7 @@ /*parent=*/model->bookmark_bar_node(), /*index=*/0, model.get(), &favicon_service); ASSERT_THAT(node, NotNull()); - EXPECT_THAT(node->guid(), Eq(kGuid)); + EXPECT_THAT(node->uuid(), Eq(kGuid)); EXPECT_THAT(node->GetTitle(), Eq(base::UTF8ToUTF16(kTitle))); EXPECT_FALSE(node->is_folder()); EXPECT_THAT(node->url(), Eq(kUrl)); @@ -387,7 +387,7 @@ } TEST(BookmarkSpecificsConversionsTest, ShouldCreateFolderFromSpecifics) { - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; const base::Time kTime = base::Time::Now(); const std::string kKey1 = "key1"; @@ -402,9 +402,9 @@ kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::FOLDER); - // Parent GUID and unique position are ignored by + // Parent UUID and unique position are ignored by // CreateBookmarkNodeFromSpecifics(), but are required here to pass DCHECKs. - bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); sync_pb::MetaInfo* meta_info1 = bm_specifics.add_meta_info(); @@ -427,7 +427,7 @@ /*parent=*/model->bookmark_bar_node(), /*index=*/0, model.get(), &favicon_service); ASSERT_THAT(node, NotNull()); - EXPECT_THAT(node->guid(), Eq(kGuid)); + EXPECT_THAT(node->uuid(), Eq(kGuid)); EXPECT_THAT(node->GetTitle(), Eq(base::UTF8ToUTF16(kTitle))); EXPECT_TRUE(node->is_folder()); // TODO(crbug.com/1214840): Folders should propagate the creation time into @@ -448,7 +448,7 @@ TEST(BookmarkSpecificsConversionsTest, ShouldPreferFullTitleOnCreatingBookmarkNodeFromSpecifics) { const GURL kUrl("http://www.url.com"); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; const std::string kFullTitle = "Title Long Version"; const base::Time kTime = base::Time::Now(); @@ -469,9 +469,9 @@ kTime.ToDeltaSinceWindowsEpoch().InMicroseconds()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); - // Parent GUID and unique position are ignored by + // Parent UUID and unique position are ignored by // CreateBookmarkNodeFromSpecifics(), but are required here to pass DCHECKs. - bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); sync_pb::MetaInfo* meta_info1 = bm_specifics.add_meta_info(); @@ -493,7 +493,7 @@ /*parent=*/model->bookmark_bar_node(), /*index=*/0, model.get(), &favicon_service); ASSERT_THAT(node, NotNull()); - EXPECT_THAT(node->guid(), Eq(kGuid)); + EXPECT_THAT(node->uuid(), Eq(kGuid)); EXPECT_THAT(node->GetTitle(), Eq(base::UTF8ToUTF16(kFullTitle))); EXPECT_THAT(node->url(), Eq(kUrl)); EXPECT_THAT(node->date_added(), Eq(kTime)); @@ -517,14 +517,14 @@ for (const std::string& illegal_title : illegal_titles) { sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url("http://www.url.com"); - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); // Legacy clients append an extra space to illegal clients. bm_specifics.set_legacy_canonicalized_title(illegal_title + " "); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); - // Parent GUID and unique position are ignored by + // Parent UUID and unique position are ignored by // CreateBookmarkNodeFromSpecifics(), but are required here to pass DCHECKs. - bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); const bookmarks::BookmarkNode* node = @@ -540,7 +540,7 @@ TEST(BookmarkSpecificsConversionsTest, ShouldCreateBookmarkNodeFromSpecificsWithFaviconAndWithoutIconUrl) { const GURL kUrl("http://www.url.com"); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::string kTitle = "Title"; const GURL kIconUrl("http://www.icon-url.com"); @@ -551,9 +551,9 @@ bm_specifics.set_legacy_canonicalized_title(kTitle); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); - // Parent GUID and unique position are ignored by + // Parent UUID and unique position are ignored by // CreateBookmarkNodeFromSpecifics(), but are required here to pass DCHECKs. - bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeGuid); + bm_specifics.set_parent_guid(bookmarks::BookmarkNode::kBookmarkBarNodeUuid); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); std::unique_ptr<bookmarks::BookmarkModel> model = @@ -597,7 +597,7 @@ sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url(kNewUrl.spec()); - bm_specifics.set_guid(node->guid().AsLowercaseString()); + bm_specifics.set_guid(node->uuid().AsLowercaseString()); bm_specifics.set_icon_url(kNewIconUrl.spec()); bm_specifics.set_favicon("PNG"); bm_specifics.set_legacy_canonicalized_title(kNewTitle); @@ -659,7 +659,7 @@ sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url(kNewUrl.spec()); - bm_specifics.set_guid(node->guid().AsLowercaseString()); + bm_specifics.set_guid(node->uuid().AsLowercaseString()); bm_specifics.set_icon_url(kNewIconUrl.spec()); bm_specifics.set_favicon("PNG"); bm_specifics.set_legacy_canonicalized_title(kNewTitle); @@ -708,7 +708,7 @@ sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url(kNewUrl.spec()); - bm_specifics.set_guid(node->guid().AsLowercaseString()); + bm_specifics.set_guid(node->uuid().AsLowercaseString()); bm_specifics.set_favicon("PNG"); testing::NiceMock<favicon::MockFaviconService> favicon_service; @@ -724,9 +724,9 @@ // URL is irrelevant for a folder. bm_specifics.set_url("INVALID_URL"); - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_parent_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::FOLDER); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); EXPECT_TRUE(IsValidBookmarkSpecifics(bm_specifics)); @@ -742,9 +742,9 @@ sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url("http://www.valid-url.com"); bm_specifics.set_favicon("PNG"); - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_parent_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); EXPECT_TRUE(IsValidBookmarkSpecifics(bm_specifics)); @@ -755,7 +755,7 @@ sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_url("http://www.valid-url.com"); bm_specifics.set_icon_url("http://www.valid-icon-url.com"); - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::URL); base::HistogramTester histogram_tester; EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); @@ -766,70 +766,70 @@ } TEST(BookmarkSpecificsConversionsTest, - ShouldBeInvalidBookmarkSpecificsWithInvalidGUID) { + ShouldBeInvalidBookmarkSpecificsWithInvalidUuid) { base::HistogramTester histogram_tester; sync_pb::BookmarkSpecifics bm_specifics; bm_specifics.set_type(sync_pb::BookmarkSpecifics::FOLDER); bm_specifics.set_parent_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); - // No GUID. + // No UUID. bm_specifics.clear_guid(); EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidUuid, /*expected_count=*/1); - // Add empty GUID. + // Add empty UUID. bm_specifics.set_guid(""); EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidUuid, /*expected_count=*/2); - // Add invalid GUID. - bm_specifics.set_guid("INVALID GUID"); + // Add invalid UUID. + bm_specifics.set_guid("INVALID UUID"); EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidUuid, /*expected_count=*/3); - // Add valid GUID. - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + // Add valid UUID. + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); ASSERT_TRUE(IsValidBookmarkSpecifics(bm_specifics)); } TEST(BookmarkSpecificsConversionsTest, - ShouldBeInvalidBookmarkSpecificsWithInvalidParentGUID) { + ShouldBeInvalidBookmarkSpecificsWithInvalidParentUuid) { base::HistogramTester histogram_tester; sync_pb::BookmarkSpecifics bm_specifics; - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_type(sync_pb::BookmarkSpecifics::FOLDER); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); - // No parent GUID. + // No parent UUID. bm_specifics.clear_parent_guid(); EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidParentGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidParentUuid, /*expected_count=*/1); - // Add invalid parent GUID. - bm_specifics.set_parent_guid("INVALID GUID"); + // Add invalid parent UUID. + bm_specifics.set_parent_guid("INVALID UUID"); EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidParentGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidParentUuid, /*expected_count=*/2); - // Add valid GUID. + // Add valid UUID. bm_specifics.set_parent_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); ASSERT_TRUE(IsValidBookmarkSpecifics(bm_specifics)); } @@ -850,8 +850,8 @@ } TEST(BookmarkSpecificsConversionsTest, - ShouldBeInvalidBookmarkSpecificsWithBannedGUID) { - ASSERT_THAT(bookmarks::BookmarkNode::kBannedGuidDueToPastSyncBug, + ShouldBeInvalidBookmarkSpecificsWithBannedUuid) { + ASSERT_THAT(bookmarks::BookmarkNode::kBannedUuidDueToPastSyncBug, Eq(InferGuidFromLegacyOriginatorId( /*originator_cache_guid=*/"", /*originator_client_item_id=*/"") @@ -862,11 +862,11 @@ sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark(); bm_specifics->set_type(sync_pb::BookmarkSpecifics::FOLDER); *bm_specifics->mutable_unique_position() = RandomUniquePosition(); - bm_specifics->set_guid(bookmarks::BookmarkNode::kBannedGuidDueToPastSyncBug); + bm_specifics->set_guid(bookmarks::BookmarkNode::kBannedUuidDueToPastSyncBug); EXPECT_FALSE(IsValidBookmarkSpecifics(*bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kBannedGUID, + /*sample=*/InvalidBookmarkSpecificsError::kBannedUuid, /*expected_count=*/1); } @@ -889,14 +889,14 @@ EXPECT_FALSE(IsValidBookmarkSpecifics(bm_specifics)); histogram_tester.ExpectBucketCount( "Sync.InvalidBookmarkSpecifics", - /*sample=*/InvalidBookmarkSpecificsError::kInvalidGUID, + /*sample=*/InvalidBookmarkSpecificsError::kInvalidUuid, /*expected_count=*/1); } // Populate the required fields. - bm_specifics.set_guid(base::GUID::GenerateRandomV4().AsLowercaseString()); + bm_specifics.set_guid(base::Uuid::GenerateRandomV4().AsLowercaseString()); bm_specifics.set_parent_guid( - base::GUID::GenerateRandomV4().AsLowercaseString()); + base::Uuid::GenerateRandomV4().AsLowercaseString()); *bm_specifics.mutable_unique_position() = RandomUniquePosition(); ASSERT_TRUE(IsValidBookmarkSpecifics(bm_specifics)); @@ -942,11 +942,11 @@ /*expected_count=*/1); } -TEST(BookmarkSpecificsConversionsTest, ReplaceUrlNodeWithUpdatedGUID) { +TEST(BookmarkSpecificsConversionsTest, ReplaceUrlNodeWithUpdatedUuid) { std::unique_ptr<bookmarks::BookmarkModel> model = bookmarks::TestBookmarkClient::CreateModel(); const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::u16string kTitle = u"bar"; const GURL kUrl = GURL("http://foo.com"); const base::Time kCreationTime = base::Time::Now(); @@ -962,10 +962,10 @@ // Replace url1. const bookmarks::BookmarkNode* new_url = - ReplaceBookmarkNodeGUID(original_url, kGuid, model.get()); + ReplaceBookmarkNodeUuid(original_url, kGuid, model.get()); - // All data except for the GUID should be the same. - EXPECT_EQ(kGuid, new_url->guid()); + // All data except for the UUID should be the same. + EXPECT_EQ(kGuid, new_url->uuid()); EXPECT_EQ(kTitle, new_url->GetTitle()); EXPECT_EQ(bookmark_bar_node, new_url->parent()); EXPECT_EQ(0u, bookmark_bar_node->GetIndexOf(new_url)); @@ -976,11 +976,11 @@ EXPECT_EQ(kValue, out_value_url); } -TEST(BookmarkSpecificsConversionsTest, ReplaceFolderNodeWithUpdatedGUID) { +TEST(BookmarkSpecificsConversionsTest, ReplaceFolderNodeWithUpdatedUuid) { std::unique_ptr<bookmarks::BookmarkModel> model = bookmarks::TestBookmarkClient::CreateModel(); const bookmarks::BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const std::u16string kTitle = u"foobar"; auto meta_info_map = std::make_unique<bookmarks::BookmarkNode::MetaInfoMap>(); @@ -998,10 +998,10 @@ // Replace folder1. const bookmarks::BookmarkNode* new_folder = - ReplaceBookmarkNodeGUID(original_folder, kGuid, model.get()); + ReplaceBookmarkNodeUuid(original_folder, kGuid, model.get()); - // All data except for the GUID should be the same. - EXPECT_EQ(kGuid, new_folder->guid()); + // All data except for the UUID should be the same. + EXPECT_EQ(kGuid, new_folder->uuid()); EXPECT_EQ(kTitle, new_folder->GetTitle()); EXPECT_EQ(bookmark_bar_node, new_folder->parent()); EXPECT_EQ(0u, bookmark_bar_node->GetIndexOf(new_folder)); @@ -1015,7 +1015,7 @@ TEST(BookmarkSpecificsConversionsTest, ShouldConsiderValidBookmarkGuidIfMatchesClientTag) { - const std::string kGuid = base::GUID::GenerateRandomV4().AsLowercaseString(); + const std::string kGuid = base::Uuid::GenerateRandomV4().AsLowercaseString(); sync_pb::BookmarkSpecifics specifics; specifics.set_guid(kGuid); @@ -1028,7 +1028,7 @@ TEST(BookmarkSpecificsConversionsTest, ShouldConsiderValidBookmarkGuidIfMatchesOriginator) { - const std::string kGuid = base::GUID::GenerateRandomV4().AsLowercaseString(); + const std::string kGuid = base::Uuid::GenerateRandomV4().AsLowercaseString(); sync_pb::BookmarkSpecifics specifics; specifics.set_guid(kGuid);
diff --git a/components/sync_bookmarks/parent_guid_preprocessing.cc b/components/sync_bookmarks/parent_guid_preprocessing.cc index 6cfd6a7b..780b202 100644 --- a/components/sync_bookmarks/parent_guid_preprocessing.cc +++ b/components/sync_bookmarks/parent_guid_preprocessing.cc
@@ -8,9 +8,9 @@ #include <unordered_map> #include "base/check.h" -#include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/strings/string_piece.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/sync/protocol/bookmark_specifics.pb.h" #include "components/sync/protocol/entity_specifics.pb.h" @@ -46,7 +46,7 @@ // Tried to use the information known by |tracker| to determine the GUID of the // parent folder, for the entity updated in |update|. Returns an invalid GUID // if the GUID could not be determined. |tracker| must not be null. -base::GUID TryGetParentGuidFromTracker( +base::Uuid TryGetParentGuidFromTracker( const SyncedBookmarkTracker* tracker, const syncer::UpdateResponseData& update) { DCHECK(tracker); @@ -59,27 +59,27 @@ tracker->GetEntityForSyncId(update.entity.legacy_parent_id); if (!tracked_parent) { // Parent not known by tracker. - return base::GUID(); + return base::Uuid(); } if (!tracked_parent->bookmark_node()) { // Parent is a tombstone; cannot determine the GUID. - return base::GUID(); + return base::Uuid(); } - return tracked_parent->bookmark_node()->guid(); + return tracked_parent->bookmark_node()->uuid(); } base::StringPiece GetGuidForEntity(const syncer::EntityData& entity) { // Special-case permanent folders, which may not include a GUID in specifics. if (entity.server_defined_unique_tag == kBookmarkBarTag) { - return bookmarks::BookmarkNode::kBookmarkBarNodeGuid; + return bookmarks::BookmarkNode::kBookmarkBarNodeUuid; } if (entity.server_defined_unique_tag == kOtherBookmarksTag) { - return bookmarks::BookmarkNode::kOtherBookmarksNodeGuid; + return bookmarks::BookmarkNode::kOtherBookmarksNodeUuid; } if (entity.server_defined_unique_tag == kMobileBookmarksTag) { - return bookmarks::BookmarkNode::kMobileBookmarksNodeGuid; + return bookmarks::BookmarkNode::kMobileBookmarksNodeUuid; } // Fall back to the regular case, i.e. GUID in specifics, or an empty value // if not present (including tombstones). @@ -134,7 +134,7 @@ sync_id_to_guid_map_; }; -base::GUID GetParentGuidForUpdate( +base::Uuid GetParentGuidForUpdate( const syncer::UpdateResponseData& update, const SyncedBookmarkTracker* tracker, LazySyncIdToGuidMapInUpdates* sync_id_to_guid_map_in_updates) { @@ -144,14 +144,14 @@ if (update.entity.legacy_parent_id.empty()) { // Without the |SyncEntity.parent_id| field set, there is no information // available to determine the parent and/or its GUID. - return base::GUID(); + return base::Uuid(); } // If a tracker is available, i.e. initial sync already done, it may know // parent's GUID already. - base::GUID guid = TryGetParentGuidFromTracker(tracker, update); - if (guid.is_valid()) { - return guid; + base::Uuid uuid = TryGetParentGuidFromTracker(tracker, update); + if (uuid.is_valid()) { + return uuid; } // Otherwise, fall back to checking if the parent is included in the full list @@ -159,11 +159,11 @@ // codepath is most crucial for initial sync, where |tracker| is empty, but is // also useful for non-initial sync, if the same incoming batch creates both // parent and child, none of which would be known by |tracker|. - guid = base::GUID::ParseLowercase( + uuid = base::Uuid::ParseLowercase( sync_id_to_guid_map_in_updates->GetGuidForSyncId( update.entity.legacy_parent_id)); - if (guid.is_valid()) { - return guid; + if (uuid.is_valid()) { + return uuid; } // At this point the parent's GUID couldn't be determined, but actually @@ -171,10 +171,10 @@ // regardless, but to avoid behavioral differences in UMA metrics // Sync.ProblematicServerSideBookmarks[DuringMerge], a fake parent GUID is // used here, which is known to never match an existing entity. - guid = base::GUID::ParseLowercase(kInvalidParentGuid); - DCHECK(guid.is_valid()); - DCHECK(!tracker->GetEntityForGUID(guid)); - return guid; + uuid = base::Uuid::ParseLowercase(kInvalidParentGuid); + DCHECK(uuid.is_valid()); + DCHECK(!tracker->GetEntityForUuid(uuid)); + return uuid; } // Same as PopulateParentGuidInSpecifics(), but |tracker| must not be null. @@ -194,11 +194,11 @@ continue; } - const base::GUID guid = + const base::Uuid uuid = GetParentGuidForUpdate(update, tracker, &sync_id_to_guid_map); - if (guid.is_valid()) { + if (uuid.is_valid()) { update.entity.specifics.mutable_bookmark()->set_parent_guid( - guid.AsLowercaseString()); + uuid.AsLowercaseString()); } } } @@ -214,12 +214,12 @@ // SyncedBookmarkTracker. Since this is prone to change in the future, the // DCHECK below is added to avoid subtle bugs, without relying exclusively // on integration tests that exercise legacy data.. - DCHECK(tracker->GetEntityForGUID(base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kBookmarkBarNodeGuid))); - DCHECK(tracker->GetEntityForGUID(base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kOtherBookmarksNodeGuid))); - DCHECK(tracker->GetEntityForGUID(base::GUID::ParseLowercase( - bookmarks::BookmarkNode::kMobileBookmarksNodeGuid))); + DCHECK(tracker->GetEntityForUuid(base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kBookmarkBarNodeUuid))); + DCHECK(tracker->GetEntityForUuid(base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kOtherBookmarksNodeUuid))); + DCHECK(tracker->GetEntityForUuid(base::Uuid::ParseLowercase( + bookmarks::BookmarkNode::kMobileBookmarksNodeUuid))); PopulateParentGuidInSpecificsWithTracker(tracker, updates); return;
diff --git a/components/sync_bookmarks/parent_guid_preprocessing_unittest.cc b/components/sync_bookmarks/parent_guid_preprocessing_unittest.cc index 98b4bc89..29eb427 100644 --- a/components/sync_bookmarks/parent_guid_preprocessing_unittest.cc +++ b/components/sync_bookmarks/parent_guid_preprocessing_unittest.cc
@@ -80,17 +80,17 @@ updates.back().entity.server_defined_unique_tag = "other_bookmarks"; EXPECT_THAT(GetGuidForSyncIdInUpdatesForTesting(updates, kBookmarkBarId), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); EXPECT_THAT(GetGuidForSyncIdInUpdatesForTesting(updates, kMobileBookmarksId), - Eq(bookmarks::BookmarkNode::kMobileBookmarksNodeGuid)); + Eq(bookmarks::BookmarkNode::kMobileBookmarksNodeUuid)); EXPECT_THAT(GetGuidForSyncIdInUpdatesForTesting(updates, kOtherBookmarksId), - Eq(bookmarks::BookmarkNode::kOtherBookmarksNodeGuid)); + Eq(bookmarks::BookmarkNode::kOtherBookmarksNodeUuid)); } TEST(ParentGuidPreprocessingTest, ShouldPopulateParentGuidInInitialUpdates) { const std::string kBookmarkBarId = "bookmark_bar_id"; const std::string kParentFolderId = "parent_folder_id"; - const std::string kParentFolderGuid = + const std::string kParentFolderUuid = base::GUID::GenerateRandomV4().AsLowercaseString(); // Populate updates representing: @@ -105,7 +105,7 @@ updates.back().entity.id = kParentFolderId; updates.back().entity.legacy_parent_id = kBookmarkBarId; updates.back().entity.specifics.mutable_bookmark()->set_guid( - kParentFolderGuid); + kParentFolderUuid); updates.emplace_back(); updates.back().entity.legacy_parent_id = kParentFolderId; updates.back().entity.specifics.mutable_bookmark()->set_guid("child_guid"); @@ -114,9 +114,9 @@ EXPECT_THAT(updates[0].entity.specifics.bookmark().parent_guid(), Eq("")); EXPECT_THAT(updates[1].entity.specifics.bookmark().parent_guid(), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); EXPECT_THAT(updates[2].entity.specifics.bookmark().parent_guid(), - Eq(kParentFolderGuid)); + Eq(kParentFolderUuid)); } TEST(ParentGuidPreprocessingTest, @@ -124,9 +124,9 @@ const std::string kBookmarkBarId = "bookmark_bar_id"; const std::string kFolderId = "folder_id"; - const std::string kFolderGuid = + const std::string kFolderUuid = base::GUID::GenerateRandomV4().AsLowercaseString(); - const std::string kParentGuidInSpecifics = + const std::string kParentUuidInSpecifics = base::GUID::GenerateRandomV4().AsLowercaseString(); // Populate updates representing: @@ -140,19 +140,19 @@ updates.emplace_back(); updates.back().entity.id = kFolderId; updates.back().entity.legacy_parent_id = kBookmarkBarId; - updates.back().entity.specifics.mutable_bookmark()->set_guid(kFolderGuid); + updates.back().entity.specifics.mutable_bookmark()->set_guid(kFolderUuid); updates.back().entity.specifics.mutable_bookmark()->set_parent_guid( - kParentGuidInSpecifics); + kParentUuidInSpecifics); // Although |parent_id| points to bookmarks bar, the |parent_guid| field // should prevail. ASSERT_THAT(GetGuidForSyncIdInUpdatesForTesting(updates, kBookmarkBarId), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); PopulateParentGuidInSpecifics(/*tracker=*/nullptr, &updates); EXPECT_THAT(updates[1].entity.specifics.bookmark().parent_guid(), - Eq(kParentGuidInSpecifics)); + Eq(kParentUuidInSpecifics)); } TEST(ParentGuidPreprocessingTest, @@ -199,18 +199,18 @@ PopulateParentGuidInSpecifics(tracker.get(), &updates); EXPECT_THAT(updates[0].entity.specifics.bookmark().parent_guid(), - Eq(tracked_node.guid().AsLowercaseString())); + Eq(tracked_node.uuid().AsLowercaseString())); EXPECT_THAT(updates[1].entity.specifics.bookmark().parent_guid(), - Eq(bookmarks::BookmarkNode::kBookmarkBarNodeGuid)); + Eq(bookmarks::BookmarkNode::kBookmarkBarNodeUuid)); } TEST(ParentGuidPreprocessingTest, ShouldPopulateWithFakeGuidIfParentSetButUnknown) { // Fork of the private constant in the .cc file. - const std::string kInvalidParentGuid = "220a410e-37b9-5bbc-8674-ea982459f940"; + const std::string kInvalidParentUuid = "220a410e-37b9-5bbc-8674-ea982459f940"; const std::string kParentFolderId = "parent_folder_id"; - const std::string kParentFolderGuid = + const std::string kParentFolderUuid = base::GUID::GenerateRandomV4().AsLowercaseString(); // Populate updates representing: @@ -220,12 +220,12 @@ updates.back().entity.id = kParentFolderId; updates.back().entity.legacy_parent_id = "some_unknown_parent"; updates.back().entity.specifics.mutable_bookmark()->set_guid( - kParentFolderGuid); + kParentFolderUuid); PopulateParentGuidInSpecifics(/*tracker=*/nullptr, &updates); EXPECT_THAT(updates[0].entity.specifics.bookmark().parent_guid(), - Eq(kInvalidParentGuid)); + Eq(kInvalidParentUuid)); } } // namespace
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.cc b/components/sync_bookmarks/synced_bookmark_tracker.cc index c7f97f4..4a48980 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker.cc
@@ -10,7 +10,6 @@ #include "base/base64.h" #include "base/containers/cxx20_erase.h" -#include "base/guid.h" #include "base/hash/hash.h" #include "base/hash/sha1.h" #include "base/logging.h" @@ -18,6 +17,7 @@ #include "base/metrics/histogram_macros.h" #include "base/ranges/algorithm.h" #include "base/trace_event/memory_usage_estimator.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/sync/base/time.h" @@ -62,10 +62,10 @@ } // namespace // static -syncer::ClientTagHash SyncedBookmarkTracker::GetClientTagHashFromGUID( - const base::GUID& guid) { +syncer::ClientTagHash SyncedBookmarkTracker::GetClientTagHashFromUuid( + const base::Uuid& uuid) { return syncer::ClientTagHash::FromUnhashed(syncer::BOOKMARKS, - guid.AsLowercaseString()); + uuid.AsLowercaseString()); } // static @@ -151,9 +151,9 @@ return it != client_tag_hash_to_entities_map_.end() ? it->second : nullptr; } -const SyncedBookmarkTrackerEntity* SyncedBookmarkTracker::GetEntityForGUID( - const base::GUID& guid) const { - return GetEntityForClientTagHash(GetClientTagHashFromGUID(guid)); +const SyncedBookmarkTrackerEntity* SyncedBookmarkTracker::GetEntityForUuid( + const base::Uuid& uuid) const { + return GetEntityForClientTagHash(GetClientTagHashFromUuid(uuid)); } SyncedBookmarkTrackerEntity* SyncedBookmarkTracker::AsMutableEntity( @@ -187,7 +187,7 @@ // Note that this gets computed for permanent nodes too. syncer::ClientTagHash client_tag_hash = - GetClientTagHashFromGUID(bookmark_node->guid()); + GetClientTagHashFromUuid(bookmark_node->uuid()); sync_pb::EntityMetadata metadata; metadata.set_is_deleted(false); @@ -490,24 +490,24 @@ } // The client-tag-hash is expected to be equal to the hash of the bookmark's - // GUID. This can be hit for example if local bookmark GUIDs were + // UUID. This can be hit for example if local bookmark UUIDs were // reassigned upon startup due to duplicates (which is a BookmarkModel // invariant violation and should be impossible). const syncer::ClientTagHash client_tag_hash = - GetClientTagHashFromGUID(node->guid()); + GetClientTagHashFromUuid(node->uuid()); if (client_tag_hash != syncer::ClientTagHash::FromHashed( bookmark_metadata.metadata().client_tag_hash())) { if (node->is_permanent_node()) { // For permanent nodes the client tag hash is irrelevant and subject to // change if the constants in components/bookmarks change and adopt - // different GUID constants. To avoid treating such state as corrupt + // different UUID constants. To avoid treating such state as corrupt // metadata, let's fix it automatically. bookmark_metadata.mutable_metadata()->set_client_tag_hash( client_tag_hash.value()); } else { - DLOG(ERROR) << "Bookmark GUID does not match the client tag."; - return CorruptionReason::BOOKMARK_GUID_MISMATCH; + DLOG(ERROR) << "Bookmark UUID does not match the client tag."; + return CorruptionReason::BOOKMARK_UUID_MISMATCH; } } @@ -719,7 +719,7 @@ DCHECK(node); DCHECK(entity->metadata().is_deleted()); const syncer::ClientTagHash client_tag_hash = - GetClientTagHashFromGUID(node->guid()); + GetClientTagHashFromUuid(node->uuid()); // The same entity must be used only for the same bookmark node. DCHECK_EQ(entity->metadata().client_tag_hash(), client_tag_hash.value()); DCHECK(bookmark_node_to_entities_map_.find(node) ==
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.h b/components/sync_bookmarks/synced_bookmark_tracker.h index d154927..d04264a 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker.h +++ b/components/sync_bookmarks/synced_bookmark_tracker.h
@@ -11,9 +11,9 @@ #include <utility> #include <vector> -#include "base/guid.h" #include "base/memory/raw_ptr.h" #include "base/time/time.h" +#include "base/uuid.h" #include "components/sync/base/client_tag_hash.h" #include "components/sync/protocol/model_type_state.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -38,8 +38,8 @@ // until commit confirmation is received. class SyncedBookmarkTracker { public: - // Returns a client tag hash given a bookmark GUID. - static syncer::ClientTagHash GetClientTagHashFromGUID(const base::GUID& guid); + // Returns a client tag hash given a bookmark UUID. + static syncer::ClientTagHash GetClientTagHashFromUuid(const base::Uuid& uuid); // Creates an empty instance with no entities. Never returns null. static std::unique_ptr<SyncedBookmarkTracker> CreateEmpty( @@ -72,8 +72,8 @@ const syncer::ClientTagHash& client_tag_hash) const; // Convenience function, similar to GetEntityForClientTagHash(). - const SyncedBookmarkTrackerEntity* GetEntityForGUID( - const base::GUID& guid) const; + const SyncedBookmarkTrackerEntity* GetEntityForUuid( + const base::Uuid& uuid) const; // Returns null if no entity is found. const SyncedBookmarkTrackerEntity* GetEntityForBookmarkNode( @@ -224,7 +224,7 @@ DUPLICATED_SERVER_ID = 6, UNKNOWN_BOOKMARK_ID = 7, UNTRACKED_BOOKMARK = 8, - BOOKMARK_GUID_MISMATCH = 9, + BOOKMARK_UUID_MISMATCH = 9, DUPLICATED_CLIENT_TAG_HASH = 10, TRACKED_MANAGED_NODE = 11, MISSING_CLIENT_TAG_HASH = 12,
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_entity.h b/components/sync_bookmarks/synced_bookmark_tracker_entity.h index c7e78c6..dd5e609 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker_entity.h +++ b/components/sync_bookmarks/synced_bookmark_tracker_entity.h
@@ -66,7 +66,7 @@ void clear_bookmark_node() { bookmark_node_ = nullptr; } // Used when replacing a node in order to update its otherwise immutable - // GUID. + // UUID. void set_bookmark_node(const bookmarks::BookmarkNode* bookmark_node) { bookmark_node_ = bookmark_node; }
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc index 45d752f..00c4256 100644 --- a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc +++ b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
@@ -5,10 +5,10 @@ #include "components/sync_bookmarks/synced_bookmark_tracker.h" #include "base/base64.h" -#include "base/guid.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" +#include "base/uuid.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/browser/bookmark_utils.h" @@ -51,7 +51,7 @@ DUPLICATED_SERVER_ID = 6, UNKNOWN_BOOKMARK_ID = 7, UNTRACKED_BOOKMARK = 8, - BOOKMARK_GUID_MISMATCH = 9, + BOOKMARK_UUID_MISMATCH = 9, DUPLICATED_CLIENT_TAG_HASH = 10, TRACKED_MANAGED_NODE = 11, MISSING_CLIENT_TAG_HASH = 12, @@ -81,7 +81,7 @@ bookmark_metadata.mutable_metadata()->set_server_id(server_id); bookmark_metadata.mutable_metadata()->set_client_tag_hash( syncer::ClientTagHash::FromUnhashed(syncer::BOOKMARKS, - node->guid().AsLowercaseString()) + node->uuid().AsLowercaseString()) .value()); // Required by the validation logic. if (!node->is_folder()) { @@ -130,7 +130,7 @@ const std::string kTitle = "Title"; const GURL kUrl("http://www.foo.com"); const int64_t kId = 1; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const int64_t kServerVersion = 1000; const base::Time kCreationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = @@ -172,7 +172,7 @@ const std::string kSyncId = "SYNC_ID"; const int64_t kId = 1; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const int64_t kServerVersion = 1000; const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = @@ -211,7 +211,7 @@ const sync_pb::EntitySpecifics specifics = GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string()); - bookmarks::BookmarkNode node(kId, base::GUID::GenerateRandomV4(), kUrl); + bookmarks::BookmarkNode node(kId, base::Uuid::GenerateRandomV4(), kUrl); tracker->Add(&node, kSyncId, kServerVersion, kCreationTime, specifics); sync_pb::BookmarkModelMetadata bookmark_model_metadata = @@ -234,7 +234,7 @@ const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string()); - bookmarks::BookmarkNode node(kId, base::GUID::GenerateRandomV4(), GURL()); + bookmarks::BookmarkNode node(kId, base::Uuid::GenerateRandomV4(), GURL()); const SyncedBookmarkTrackerEntity* entity = tracker->Add( &node, kSyncId, kServerVersion, kModificationTime, specifics); @@ -253,7 +253,7 @@ const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string()); - bookmarks::BookmarkNode node(kId, base::GUID::GenerateRandomV4(), GURL()); + bookmarks::BookmarkNode node(kId, base::Uuid::GenerateRandomV4(), GURL()); const SyncedBookmarkTrackerEntity* entity = tracker->Add( &node, kSyncId, kServerVersion, kModificationTime, specifics); @@ -286,7 +286,7 @@ const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string()); - bookmarks::BookmarkNode node(kId, base::GUID::GenerateRandomV4(), GURL()); + bookmarks::BookmarkNode node(kId, base::Uuid::GenerateRandomV4(), GURL()); const SyncedBookmarkTrackerEntity* entity = tracker->Add( &node, kSyncId, kServerVersion, kModificationTime, specifics); ASSERT_THAT(entity, NotNull()); @@ -318,7 +318,7 @@ const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string()); - bookmarks::BookmarkNode node(/*id=*/1, base::GUID::GenerateRandomV4(), + bookmarks::BookmarkNode node(/*id=*/1, base::Uuid::GenerateRandomV4(), GURL()); // Track a sync entity. const SyncedBookmarkTrackerEntity* entity = tracker->Add( @@ -473,7 +473,7 @@ const std::string kSyncId = "SYNC_ID"; const int64_t kId = 1; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const int64_t kServerVersion = 1000; const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = @@ -512,7 +512,7 @@ const std::string kSyncId = "SYNC_ID"; const int64_t kId = 1; - const base::GUID kGuid = base::GUID::GenerateRandomV4(); + const base::Uuid kGuid = base::Uuid::GenerateRandomV4(); const int64_t kServerVersion = 1000; const base::Time kModificationTime(base::Time::Now() - base::Seconds(1)); const sync_pb::EntitySpecifics specifics = @@ -828,7 +828,7 @@ histogram_tester.ExpectUniqueSample( "Sync.BookmarksModelMetadataCorruptionReason", - /*sample=*/ExpectedCorruptionReason::BOOKMARK_GUID_MISMATCH, + /*sample=*/ExpectedCorruptionReason::BOOKMARK_UUID_MISMATCH, /*expected_bucket_count=*/1); } @@ -849,7 +849,7 @@ const syncer::ClientTagHash client_tag_hash = syncer::ClientTagHash::FromUnhashed(syncer::BOOKMARKS, - node0->guid().AsLowercaseString()); + node0->uuid().AsLowercaseString()); node0_metadata->mutable_metadata()->set_client_tag_hash( client_tag_hash.value()); @@ -1005,7 +1005,7 @@ sync_pb::EntitySpecifics specifics = GenerateSpecifics(kTitle, kUrl.spec()); specifics.mutable_bookmark()->set_favicon(kFaviconPngBytes); - bookmarks::BookmarkNode node(kId, base::GUID::GenerateRandomV4(), kUrl); + bookmarks::BookmarkNode node(kId, base::Uuid::GenerateRandomV4(), kUrl); const SyncedBookmarkTrackerEntity* entity = tracker->Add(&node, kSyncId, kServerVersion, kCreationTime, specifics);
diff --git a/components/sync_preferences/common_syncable_prefs_database.cc b/components/sync_preferences/common_syncable_prefs_database.cc index 90616895..a36400dd 100644 --- a/components/sync_preferences/common_syncable_prefs_database.cc +++ b/components/sync_preferences/common_syncable_prefs_database.cc
@@ -29,6 +29,8 @@ namespace sync_preferences { const char kSyncablePrefForTesting[] = "syncable-test-preference"; +const char kSyncableMergeableDictPrefForTesting[] = + "syncable-mergeable-dict-test-preference"; namespace { // Not an enum class to ease cast to int. @@ -38,7 +40,7 @@ // Please also add new entries to `SyncablePref` enum in // tools/metrics/histograms/enums.xml. enum { - kSyncablePrefForTesting = 0, + kSyncablePrefForTesting = 0, // For tests. kAutofillCreditCardEnabled = 1, kAutofillEnabledDeprecated = 2, kAutofillHasSeenIban = 3, @@ -100,7 +102,8 @@ kPrefAlwaysTranslateList = 59, kPrefNeverPromptSitesWithTime = 60, kPrefTranslateRecentTarget = 61, - kPrefDogfoodGroups = 62 + kPrefDogfoodGroups = 62, + kSyncableMergeableDictPrefForTesting = 63, // For tests. }; } // namespace syncable_prefs_ids @@ -263,6 +266,9 @@ syncer::PRIORITY_PREFERENCES}}, {kSyncablePrefForTesting, {syncable_prefs_ids::kSyncablePrefForTesting, syncer::PREFERENCES}}, + {kSyncableMergeableDictPrefForTesting, + {syncable_prefs_ids::kSyncableMergeableDictPrefForTesting, + syncer::PREFERENCES}}, }); return kCommonSyncablePrefsAllowlist; }
diff --git a/components/sync_preferences/common_syncable_prefs_database.h b/components/sync_preferences/common_syncable_prefs_database.h index ef323a96..e7d5104 100644 --- a/components/sync_preferences/common_syncable_prefs_database.h +++ b/components/sync_preferences/common_syncable_prefs_database.h
@@ -11,6 +11,7 @@ // Should be used by tests. extern const char kSyncablePrefForTesting[]; +extern const char kSyncableMergeableDictPrefForTesting[]; // This class provides an implementation for SyncablePrefsDatabase for common // syncable preferences, i.e. preferences which are shared between all
diff --git a/components/sync_preferences/dual_layer_user_pref_store.cc b/components/sync_preferences/dual_layer_user_pref_store.cc index 3995851..38f18d87 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.cc +++ b/components/sync_preferences/dual_layer_user_pref_store.cc
@@ -8,6 +8,7 @@ #include <utility> #include "base/auto_reset.h" +#include "base/logging.h" #include "base/observer_list.h" #include "base/strings/string_piece.h" #include "base/values.h" @@ -167,7 +168,10 @@ base::AutoReset<bool> setting_prefs(&is_setting_prefs_, true); if (IsPrefKeySyncable(key)) { if (IsPrefKeyMergeable(key)) { - // TODO(crbug.com/1416479): Unmerge and apply. + auto [new_local_value, new_account_value] = + UnmergeValue(key, std::move(value), flags); + account_pref_store_->SetValue(key, std::move(new_account_value), flags); + local_pref_store_->SetValue(key, std::move(new_local_value), flags); } else { account_pref_store_->SetValue(key, value.Clone(), flags); local_pref_store_->SetValue(key, std::move(value), flags); @@ -251,9 +255,12 @@ // Else, get the new value from whichever store has it and copy it to the // other one. if (merged_prefs_.GetValue(key, &new_value)) { - // TODO(crbug.com/1416479): Unmerge and apply instead. - account_pref_store_->SetValueSilently(key, new_value->Clone(), flags); - local_pref_store_->SetValueSilently(key, new_value->Clone(), flags); + auto [new_local_value, new_account_value] = + UnmergeValue(key, new_value->Clone(), flags); + account_pref_store_->SetValueSilently(key, std::move(new_account_value), + flags); + local_pref_store_->SetValueSilently(key, std::move(new_local_value), + flags); } else if (account_pref_store_->GetValue(key, &new_value)) { local_pref_store_->SetValueSilently(key, new_value->Clone(), flags); } else if (local_pref_store_->GetValue(key, &new_value)) { @@ -279,7 +286,12 @@ uint32_t flags) { if (IsPrefKeySyncable(key)) { if (IsPrefKeyMergeable(key)) { - // TODO(crbug.com/1416479): Unmerge and apply. + auto [new_local_value, new_account_value] = + UnmergeValue(key, std::move(value), flags); + account_pref_store_->SetValueSilently(key, std::move(new_account_value), + flags); + local_pref_store_->SetValueSilently(key, std::move(new_local_value), + flags); } else { account_pref_store_->SetValueSilently(key, value.Clone(), flags); local_pref_store_->SetValueSilently(key, std::move(value), flags); @@ -447,4 +459,54 @@ std::as_const(*this).MaybeMerge(pref_name, local_value, account_value)); } +std::pair<base::Value, base::Value> DualLayerUserPrefStore::UnmergeValue( + const std::string& pref_name, + base::Value value, + uint32_t flags) const { + DCHECK(IsPrefKeySyncable(pref_name)); + + // Note: There is no "standard" unmerging logic for list or scalar prefs. + // TODO(crbug.com/1416479): Allow support for custom unmerge logic. + if (pref_model_associator_client_->IsMergeableDictionaryPreference( + pref_name)) { + // Per crbug.com/1430854, it is possible for the value to not be of dict + // type. However, in this case, whatever is the type of `value` it's bound + // to be correct, as UnmergeValue() is called by setters which in turn are + // only called after a type check. + if (value.is_dict()) { + base::Value::Dict local_dict; + if (const base::Value* local_dict_value = nullptr; + local_pref_store_->GetValue(pref_name, &local_dict_value)) { + // It is assumed that the local store cannot contain value of incorrect + // type. + local_dict = local_dict_value->GetDict().Clone(); + } + base::Value::Dict account_dict; + if (const base::Value* account_dict_value = nullptr; + account_pref_store_->GetValue(pref_name, &account_dict_value)) { + // It is assumed that the account store cannot contain value of + // incorrect type. + account_dict = account_dict_value->GetDict().Clone(); + } + auto [new_local_dict, new_account_dict] = helper::UnmergeDictionaryValues( + std::move(value).TakeDict(), local_dict, account_dict); + // Note: This would still return an empty dict even if the pref didn't + // exist in either of the stores. This should however be okay since no + // actual pref value is leaked to the other. + return {base::Value(std::move(new_local_dict)), + base::Value(std::move(new_account_dict))}; + } else { + DLOG(ERROR) << pref_name + << " marked as a mergeable dict pref but is of type " + << value.type(); + } + } + + // Directly pass the new value as both the local value and the account value + // for prefs with no specific merge logic. + base::Value new_account_value(value.Clone()); + base::Value new_local_value(std::move(value)); + return {std::move(new_local_value), std::move(new_account_value)}; +} + } // namespace sync_preferences
diff --git a/components/sync_preferences/dual_layer_user_pref_store.h b/components/sync_preferences/dual_layer_user_pref_store.h index decd879b..c1d87914 100644 --- a/components/sync_preferences/dual_layer_user_pref_store.h +++ b/components/sync_preferences/dual_layer_user_pref_store.h
@@ -8,6 +8,7 @@ #include <memory> #include <set> #include <string> +#include <utility> #include "base/containers/flat_set.h" #include "base/functional/callback_forward.h" @@ -127,6 +128,12 @@ base::Value& local_value, base::Value& account_value); + // Unmerges `value` and returns the new local value and the account value (in + // that order). + std::pair<base::Value, base::Value> UnmergeValue(const std::string& pref_name, + base::Value value, + uint32_t flags) const; + // The two underlying pref stores, scoped to this device/profile and to the // user's signed-in account, respectively. const scoped_refptr<PersistentPrefStore> local_pref_store_;
diff --git a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc index c3f3901..aa2bb91 100644 --- a/components/sync_preferences/dual_layer_user_pref_store_unittest.cc +++ b/components/sync_preferences/dual_layer_user_pref_store_unittest.cc
@@ -1505,5 +1505,370 @@ EXPECT_TRUE(ValueInStoreIsAbsent(*store(), kPref2)); } +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldUnmergeMergeableDictPrefButNotAddUnchangedValueToAccountStore) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value local_dict(base::Value::Dict().Set("local_key", "local_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, local_dict.Clone(), 0); + + // `kPref1` only exists in the local store. + ASSERT_TRUE(ValueInStoreIsAbsent(*store()->GetAccountPrefStore(), kPref1)); + + // Effective value same as local value since pref is not in account store. + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, local_dict)); + + // Set the effective/merged value again. + // Note: Expecting no notification. + store()->SetValue(kPref1, local_dict.Clone(), 0); + + // Value in the local store remains unchanged. + EXPECT_TRUE( + ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, local_dict)); + // An empty dict pref is added to the account store. + // Note: This is an implementation detail. Ideally, not adding the pref to the + // account store might be a better approach. + EXPECT_TRUE(ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, + base::Value(base::Value::Type::DICT))); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldUnmergeMergeableDictPrefButNotAddUnchangedValueToLocalStore) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value account_dict( + base::Value::Dict().Set("account_key", "account_value")); + store()->GetAccountPrefStore()->SetValueSilently(kPref1, account_dict.Clone(), + 0); + // `kPref1` only exists in the account store. + ASSERT_TRUE(ValueInStoreIsAbsent(*store()->GetLocalPrefStore(), kPref1)); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, account_dict)); + + // Set the effective/merged value again. + // Note: Expecting no notification. + store()->SetValue(kPref1, account_dict.Clone(), 0); + + // An empty dict pref is added to the local store. + // Note: This is an implementation detail. Ideally, not adding the pref to the + // local store might be a better approach. + EXPECT_TRUE(ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, + base::Value(base::Value::Type::DICT))); + // Value in the account store remains unchanged. + EXPECT_TRUE( + ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, account_dict)); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldUnmergeAndApplyUpdatesForMergeableDictPrefOnSetValue) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value local_dict(base::Value::Dict() + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3") + .Set("common_key1", "local_value4") + .Set("common_key2", "common_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, local_dict.Clone(), 0); + + base::Value account_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value")); + store()->GetAccountPrefStore()->SetValueSilently(kPref1, account_dict.Clone(), + 0); + + base::Value merged_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value") + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3")); + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, merged_dict)); + + base::Value updated_dict(base::Value::Dict() + // New key, should get added to both + // stores. + .Set("new_key", "new_value") + // Updated value, should get added to both + // stores. + .Set("account_key1", "new_value1") + // No change, should only be in account + // store. + .Set("account_key2", "account_value2") + // No change, should only be in local + // store. + .Set("local_key1", "local_value1") + // Updated value, should get added to both + // stores. + .Set("local_key2", "new_value2") + // Updated value, should get added to both + // stores. + .Set("common_key1", "local_value4") + // Updated value, should get added to both + // stores. + .Set("common_key2", "new_common_value")); + EXPECT_CALL(observer_, OnPrefValueChanged(kPref1)); + store()->SetValue(kPref1, updated_dict.Clone(), 0); + + // Note: "local_key3" has been deleted. + base::Value updated_local_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("local_key1", "local_value1") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, + updated_local_dict)); + + // Note: "account_key3" has been deleted. + base::Value updated_account_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("account_key2", "account_value2") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, + updated_account_dict)); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, updated_dict)); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldUnmergeAndApplyUpdatesForMergeableDictPrefOnSetValueSilently) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value local_dict(base::Value::Dict() + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3") + .Set("common_key1", "local_value4") + .Set("common_key2", "common_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, local_dict.Clone(), 0); + + base::Value account_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value")); + store()->GetAccountPrefStore()->SetValueSilently(kPref1, account_dict.Clone(), + 0); + + base::Value merged_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value") + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3")); + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, merged_dict)); + + base::Value updated_dict(base::Value::Dict() + // New key, should get added to both + // stores. + .Set("new_key", "new_value") + // Updated value, should get added to both + // stores. + .Set("account_key1", "new_value1") + // No change, should only be in account + // store. + .Set("account_key2", "account_value2") + // No change, should only be in local + // store. + .Set("local_key1", "local_value1") + // Updated value, should get added to both + // stores. + .Set("local_key2", "new_value2") + // Updated value, should get added to both + // stores. + .Set("common_key1", "local_value4") + // Updated value, should get added to both + // stores. + .Set("common_key2", "new_common_value")); + store()->SetValueSilently(kPref1, updated_dict.Clone(), 0); + + // Note: "local_key3" has been deleted. + base::Value updated_local_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("local_key1", "local_value1") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, + updated_local_dict)); + + // Note: "account_key3" has been deleted. + base::Value updated_account_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("account_key2", "account_value2") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, + updated_account_dict)); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, updated_dict)); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldUnmergeAndApplyUpdatesForMergeableDictPrefOnReportPrefChanged) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value local_dict(base::Value::Dict() + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3") + .Set("common_key1", "local_value4") + .Set("common_key2", "common_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, local_dict.Clone(), 0); + + base::Value account_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value")); + store()->GetAccountPrefStore()->SetValueSilently(kPref1, account_dict.Clone(), + 0); + + base::Value merged_dict(base::Value::Dict() + .Set("account_key1", "account_value1") + .Set("account_key2", "account_value2") + .Set("account_key3", "account_value3") + .Set("common_key1", "account_value4") + .Set("common_key2", "common_value") + .Set("local_key1", "local_value1") + .Set("local_key2", "local_value2") + .Set("local_key3", "local_value3")); + base::Value* merged_value = nullptr; + ASSERT_TRUE(store()->GetMutableValue(kPref1, &merged_value)); + ASSERT_EQ(*merged_value, merged_dict); + + base::Value updated_dict(base::Value::Dict() + // New key, should get added to both + // stores. + .Set("new_key", "new_value") + // Updated value, should get added to both + // stores. + .Set("account_key1", "new_value1") + // No change, should only be in account + // store. + .Set("account_key2", "account_value2") + // No change, should only be in local + // store. + .Set("local_key1", "local_value1") + // Updated value, should get added to both + // stores. + .Set("local_key2", "new_value2") + // Updated value, should get added to both + // stores. + .Set("common_key1", "local_value4") + // Updated value, should get added to both + // stores. + .Set("common_key2", "new_common_value")); + *merged_value = updated_dict.Clone(); + EXPECT_CALL(observer_, OnPrefValueChanged(kPref1)); + store()->ReportValueChanged(kPref1, 0); + + // Note: "local_key3" has been deleted. + base::Value updated_local_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("local_key1", "local_value1") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, + updated_local_dict)); + + // Note: "account_key3" has been deleted. + base::Value updated_account_dict(base::Value::Dict() + .Set("new_key", "new_value") + .Set("account_key1", "new_value1") + .Set("account_key2", "account_value2") + .Set("local_key2", "new_value2") + .Set("common_key1", "local_value4") + .Set("common_key2", "new_common_value")); + EXPECT_TRUE(ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, + updated_account_dict)); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, updated_dict)); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldApplyUpdateOnMergeableListPrefAsNonMergeablePref) { + pref_model_associator_client_.MarkAsMergeableListPref(kPref1); + + base::Value local_list( + base::Value::List().Append("local_value").Append("common_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, local_list.Clone(), 0); + + base::Value account_list( + base::Value::List().Append("account_value").Append("common_value")); + store()->GetAccountPrefStore()->SetValueSilently(kPref1, account_list.Clone(), + 0); + + base::Value merged_list(base::Value::List() + .Append("account_value") + .Append("common_value") + .Append("local_value")); + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, merged_list)); + + base::Value updated_list(base::Value::List() + .Append("local_value") + .Append("account_value") + .Append("common_value")); + + EXPECT_CALL(observer_, OnPrefValueChanged(kPref1)); + // Writes to both stores. + store()->SetValue(kPref1, updated_list.Clone(), 0); + + EXPECT_TRUE( + ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, updated_list)); + EXPECT_TRUE( + ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, updated_list)); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, updated_list)); +} + +TEST_F(DualLayerUserPrefStoreMergeTest, + ShouldNotUnmergeIfIncorrectlyMarkedAsMergeableDict) { + pref_model_associator_client_.MarkAsMergeableDictPref(kPref1); + + base::Value local_dict_value( + base::Value::Dict().Set("local_key", "local_value")); + store()->GetLocalPrefStore()->SetValueSilently(kPref1, + local_dict_value.Clone(), 0); + + base::Value account_dict_value( + base::Value::Dict().Set("account_key", "account_value")); + store()->GetAccountPrefStore()->SetValueSilently( + kPref1, account_dict_value.Clone(), 0); + + base::Value new_value("new_value"); + + EXPECT_CALL(observer_, OnPrefValueChanged(kPref1)); + store()->SetValue(kPref1, new_value.Clone(), 0); + + ASSERT_TRUE(ValueInStoreIs(*store(), kPref1, new_value)); + // `kPref1` is considered as incorrectly marked as mergeable and is treated as + // a scalar value and overwritten to both stores. + EXPECT_TRUE(ValueInStoreIs(*store()->GetLocalPrefStore(), kPref1, new_value)); + EXPECT_TRUE( + ValueInStoreIs(*store()->GetAccountPrefStore(), kPref1, new_value)); +} + } // namespace } // namespace sync_preferences
diff --git a/components/test/data/history/history.63.sql b/components/test/data/history/history.63.sql new file mode 100644 index 0000000..a3122606 --- /dev/null +++ b/components/test/data/history/history.63.sql
@@ -0,0 +1,39 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','63'); +INSERT INTO meta VALUES('last_compatible_version','16'); +CREATE TABLE urls(id INTEGER PRIMARY KEY AUTOINCREMENT,url LONGVARCHAR,title LONGVARCHAR,visit_count INTEGER DEFAULT 0 NOT NULL,typed_count INTEGER DEFAULT 0 NOT NULL,last_visit_time INTEGER NOT NULL,hidden INTEGER DEFAULT 0 NOT NULL); +CREATE TABLE visits(id INTEGER PRIMARY KEY AUTOINCREMENT,url INTEGER NOT NULL,visit_time INTEGER NOT NULL,from_visit INTEGER,transition INTEGER DEFAULT 0 NOT NULL,segment_id INTEGER,visit_duration INTEGER DEFAULT 0 NOT NULL,incremented_omnibox_typed_score BOOLEAN DEFAULT FALSE NOT NULL,opener_visit INTEGER,originator_cache_guid TEXT,originator_visit_id INTEGER,originator_from_visit INTEGER,originator_opener_visit INTEGER,is_known_to_sync BOOLEAN DEFAULT FALSE NOT NULL,consider_for_ntp_most_visited BOOLEAN DEFAULT FALSE NOT NULL); +CREATE TABLE visit_source(id INTEGER PRIMARY KEY,source INTEGER NOT NULL); +CREATE TABLE keyword_search_terms (keyword_id INTEGER NOT NULL,url_id INTEGER NOT NULL,term LONGVARCHAR NOT NULL,normalized_term LONGVARCHAR NOT NULL); +CREATE TABLE downloads (id INTEGER PRIMARY KEY,guid VARCHAR NOT NULL,current_path LONGVARCHAR NOT NULL,target_path LONGVARCHAR NOT NULL,start_time INTEGER NOT NULL,received_bytes INTEGER NOT NULL,total_bytes INTEGER NOT NULL,state INTEGER NOT NULL,danger_type INTEGER NOT NULL,interrupt_reason INTEGER NOT NULL,hash BLOB NOT NULL,end_time INTEGER NOT NULL,opened INTEGER NOT NULL,last_access_time INTEGER NOT NULL,transient INTEGER NOT NULL,referrer VARCHAR NOT NULL,site_url VARCHAR NOT NULL,embedder_download_data VARCHAR NOT NULL,tab_url VARCHAR NOT NULL,tab_referrer_url VARCHAR NOT NULL,http_method VARCHAR NOT NULL,by_ext_id VARCHAR NOT NULL,by_ext_name VARCHAR NOT NULL,etag VARCHAR NOT NULL,last_modified VARCHAR NOT NULL,mime_type VARCHAR(255) NOT NULL,original_mime_type VARCHAR(255) NOT NULL); +CREATE TABLE downloads_url_chains (id INTEGER NOT NULL,chain_index INTEGER NOT NULL,url LONGVARCHAR NOT NULL, PRIMARY KEY (id, chain_index) ); +CREATE TABLE downloads_slices (download_id INTEGER NOT NULL,offset INTEGER NOT NULL,received_bytes INTEGER NOT NULL,finished INTEGER NOT NULL DEFAULT 0,PRIMARY KEY (download_id, offset) ); +CREATE TABLE segments (id INTEGER PRIMARY KEY,name VARCHAR,url_id INTEGER NON NULL); +CREATE TABLE segment_usage (id INTEGER PRIMARY KEY,segment_id INTEGER NOT NULL,time_slot INTEGER NOT NULL,visit_count INTEGER DEFAULT 0 NOT NULL); +CREATE TABLE typed_url_sync_metadata (storage_key INTEGER PRIMARY KEY NOT NULL,value BLOB); +CREATE TABLE content_annotations(visit_id INTEGER PRIMARY KEY,visibility_score NUMERIC,floc_protected_score NUMERIC,categories VARCHAR,page_topics_model_version INTEGER,annotation_flags INTEGER NOT NULL,entities VARCHAR,related_searches VARCHAR,search_normalized_url VARCHAR,search_terms LONGVARCHAR,alternative_title VARCHAR,page_language VARCHAR,password_state INTEGER DEFAULT 0 NOT NULL,has_url_keyed_image BOOLEAN NOT NULL); +CREATE TABLE context_annotations(visit_id INTEGER PRIMARY KEY,context_annotation_flags INTEGER NOT NULL,duration_since_last_visit INTEGER,page_end_reason INTEGER,total_foreground_duration INTEGER,browser_type INTEGER DEFAULT 0 NOT NULL,window_id INTEGER DEFAULT -1 NOT NULL,tab_id INTEGER DEFAULT -1 NOT NULL,task_id INTEGER DEFAULT -1 NOT NULL,root_task_id INTEGER DEFAULT -1 NOT NULL,parent_task_id INTEGER DEFAULT -1 NOT NULL,response_code INTEGER DEFAULT 0 NOT NULL); +CREATE TABLE clusters(cluster_id INTEGER PRIMARY KEY AUTOINCREMENT,should_show_on_prominent_ui_surfaces BOOLEAN NOT NULL,label VARCHAR NOT NULL,raw_label VARCHAR NOT NULL,triggerability_calculated BOOLEAN NOT NULL,originator_cache_guid TEXT NOT NULL,originator_cluster_id INTEGER NOT NULL); +CREATE TABLE clusters_and_visits(cluster_id INTEGER NOT NULL,visit_id INTEGER NOT NULL,score NUMERIC NOT NULL,engagement_score NUMERIC NOT NULL,url_for_deduping LONGVARCHAR NOT NULL,normalized_url LONGVARCHAR NOT NULL,url_for_display LONGVARCHAR NOT NULL,PRIMARY KEY(cluster_id,visit_id))WITHOUT ROWID; +CREATE TABLE cluster_keywords(cluster_id INTEGER NOT NULL,keyword VARCHAR NOT NULL,type INTEGER NOT NULL,score NUMERIC NOT NULL,collections VARCHAR NOT NULL); +CREATE TABLE cluster_visit_duplicates(visit_id INTEGER NOT NULL,duplicate_visit_id INTEGER NOT NULL,PRIMARY KEY(visit_id,duplicate_visit_id))WITHOUT ROWID; +CREATE TABLE history_sync_metadata (storage_key INTEGER PRIMARY KEY NOT NULL, value BLOB); +DELETE FROM sqlite_sequence; +CREATE INDEX visits_url_index ON visits (url); +CREATE INDEX visits_from_index ON visits (from_visit); +CREATE INDEX visits_time_index ON visits (visit_time); +CREATE INDEX visits_originator_id_index ON visits (originator_visit_id); +CREATE INDEX keyword_search_terms_index1 ON keyword_search_terms (keyword_id, normalized_term); +CREATE INDEX keyword_search_terms_index2 ON keyword_search_terms (url_id); +CREATE INDEX keyword_search_terms_index3 ON keyword_search_terms (term); +CREATE INDEX segments_name ON segments(name); +CREATE INDEX segments_url_id ON segments(url_id); +CREATE INDEX segment_usage_time_slot_segment_id ON segment_usage(time_slot, segment_id); +CREATE INDEX segments_usage_seg_id ON segment_usage(segment_id); +CREATE INDEX clusters_for_visit ON clusters_and_visits(visit_id); +CREATE INDEX cluster_keywords_cluster_id_index ON cluster_keywords(cluster_id); +CREATE INDEX urls_url_index ON urls (url); +COMMIT;
diff --git a/components/test/data/history/unit_tests_bundle_data.filelist b/components/test/data/history/unit_tests_bundle_data.filelist index a1bffc7..307aa50 100644 --- a/components/test/data/history/unit_tests_bundle_data.filelist +++ b/components/test/data/history/unit_tests_bundle_data.filelist
@@ -50,6 +50,7 @@ //components/test/data/history/history.60.sql //components/test/data/history/history.61.sql //components/test/data/history/history.62.sql +//components/test/data/history/history.63.sql //components/test/data/history/thumbnail_wild/Favicons.corrupt_meta.disable //components/test/data/history/thumbnail_wild/Favicons.v2.init.sql //components/test/data/history/thumbnail_wild/Favicons.v3.init.sql
diff --git a/components/test/data/omnibox/in_memory_url_index_test.sql b/components/test/data/omnibox/in_memory_url_index_test.sql index dc59a4d..044759a 100644 --- a/components/test/data/omnibox/in_memory_url_index_test.sql +++ b/components/test/data/omnibox/in_memory_url_index_test.sql
@@ -89,25 +89,25 @@ -- This file creates some visits, enough to test (in InMemoryURLIndexTest) -- the visits functionality, certainly not as many visits as are implied -- by the visit counts associated with the URLs above. -INSERT INTO "visits" VALUES(1, 1, 2, 4, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(2, 1, 5, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(3, 1, 12, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(4, 32, 1, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(5, 32, 2, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(6, 32, 3, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(7, 32, 4, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(8, 32, 5, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(9, 32, 6, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(10, 32, 7, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(11, 32, 8, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(12, 32, 9, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(13, 32, 10, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(14, 32, 11, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(15, 32, 12, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(16, 32, 13, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(17, 32, 14, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(18, 32, 15, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(19, 35, 0, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(20, 35, 7, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(21, 36, 1, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); -INSERT INTO "visits" VALUES(22, 36, 2, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE); +INSERT INTO "visits" VALUES(1, 1, 2, 4, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(2, 1, 5, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(3, 1, 12, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(4, 32, 1, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(5, 32, 2, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(6, 32, 3, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(7, 32, 4, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(8, 32, 5, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(9, 32, 6, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(10, 32, 7, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(11, 32, 8, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(12, 32, 9, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(13, 32, 10, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(14, 32, 11, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(15, 32, 12, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(16, 32, 13, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(17, 32, 14, 0, 0, 0, 1, FALSE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(18, 32, 15, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(19, 35, 0, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(20, 35, 7, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(21, 36, 1, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE); +INSERT INTO "visits" VALUES(22, 36, 2, 0, 1, 0, 1, TRUE, 0, '', 0, 0, 0, FALSE, FALSE);
diff --git a/components/translate/core/browser/translate_infobar_delegate.cc b/components/translate/core/browser/translate_infobar_delegate.cc index 3c3741f..2cb2ad6 100644 --- a/components/translate/core/browser/translate_infobar_delegate.cc +++ b/components/translate/core/browser/translate_infobar_delegate.cc
@@ -83,20 +83,26 @@ old_infobar = infobar_manager->infobar_at(i); old_delegate = old_infobar->delegate()->AsTranslateInfoBarDelegate(); if (old_delegate) { - if (!replace_existing_infobar) + if (!replace_existing_infobar) { return; + } break; } } - // Try to reuse existing translate infobar delegate. if (old_delegate) { - old_delegate->step_ = step; - for (auto& observer : old_delegate->observers_) { - observer.OnTargetLanguageChanged(target_language); - observer.OnTranslateStepChanged(step, error_type); + if (!triggered_from_menu) { + // Try to reuse existing translate infobar delegate. + old_delegate->step_ = step; + for (auto& observer : old_delegate->observers_) { + observer.OnTargetLanguageChanged(target_language); + observer.OnTranslateStepChanged(step, error_type); + } + return; } - return; + // The old infobar may still be visible, but a new translate flow started. + // Remove the previous infobar and add a new one. + infobar_manager->RemoveInfoBar(old_infobar); } // Add the new delegate.
diff --git a/components/translate/core/browser/translate_infobar_delegate_unittest.cc b/components/translate/core/browser/translate_infobar_delegate_unittest.cc index d612a5fc..0db5884 100644 --- a/components/translate/core/browser/translate_infobar_delegate_unittest.cc +++ b/components/translate/core/browser/translate_infobar_delegate_unittest.cc
@@ -71,6 +71,20 @@ MOCK_METHOD(bool, IsDeclinedByUser, (), (override)); }; +class MockManagerObserver : public infobars::InfoBarManager::Observer { + public: + MOCK_METHOD(void, OnInfoBarAdded, (infobars::InfoBar*), (override)); + MOCK_METHOD(void, OnInfoBarRemoved, (infobars::InfoBar*, bool), (override)); + MOCK_METHOD(void, + OnInfoBarReplaced, + (infobars::InfoBar*, infobars::InfoBar*), + (override)); + MOCK_METHOD(void, + OnManagerShuttingDown, + (infobars::InfoBarManager*), + (override)); +}; + class TestLanguageModel : public language::LanguageModel { std::vector<LanguageDetails> GetLanguages() override { return {LanguageDetails("en", 1.0)}; @@ -131,8 +145,12 @@ }; TEST_F(TranslateInfoBarDelegateTest, CreateTranslateInfobarDelegate) { + ::testing::StrictMock<MockObserver> mock_observer; + ::testing::StrictMock<MockManagerObserver> mock_manager_observer; EXPECT_EQ(infobar_manager_->infobar_count(), 0u); + infobar_manager_->AddObserver(&mock_manager_observer); + EXPECT_CALL(mock_manager_observer, OnInfoBarAdded(_)); // Create the initial InfoBar TranslateInfoBarDelegate::Create( /*replace_existing_infobar=*/false, manager_->GetWeakPtr(), @@ -143,6 +161,7 @@ EXPECT_EQ(infobar_manager_->infobar_count(), 1u); TranslateInfoBarDelegate* delegate = infobar_manager_->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate(); + delegate->AddObserver(&mock_observer); EXPECT_FALSE(delegate->is_error()); EXPECT_EQ(TranslateStep::TRANSLATE_STEP_TRANSLATING, delegate->translate_step()); @@ -150,6 +169,10 @@ EXPECT_EQ(delegate->target_language_code(), kTargetLanguage); EXPECT_EQ(delegate->source_language_code(), kSourceLanguage); + EXPECT_CALL(mock_observer, OnTargetLanguageChanged("en")); + EXPECT_CALL(mock_observer, OnTranslateStepChanged( + TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE, + TranslateErrors::NONE)); // Create another one and replace the old one TranslateInfoBarDelegate::Create( /*replace_existing_infobar=*/true, manager_->GetWeakPtr(), @@ -158,9 +181,10 @@ /*triggered_from_menu=*/false); EXPECT_EQ(infobar_manager_->infobar_count(), 1u); - delegate = + TranslateInfoBarDelegate* delegate_after = infobar_manager_->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate(); - EXPECT_EQ(delegate->translate_step(), + + EXPECT_EQ(delegate_after->translate_step(), TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE); // Create but don't replace existing one. @@ -171,10 +195,74 @@ /*triggered_from_menu=*/false); EXPECT_EQ(infobar_manager_->infobar_count(), 1u); - delegate = + TranslateInfoBarDelegate* delegate_final = infobar_manager_->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate(); - ASSERT_EQ(delegate->translate_step(), + ASSERT_EQ(delegate_final->translate_step(), TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE); + delegate->RemoveObserver(&mock_observer); + infobar_manager_->RemoveObserver(&mock_manager_observer); +} + +TEST_F(TranslateInfoBarDelegateTest, CreateTranslateInfobarDelegateFromMenu) { + ::testing::StrictMock<MockObserver> mock_observer; + ::testing::StrictMock<MockManagerObserver> mock_manager_observer; + EXPECT_EQ(infobar_manager_->infobar_count(), 0u); + infobar_manager_->AddObserver(&mock_manager_observer); + + EXPECT_CALL(mock_manager_observer, OnInfoBarAdded(_)); + // Create the initial InfoBar + TranslateInfoBarDelegate::Create( + /*replace_existing_infobar=*/false, manager_->GetWeakPtr(), + infobar_manager_.get(), TranslateStep::TRANSLATE_STEP_TRANSLATING, + kSourceLanguage, kTargetLanguage, TranslateErrors::NONE, + /*triggered_from_menu=*/true); + + EXPECT_EQ(infobar_manager_->infobar_count(), 1u); + infobars::InfoBar* infobar = infobar_manager_->infobar_at(0); + TranslateInfoBarDelegate* delegate = + infobar->delegate()->AsTranslateInfoBarDelegate(); + delegate->AddObserver(&mock_observer); + EXPECT_FALSE(delegate->is_error()); + EXPECT_EQ(TranslateStep::TRANSLATE_STEP_TRANSLATING, + delegate->translate_step()); + EXPECT_TRUE(delegate->triggered_from_menu()); + EXPECT_EQ(delegate->target_language_code(), kTargetLanguage); + EXPECT_EQ(delegate->source_language_code(), kSourceLanguage); + + // Create another one and replace the old one. As "triggered_from_menu", the + // previous infobar will be removed and a new will be created. + EXPECT_CALL(mock_manager_observer, OnInfoBarRemoved(infobar, true)); + EXPECT_CALL(mock_observer, OnTranslateInfoBarDelegateDestroyed(delegate)); + EXPECT_CALL(mock_manager_observer, OnInfoBarAdded(_)); + TranslateInfoBarDelegate::Create( + /*replace_existing_infobar=*/true, manager_->GetWeakPtr(), + infobar_manager_.get(), TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE, + kSourceLanguage, kTargetLanguage, TranslateErrors::NONE, + /*triggered_from_menu=*/true); + + EXPECT_EQ(infobar_manager_->infobar_count(), 1u); + TranslateInfoBarDelegate* delegate_after = + infobar_manager_->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate(); + delegate_after->AddObserver(&mock_observer); + + EXPECT_EQ(delegate_after->translate_step(), + TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE); + + // Create but don't replace existing one. + TranslateInfoBarDelegate::Create( + /*replace_existing_infobar=*/false, manager_->GetWeakPtr(), + infobar_manager_.get(), TranslateStep::TRANSLATE_STEP_BEFORE_TRANSLATE, + kSourceLanguage, kTargetLanguage, TranslateErrors::NONE, + /*triggered_from_menu=*/true); + + EXPECT_EQ(infobar_manager_->infobar_count(), 1u); + TranslateInfoBarDelegate* delegate_final = + infobar_manager_->infobar_at(0)->delegate()->AsTranslateInfoBarDelegate(); + ASSERT_EQ(delegate_final->translate_step(), + TranslateStep::TRANSLATE_STEP_AFTER_TRANSLATE); + + delegate_after->RemoveObserver(&mock_observer); + infobar_manager_->RemoveObserver(&mock_manager_observer); } TEST_F(TranslateInfoBarDelegateTest, DestructTranslateInfobarDelegate) {
diff --git a/components/ukm/BUILD.gn b/components/ukm/BUILD.gn index c42b5f2..2343b40 100644 --- a/components/ukm/BUILD.gn +++ b/components/ukm/BUILD.gn
@@ -91,6 +91,7 @@ deps = [ "//base", "//components/history/core/browser", + "//components/metrics", "//components/sync/base", "//components/sync/driver", "//google_apis",
diff --git a/components/ukm/observers/DEPS b/components/ukm/observers/DEPS index 8dbe4775..158776a8 100644 --- a/components/ukm/observers/DEPS +++ b/components/ukm/observers/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+components/metrics", "+components/history/core/browser", "+components/sync", "+google_apis",
diff --git a/components/ukm/observers/ukm_consent_state_observer.cc b/components/ukm/observers/ukm_consent_state_observer.cc index c1d0b44..a938eca 100644 --- a/components/ukm/observers/ukm_consent_state_observer.cc +++ b/components/ukm/observers/ukm_consent_state_observer.cc
@@ -10,6 +10,7 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" +#include "components/metrics/metrics_switches.h" #include "components/sync/base/model_type.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_service_utils.h" @@ -61,7 +62,6 @@ consent_state.Put(type); } -// static UkmConsentStateObserver::ProfileState UkmConsentStateObserver::GetProfileState( syncer::SyncService* sync_service, UrlKeyedDataCollectionConsentHelper* consent_helper) { @@ -69,7 +69,8 @@ DCHECK(consent_helper); ProfileState state; - const bool msbb_consent = consent_helper->IsEnabled(); + const bool msbb_consent = + consent_helper->IsEnabled() || metrics::IsMsbbSettingForcedOnForUkm(); if (msbb_consent) state.SetConsentType(MSBB); @@ -85,6 +86,13 @@ state.SetConsentType(APPS); } +#if BUILDFLAG(IS_CHROMEOS_ASH) + if (base::FeatureList::IsEnabled(kAppMetricsOnlyRelyOnAppSync) && + IsDeviceInDemoMode()) { + state.SetConsentType(APPS); + } +#endif + return state; } @@ -207,4 +215,14 @@ return ukm_consent_state_; } +#if BUILDFLAG(IS_CHROMEOS_ASH) +void UkmConsentStateObserver::SetIsDemoMode(bool is_device_in_demo_mode) { + is_device_in_demo_mode_ = is_device_in_demo_mode; +} + +bool UkmConsentStateObserver::IsDeviceInDemoMode() { + return is_device_in_demo_mode_; +} +#endif + } // namespace ukm
diff --git a/components/ukm/observers/ukm_consent_state_observer.h b/components/ukm/observers/ukm_consent_state_observer.h index 28b573e..a0f3a6f4 100644 --- a/components/ukm/observers/ukm_consent_state_observer.h +++ b/components/ukm/observers/ukm_consent_state_observer.h
@@ -61,6 +61,14 @@ bool total_purge, UkmConsentState previous_consent_state) = 0; +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Used to set is_demo_mode_ field. + void SetIsDemoMode(bool is_demo_mode); + + // Return whether the device is in demo mode. + bool IsDeviceInDemoMode(); +#endif + private: // syncer::SyncServiceObserver: void OnStateChanged(syncer::SyncService* sync) override; @@ -109,7 +117,7 @@ // Gets the current state of a profile. // |sync| and |consent_helper| must not be null. - static ProfileState GetProfileState( + ProfileState GetProfileState( syncer::SyncService* sync, unified_consent::UrlKeyedDataCollectionConsentHelper* consent_helper); @@ -135,6 +143,13 @@ // change. Consent is only granted when EVERY profile consents. // Empty means none. UkmConsentState ukm_consent_state_; + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // Indicate whether the device is in demo mode. If it is true, + // set APPS consent to collect App usage data for active demo + // session. Default to false. + bool is_device_in_demo_mode_ = false; +#endif }; } // namespace ukm
diff --git a/components/variations/variations_ids_provider.cc b/components/variations/variations_ids_provider.cc index 69f8855df..58c22c06 100644 --- a/components/variations/variations_ids_provider.cc +++ b/components/variations/variations_ids_provider.cc
@@ -202,6 +202,26 @@ &force_disabled_ids_set_)) { return false; } + + // When disabling a variation ID through the command line, ensure it is + // disabled in every contexts. + static_assert( + ID_COLLECTION_COUNT == 6, + "If you add a new collection key, make sure it can be disabled here."); + std::set<VariationIDEntry> additional_disabled_ids; + for (const auto& entry : force_disabled_ids_set_) { + if (entry.second == GOOGLE_WEB_PROPERTIES_ANY_CONTEXT) { + additional_disabled_ids.insert( + VariationIDEntry(entry.first, GOOGLE_WEB_PROPERTIES_SIGNED_IN)); + additional_disabled_ids.insert( + VariationIDEntry(entry.first, GOOGLE_WEB_PROPERTIES_FIRST_PARTY)); + } else if (entry.second == GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT) { + additional_disabled_ids.insert(VariationIDEntry( + entry.first, GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY)); + } + } + force_disabled_ids_set_.merge(additional_disabled_ids); + if (variation_ids_cache_initialized_) { // Update the cached variation ids header value after cache initialization, // otherwise the change won't be in the cache.
diff --git a/components/visitedlink/browser/visitedlink_writer.cc b/components/visitedlink/browser/visitedlink_writer.cc index 9262dce..4ed5cbf 100644 --- a/components/visitedlink/browser/visitedlink_writer.cc +++ b/components/visitedlink/browser/visitedlink_writer.cc
@@ -872,9 +872,8 @@ // The table is the size of the table followed by the entries. uint32_t alloc_size = num_entries * sizeof(Fingerprint) + sizeof(SharedHeader); - UMA_HISTOGRAM_CUSTOM_COUNTS( - "History.VisitedLinks.HashTableSizeOnTableCreation", - alloc_size / 1024 / 1024, 1, 10000, 100); + UMA_HISTOGRAM_CUSTOM_COUNTS("History.VisitedLinks.HashTableSizeOnTableCreate", + alloc_size / 1024 / 1024, 1, 10000, 100); // Create the shared memory object. *memory = base::ReadOnlySharedMemoryRegion::Create(alloc_size);
diff --git a/components/webdata_services/web_data_service_wrapper.cc b/components/webdata_services/web_data_service_wrapper.cc index ef731fd..eb6b5d2 100644 --- a/components/webdata_services/web_data_service_wrapper.cc +++ b/components/webdata_services/web_data_service_wrapper.cc
@@ -13,6 +13,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/task/thread_pool.h" #include "build/build_config.h" +#include "components/autofill/core/browser/geo/country_names.h" #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h" #include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h" #include "components/autofill/core/browser/webdata/autofill_table.h" @@ -121,6 +122,13 @@ #endif profile_database_->LoadDatabase(); + // Ensure the CountryNames instance has the locale set. It is used in + // the autofill profile bridge, but putting it into the bridge directly + // creates a data race with PDM, where the locale is set as well. This is + // a tmp solution until the bug below is resolved. + // TODO(1430250): Find a unified place for setting the locale + autofill::CountryNames::SetLocaleString(application_locale); + profile_autofill_web_data_ = base::MakeRefCounted<autofill::AutofillWebDataService>( profile_database_, ui_task_runner, db_task_runner);
diff --git a/content/app/initialize_mojo_core.cc b/content/app/initialize_mojo_core.cc index d4ccbff..5a076215 100644 --- a/content/app/initialize_mojo_core.cc +++ b/content/app/initialize_mojo_core.cc
@@ -13,6 +13,7 @@ #include "content/public/common/content_switches.h" #include "mojo/core/embedder/configuration.h" #include "mojo/core/embedder/embedder.h" +#include "mojo/core/embedder/features.h" #include "mojo/public/c/system/functions.h" #include "mojo/public/c/system/types.h" #include "mojo/public/cpp/base/shared_memory_utils.h" @@ -55,6 +56,10 @@ // On Windows it's not necessary to broker shared memory allocation, as // even sandboxed processes can allocate their own without trouble. config.force_direct_shared_memory_allocation = true; +#elif BUILDFLAG(IS_ANDROID) + // On Android we run a Finch experiment testing direct memory allocation. + config.force_direct_shared_memory_allocation = base::FeatureList::IsEnabled( + mojo::core::kMojoDirectSharedMemoryAndroid); #endif }
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc index f2a2626..adb85e586 100644 --- a/content/browser/accessibility/web_contents_accessibility_android.cc +++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -1553,8 +1553,7 @@ // The AXMode flags will be set according to enabled feature flags and what is // needed by the current system as indicated by the parameters. - if (!features::IsComputeAXModeEnabled() && - !features::IsAccessibilityFormControlsAXModeEnabled()) { + if (!features::IsAccessibilityAXModesEnabled()) { // When the browser is not yet accessible, then set the AXMode to // |ui::kAXModeComplete| for all web contents. if (!accessibility_state->IsAccessibleBrowser()) { @@ -1563,94 +1562,41 @@ return; } - // If the ComputeAXMode flag has been enabled by itself, |ui::kAXModeComplete| - // will be set if a screen reader is present, and |ui::kAXModeBasic| - // otherwise. - if (features::IsComputeAXModeEnabled() && - !features::IsAccessibilityFormControlsAXModeEnabled()) { - if (is_screen_reader_enabled) { - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeComplete); - } else { - // Remove the mode flags present in kAXModeComplete but not in - // kAXModeBasic, thereby reverting the mode to kAXModeBasic while - // not touching any other flags. - ui::AXMode flags_to_remove(ui::kAXModeComplete.flags() & - ~ui::kAXModeBasic.flags()); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - - // Add basic mode - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeBasic); - } - return; - } - - // If the AccessibilityFormControlsAXMode flag has been enabled by itself, - // |ui::kAXModeFormControls| will be set if form controls mode is enabled, and - // |ui::kAXModeComplete| otherwise. - if (!features::IsComputeAXModeEnabled() && - features::IsAccessibilityFormControlsAXModeEnabled()) { - if (form_controls_mode) { - // TODO (aldietz): Add a SetAccessibilityModeFlags method to - // BrowserAccessibilityState to add and remove flags atomically in one - // operation. - // Remove the mode flags present in kAXModeComplete but not in - // kAXModeFormControls, thereby reverting the mode to kAXModeFormControls - // while not touching any other flags. - ui::AXMode flags_to_remove(ui::kAXModeComplete.flags() & - ~ui::kAXModeFormControls.flags()); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - - // Add form controls experimental mode. - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeFormControls); - } else { - // Remove form controls experimental mode to preserve screen reader mode. - ui::AXMode flags_to_remove(ui::AXMode::kNone, - ui::AXMode::kExperimentalFormControls); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeComplete); - } - return; - } - - // If both ComputeAXMode and AccessibilityFormControlsAXMode flags have been - // enabled, |ui::kAXModeComplete| will be set if a screen reader is present, + // If the AccessibilityAXModes feature flag has been enabled, then set + // |ui::kAXModeComplete| if a screen reader is present, // |ui::kAXModeFormControls| if form controls mode is enabled, and // |ui::kAXModeBasic| otherwise. - if (features::IsComputeAXModeEnabled() && - features::IsAccessibilityFormControlsAXModeEnabled()) { - if (is_screen_reader_enabled) { - // Remove form controls experimental mode to preserve screen reader mode. - ui::AXMode flags_to_remove(ui::AXMode::kNone, - ui::AXMode::kExperimentalFormControls); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); + if (is_screen_reader_enabled) { + // Remove form controls experimental mode to preserve screen reader mode. + ui::AXMode flags_to_remove(ui::AXMode::kNone, + ui::AXMode::kExperimentalFormControls); + accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeComplete); - } else if (form_controls_mode) { - // TODO (aldietz): Add a SetAccessibilityModeFlags method to - // BrowserAccessibilityState to add and remove flags atomically in one - // operation. - // Remove the mode flags present in kAXModeComplete but not in - // kAXModeFormControls, thereby reverting the mode to kAXModeFormControls - // while not touching any other flags. - ui::AXMode flags_to_remove(ui::kAXModeComplete.flags() & - ~ui::kAXModeFormControls.flags()); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); + accessibility_state->AddAccessibilityModeFlags(ui::kAXModeComplete); + } else if (form_controls_mode) { + // TODO (aldietz): Add a SetAccessibilityModeFlags method to + // BrowserAccessibilityState to add and remove flags atomically in one + // operation. + // Remove the mode flags present in kAXModeComplete but not in + // kAXModeFormControls, thereby reverting the mode to kAXModeFormControls + // while not touching any other flags. + ui::AXMode flags_to_remove(ui::kAXModeComplete.flags() & + ~ui::kAXModeFormControls.flags()); + accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - // Add form controls experimental mode. - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeFormControls); - } else { - // Remove the mode flags present in kAXModeComplete and - // kExperimentalFormControls but not in kAXModeBasic, thereby reverting - // the mode to kAXModeBasic while not touching any other flags. - ui::AXMode flags_to_remove( - ui::kAXModeComplete.flags() & ~ui::kAXModeBasic.flags(), - ui::AXMode::kExperimentalFormControls); - accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); + // Add form controls experimental mode. + accessibility_state->AddAccessibilityModeFlags(ui::kAXModeFormControls); + } else { + // Remove the mode flags present in kAXModeComplete and + // kExperimentalFormControls but not in kAXModeBasic, thereby reverting + // the mode to kAXModeBasic while not touching any other flags. + ui::AXMode flags_to_remove( + ui::kAXModeComplete.flags() & ~ui::kAXModeBasic.flags(), + ui::AXMode::kExperimentalFormControls); + accessibility_state->RemoveAccessibilityModeFlags(flags_to_remove); - // Add basic mode - accessibility_state->AddAccessibilityModeFlags(ui::kAXModeBasic); - } + // Add basic mode + accessibility_state->AddAccessibilityModeFlags(ui::kAXModeBasic); } }
diff --git a/content/browser/android/content_feature_list.cc b/content/browser/android/content_feature_list.cc index e2cace37a..becd3e9 100644 --- a/content/browser/android/content_feature_list.cc +++ b/content/browser/android/content_feature_list.cc
@@ -26,10 +26,10 @@ &blink::features::kStylusPointerAdjustment, &blink::features::kStylusRichGestures, &features::kAccessibilityPageZoom, + &features::kAccessibilityAXModes, &features::kAutoDisableAccessibilityV2, &features::kBackgroundMediaRendererHasModerateBinding, &features::kBindingManagerConnectionLimit, - &features::kComputeAXMode, &features::kFedCm, &features::kOnDemandAccessibilityEvents, &kOptimizeImmHideCalls,
diff --git a/content/browser/cookie_store/cookie_store_manager.cc b/content/browser/cookie_store/cookie_store_manager.cc index 8e983ff..6f86a2e 100644 --- a/content/browser/cookie_store/cookie_store_manager.cc +++ b/content/browser/cookie_store/cookie_store_manager.cc
@@ -22,6 +22,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_process_host.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" +#include "net/cookies/cookie_partition_key.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" #include "services/network/public/mojom/network_context.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -191,7 +192,7 @@ return; } - if (!(storage_key == service_worker_registration->key())) { + if (storage_key != service_worker_registration->key()) { std::move(bad_message_callback).Run("Invalid service worker"); std::move(callback).Run(false); return; @@ -205,8 +206,6 @@ } for (const auto& mojo_subscription : mojo_subscriptions) { - // TODO(crbug.com/1246549): This validation step should consider the storage - // key. if (!blink::ServiceWorkerScopeMatches(service_worker_registration->scope(), mojo_subscription->url)) { // Blink should have validated subscription URLs against the service @@ -347,8 +346,9 @@ // StoreSubscriptions() needs to be called before updating // |subscriptions_by_registration_|, because the update may delete the vector // holding the subscriptions. - StoreSubscriptions(service_worker_registration_id, storage_key, - live_subscriptions, std::move(callback)); + StoreSubscriptions(service_worker_registration_id, + service_worker_registration->key(), live_subscriptions, + std::move(callback)); if (live_subscriptions.empty()) { subscriptions_by_registration_.erase(all_subscriptions_it); } else { @@ -609,6 +609,34 @@ DCHECK(registration); if (!manager) return; + + // If the change is for a partition cookie, we check that its + // partition key matches the StorageKey's top-level site. + if (auto cookie_partition_key = + registration->key().ToCookiePartitionKey()) { + if (change.cookie.IsPartitioned() && + change.cookie.PartitionKey() != cookie_partition_key) { + return; + } + // If the cookie partition key for the worker has a nonce, then + // only partitioned cookies should be visible. + if (net::CookiePartitionKey::HasNonce(cookie_partition_key) && + !change.cookie.IsPartitioned()) { + return; + } + } + + if (registration->key().IsThirdPartyContext() && + !change.cookie.IsEffectivelySameSiteNone()) { + return; + } + + // TODO(crbug.com/1427879): Third-party partitioned workers should + // not have access to unpartitioned state when third-party cookie + // blocking is on. + // TODO(crbug.com/1427879): Should RSA grant unpartitioned cookie + // access? + manager->DispatchChangeEvent(std::move(registration), change); }, weak_factory_.GetWeakPtr(), change));
diff --git a/content/browser/cookie_store/cookie_store_manager_unittest.cc b/content/browser/cookie_store/cookie_store_manager_unittest.cc index 0a9897c..9edb73f 100644 --- a/content/browser/cookie_store/cookie_store_manager_unittest.cc +++ b/content/browser/cookie_store/cookie_store_manager_unittest.cc
@@ -9,6 +9,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" #include "base/test/bind.h" +#include "base/test/scoped_feature_list.h" #include "content/browser/cookie_store/cookie_store_manager.h" #include "content/browser/service_worker/embedded_worker_test_helper.h" #include "content/browser/service_worker/fake_embedded_worker_instance_client.h" @@ -20,6 +21,7 @@ #include "content/test/storage_partition_test_helpers.h" #include "mojo/public/cpp/test_support/fake_message_dispatch_context.h" #include "mojo/public/cpp/test_support/test_utils.h" +#include "net/base/features.h" #include "net/cookies/cookie_access_result.h" #include "net/cookies/cookie_constants.h" #include "net/cookies/cookie_util.h" @@ -105,6 +107,10 @@ const char kGoogleWorkerScript[] = "https://google.com/a/script.js"; const char kLegacyScope[] = "https://legacy.com/a/"; const char kLegacyWorkerScript[] = "https://legacy.com/a/script.js"; +const char kThirdPartyTopLevelSite[] = "https://toplevelsite.com"; + +const base::UnguessableToken kStorageKeyNonce = + base::UnguessableToken::Create(); // Mocks a service worker that uses the cookieStore API. class CookieStoreWorkerTestHelper : public EmbeddedWorkerTestHelper { @@ -196,17 +202,18 @@ SetUpServiceWorkerContext(); } - // Returns the new service worker's registration id. + // Returns the new service worker's registration id after it is registered + // with the specified StorageKey. // // Spins in a nested RunLoop until the new service worker is activated. The // new service worker is guaranteed to be running when the method returns. - int64_t RegisterServiceWorker(const char* scope, const char* script_url) { + int64_t RegisterServiceWorkerWithStorageKey(const char* scope, + const char* script_url, + const blink::StorageKey& key) { bool success = false; int64_t registration_id; blink::mojom::ServiceWorkerRegistrationOptions options; options.scope = GURL(scope); - const blink::StorageKey key = - blink::StorageKey::CreateFirstParty(url::Origin::Create(GURL(scope))); base::RunLoop run_loop; worker_test_helper_->context()->RegisterServiceWorker( GURL(script_url), key, options, @@ -230,6 +237,16 @@ return registration_id; } + // Returns the new service worker's registration id. + // + // Spins in a nested RunLoop until the new service worker is activated. The + // new service worker is guaranteed to be running when the method returns. + int64_t RegisterServiceWorker(const char* scope, const char* script_url) { + return RegisterServiceWorkerWithStorageKey( + scope, script_url, + blink::StorageKey::CreateFirstParty(url::Origin::Create(GURL(scope)))); + } + // The given service worker will be running after the method returns. // // RegisterServiceWorker() also guarantees that the newly created SW is @@ -385,6 +402,23 @@ legacy_service_ = std::make_unique<CookieStoreSync>(legacy_service_remote_.get()); + cookie_store_manager_->BindReceiver( + third_party_service_remote_.BindNewPipeAndPassReceiver(), + blink::StorageKey::Create( + url::Origin::Create(GURL(kExampleScope)), + net::SchemefulSite(GURL(kThirdPartyTopLevelSite)), + blink::mojom::AncestorChainBit::kCrossSite, + /*third_party_partitioning_allowed=*/true)); + third_party_service_ = + std::make_unique<CookieStoreSync>(third_party_service_remote_.get()); + + cookie_store_manager_->BindReceiver( + nonced_service_remote_.BindNewPipeAndPassReceiver(), + blink::StorageKey::CreateWithNonce( + url::Origin::Create(GURL(kExampleScope)), kStorageKeyNonce)); + nonced_service_ = + std::make_unique<CookieStoreSync>(nonced_service_remote_.get()); + // Set Legacy cookie access setting for legacy.com to test // CookieAccessSemantics. std::vector<ContentSettingPatternSource> legacy_settings; @@ -409,9 +443,13 @@ example_service_.reset(); google_service_.reset(); legacy_service_.reset(); + third_party_service_.reset(); + nonced_service_.reset(); example_service_remote_.reset(); google_service_remote_.reset(); legacy_service_remote_.reset(); + third_party_service_remote_.reset(); + nonced_service_remote_.reset(); cookie_manager_.reset(); cookie_store_manager_.reset(); storage_partition_impl_.reset(); @@ -427,9 +465,10 @@ base::RepeatingClosure cookie_store_initializer_; mojo::Remote<blink::mojom::CookieStore> example_service_remote_, - google_service_remote_, legacy_service_remote_; + google_service_remote_, legacy_service_remote_, + third_party_service_remote_, nonced_service_remote_; std::unique_ptr<CookieStoreSync> example_service_, google_service_, - legacy_service_; + legacy_service_, third_party_service_, nonced_service_; }; const int64_t CookieStoreManagerTest::kInvalidRegistrationId; @@ -1777,6 +1816,210 @@ bad_mesage_observer.WaitForBadMessage()); } +// TODO(crbug.com/1427879): Test that the worker still can access unpartitioned +// cookies with third-party cookie blocking on. +TEST_F(CookieStoreManagerTest, PartitionedWorker_FirstPartyPartition) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({net::features::kPartitionedCookies, + net::features::kThirdPartyStoragePartitioning}, + {}); + + // Register 1P worker. + int64_t first_party_registration_id = + RegisterServiceWorker(kExampleScope, kExampleWorkerScript); + ASSERT_NE(first_party_registration_id, kInvalidRegistrationId); + + // Add cookie change subscriptions to each worker. + CookieStoreSync::Subscriptions subscriptions; + subscriptions.emplace_back(blink::mojom::CookieChangeSubscription::New()); + subscriptions.back()->name = ""; + subscriptions.back()->match_type = + ::network::mojom::CookieMatchType::STARTS_WITH; + subscriptions.back()->url = GURL(kExampleScope); + EXPECT_TRUE(example_service_->AddSubscriptions(first_party_registration_id, + std::move(subscriptions))); + + // Set unpartitioned cookie. + ASSERT_TRUE( + SetSessionCookie("cookie-name1", "new-value1", "example.com", "/")); + task_environment_.RunUntilIdle(); + + // 1P workers should see the unpartitioned cookie. + ASSERT_EQ(1u, worker_test_helper_->changes().size()); + + worker_test_helper_->changes().clear(); + + // Set partitioned cookie in the same partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name3", "new-value3", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting(GURL(kExampleScope))))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(1u, worker_test_helper_->changes().size()); + + worker_test_helper_->changes().clear(); + + // Set partitioned cookie in a different partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name4", "new-value4", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting( + GURL(kThirdPartyTopLevelSite))))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(0u, worker_test_helper_->changes().size()); +} + +// TODO(crbug.com/1427879): Test that the worker cannot access unpartitioned +// cookies with third-party cookie blocking on. +TEST_F(CookieStoreManagerTest, PartitionedWorker_ThirdPartyPartition) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({net::features::kPartitionedCookies, + net::features::kThirdPartyStoragePartitioning}, + {}); + + // Register 3P partitioned worker. + blink::StorageKey third_party_storage_key = blink::StorageKey::Create( + url::Origin::Create(GURL(kExampleScope)), + net::SchemefulSite(GURL(kThirdPartyTopLevelSite)), + blink::mojom::AncestorChainBit::kCrossSite); + + int64_t third_party_registration_id = RegisterServiceWorkerWithStorageKey( + kExampleScope, kExampleWorkerScript, third_party_storage_key); + ASSERT_NE(third_party_registration_id, kInvalidRegistrationId); + + CookieStoreSync::Subscriptions subscriptions; + subscriptions.emplace_back(blink::mojom::CookieChangeSubscription::New()); + subscriptions.back()->name = ""; + subscriptions.back()->match_type = + ::network::mojom::CookieMatchType::STARTS_WITH; + subscriptions.back()->url = GURL(kExampleScope); + EXPECT_TRUE(third_party_service_->AddSubscriptions( + third_party_registration_id, std::move(subscriptions))); + + // Set unpartitioned cookie. + ASSERT_TRUE( + SetSessionCookie("cookie-name1", "new-value1", "example.com", "/")); + task_environment_.RunUntilIdle(); + + // 1P workers should see the unpartitioned cookie. + ASSERT_EQ(1u, worker_test_helper_->changes().size()); + + worker_test_helper_->changes().clear(); + + // Set unpartitioned cookie with SameSite=Lax. + // Third-party workers should not get access to a SameSite=Lax cookie. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name2", "new-value2", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::LAX_MODE, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(0u, worker_test_helper_->changes().size()); + + // Set partitioned cookie in the same partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name3", "new-value3", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting( + GURL(kThirdPartyTopLevelSite))))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(1u, worker_test_helper_->changes().size()); + + worker_test_helper_->changes().clear(); + + // Set partitioned cookie in a different partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name4", "new-value4", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting(GURL(kExampleScope))))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(0u, worker_test_helper_->changes().size()); +} + +TEST_F(CookieStoreManagerTest, PartitionedWorker_NoncedPartition) { + base::test::ScopedFeatureList feature_list; + feature_list.InitWithFeatures({net::features::kPartitionedCookies, + net::features::kThirdPartyStoragePartitioning}, + {}); + + // Register nonced partitioned worker. + blink::StorageKey nonced_storage_key = blink::StorageKey::CreateWithNonce( + url::Origin::Create(GURL(kExampleScope)), kStorageKeyNonce); + + int64_t nonced_registration_id = RegisterServiceWorkerWithStorageKey( + kExampleScope, kExampleWorkerScript, nonced_storage_key); + ASSERT_NE(nonced_registration_id, kInvalidRegistrationId); + + CookieStoreSync::Subscriptions subscriptions; + subscriptions.emplace_back(blink::mojom::CookieChangeSubscription::New()); + subscriptions.back()->name = ""; + subscriptions.back()->match_type = + ::network::mojom::CookieMatchType::STARTS_WITH; + subscriptions.back()->url = GURL(kExampleScope); + EXPECT_TRUE(nonced_service_->AddSubscriptions(nonced_registration_id, + std::move(subscriptions))); + + // Set unpartitioned cookie. + ASSERT_TRUE( + SetSessionCookie("cookie-name1", "new-value1", "example.com", "/")); + task_environment_.RunUntilIdle(); + + // Nonced workers should not see unpartitioned cookies. + ASSERT_EQ(0u, worker_test_helper_->changes().size()); + + // Set partitioned cookie in the same partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name2", "new-value2", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting(GURL(kExampleScope), + kStorageKeyNonce)))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(1u, worker_test_helper_->changes().size()); + + worker_test_helper_->changes().clear(); + + // Set partitioned cookie in a different partition. + ASSERT_TRUE( + SetCanonicalCookie(*net::CanonicalCookie::CreateUnsafeCookieForTesting( + "cookie-name2", "new-value2", "example.com", "/", base::Time(), + base::Time(), base::Time(), base::Time(), + /*secure=*/true, + /*httponly=*/false, net::CookieSameSite::NO_RESTRICTION, + net::COOKIE_PRIORITY_DEFAULT, /*same_party=*/false, + net::CookiePartitionKey::FromURLForTesting(GURL(kExampleScope))))); + task_environment_.RunUntilIdle(); + + ASSERT_EQ(0u, worker_test_helper_->changes().size()); +} + INSTANTIATE_TEST_SUITE_P(All, CookieStoreManagerTest, testing::Bool() /* reset_context_during_test */);
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper.h b/content/browser/first_party_sets/first_party_sets_handler_database_helper.h index 5fd8359b..a6299e5 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_database_helper.h +++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper.h
@@ -50,7 +50,7 @@ // FPSs info by comparing the combined `old_sets` and `old_config` with the // combined `current_sets` and `current_config`. Returns the set of sites // that: 1) were in old FPSs but are no longer in current FPSs i.e. leave the - // FPSs; or, 2) mapped to a different owner site. + // FPSs; or, 2) mapped to a different primary site. // // This method assumes that the sites were normalized properly when the maps // were created. Made public only for testing,
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc index 79345af..4e4f88ec 100644 --- a/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc +++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc
@@ -115,7 +115,7 @@ UnorderedElementsAre(foo, member2, member3)); } -TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_OwnerChanged) { +TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_PrimaryChanged) { net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite foo(GURL("https://foo.test")); net::SchemefulSite member1(GURL("https://member1.test")); @@ -149,7 +149,7 @@ {member2, net::FirstPartySetEntry(foo, net::SiteType::kAssociated, 0)}}, /*aliases=*/{}); - // Expected diff: "https://member3.test" changed owner. + // Expected diff: "https://member3.test" changed primary. EXPECT_THAT( FirstPartySetsHandlerDatabaseHelper::ComputeSetsDiff( old_sets, /*old_config=*/net::FirstPartySetsContextConfig(), @@ -157,7 +157,7 @@ UnorderedElementsAre(member3)); } -TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_OwnerLeft) { +TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_PrimaryLeft) { net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite foo(GURL("https://foo.test")); net::SchemefulSite bar(GURL("https://bar.test")); @@ -180,7 +180,7 @@ /*aliases=*/{}); // Expected diff: "https://example.test" left FPSs, "https://foo.test" and - // "https://bar.test" changed owner. + // "https://bar.test" changed primary. // It would be valid to only have example.test in the diff, but our logic // isn't sophisticated enough yet to know that foo.test and bar.test don't // need to be included in the result. @@ -191,7 +191,7 @@ UnorderedElementsAre(example, foo, bar)); } -TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_OwnerMemberRotate) { +TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_PrimaryMemberRotate) { net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite foo(GURL("https://foo.test")); @@ -211,9 +211,9 @@ net::FirstPartySetEntry(foo, net::SiteType::kPrimary, absl::nullopt)}}, /*aliases=*/{}); - // Expected diff: "https://example.test" and "https://foo.test" changed owner. - // It would be valid to not include example.test and foo.test in the result, - // but our logic isn't sophisticated enough yet to know that.ß + // Expected diff: "https://example.test" and "https://foo.test" changed + // primary. It would be valid to not include example.test and foo.test in the + // result, but our logic isn't sophisticated enough yet to know that.ß EXPECT_THAT( FirstPartySetsHandlerDatabaseHelper::ComputeSetsDiff( old_sets, /*old_config=*/net::FirstPartySetsContextConfig(), @@ -355,7 +355,7 @@ UnorderedElementsAre(member2)); } -TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_PolicyOwnerLeft) { +TEST(FirstPartySetsHandlerDatabaseHelper, ComputeSetsDiff_PolicyPrimaryLeft) { net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite member1(GURL("https://member1.test")); net::SchemefulSite member2(GURL("https://member2.test")); @@ -377,7 +377,7 @@ }); // Expected diff: "https://example.test" left FPSs, "https://member1.test" and - // "https://member2.test" changed owner. + // "https://member2.test" changed primary. // It would be valid to only have example.test in the diff, but our logic // isn't sophisticated enough yet to know that member1.test and member2.test // don't need to be included in the result.
diff --git a/content/browser/first_party_sets/first_party_sets_loader.h b/content/browser/first_party_sets/first_party_sets_loader.h index 7ecd1c72..b648012 100644 --- a/content/browser/first_party_sets/first_party_sets_loader.h +++ b/content/browser/first_party_sets/first_party_sets_loader.h
@@ -19,10 +19,10 @@ namespace content { // FirstPartySetsLoader loads information about First-Party Sets (specified -// here: https://github.com/privacycg/first-party-sets) into a members-to-owners -// map asynchronously and returns it with a callback. It requires input sources -// from the component updater via `SetComponentSets`, and the command line via -// `SetManuallySpecifiedSet`. +// here: https://github.com/privacycg/first-party-sets) into a +// members-to-primaries map asynchronously and returns it with a callback. It +// requires input sources from the component updater via `SetComponentSets`, and +// the command line via `SetManuallySpecifiedSet`. class CONTENT_EXPORT FirstPartySetsLoader { public: using LoadCompleteOnceCallback =
diff --git a/content/browser/indexed_db/indexed_db_callbacks.cc b/content/browser/indexed_db/indexed_db_callbacks.cc index 4a65b26b..bd022502 100644 --- a/content/browser/indexed_db/indexed_db_callbacks.cc +++ b/content/browser/indexed_db/indexed_db_callbacks.cc
@@ -122,21 +122,6 @@ complete_ = true; } -void IndexedDBCallbacks::OnSuccess( - std::vector<blink::mojom::IDBNameAndVersionPtr> names_and_versions) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(!complete_); - - if (!callbacks_) - return; - if (!dispatcher_host_) { - OnConnectionError(); - return; - } - callbacks_->SuccessNamesAndVersionsList(std::move(names_and_versions)); - complete_ = true; -} - void IndexedDBCallbacks::OnBlocked(int64_t existing_version) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!complete_);
diff --git a/content/browser/indexed_db/indexed_db_callbacks.h b/content/browser/indexed_db/indexed_db_callbacks.h index a5f7b71..40f9f2c5 100644 --- a/content/browser/indexed_db/indexed_db_callbacks.h +++ b/content/browser/indexed_db/indexed_db_callbacks.h
@@ -52,10 +52,6 @@ virtual void OnError(const IndexedDBDatabaseError& error); - // IndexedDBFactory::databases - virtual void OnSuccess( - std::vector<blink::mojom::IDBNameAndVersionPtr> names_and_versions); - // IndexedDBFactory::Open / DeleteDatabase virtual void OnBlocked(int64_t existing_version);
diff --git a/content/browser/indexed_db/indexed_db_context_unittest.cc b/content/browser/indexed_db/indexed_db_context_unittest.cc index fe0bdbf..3fead073 100644 --- a/content/browser/indexed_db/indexed_db_context_unittest.cc +++ b/content/browser/indexed_db/indexed_db_context_unittest.cc
@@ -12,6 +12,7 @@ #include "base/test/bind.h" #include "base/test/gmock_callback_support.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "base/threading/thread.h" #include "base/time/default_clock.h" #include "components/services/storage/public/cpp/buckets/bucket_info.h" @@ -118,21 +119,27 @@ // Call a method on both IDBFactory remotes and wait for both replies // to ensure that BindIndexedDB has completed for both storage keys. - base::RunLoop loop; - auto callbacks = base::MakeRefCounted<MockIndexedDBCallbacks>( - /*expect_connection=*/false); - callbacks->CallOnInfoSuccess(base::BarrierClosure(2, loop.QuitClosure())); + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; auto example_bucket_locator = storage::BucketLocator(); example_bucket_locator.storage_key = example_storage_key_; indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - callbacks, example_bucket_locator, - indexed_db_context_->GetDataPath(example_bucket_locator)); + example_bucket_locator, + indexed_db_context_->GetDataPath(example_bucket_locator), + info_future.GetCallback()); + ASSERT_TRUE(info_future.Wait()); + + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future2; auto google_bucket_locator = storage::BucketLocator(); google_bucket_locator.storage_key = google_storage_key_; indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - callbacks, google_bucket_locator, - indexed_db_context_->GetDataPath(google_bucket_locator)); - loop.Run(); + google_bucket_locator, + indexed_db_context_->GetDataPath(google_bucket_locator), + info_future2.GetCallback()); + ASSERT_TRUE(info_future2.Wait()); // Check default bucket exists for https://example.com. storage::QuotaErrorOr<storage::BucketInfo> result = @@ -167,22 +174,17 @@ example_remote.BindNewPipeAndPassReceiver()); // IDBFactory::GetDatabaseInfo - base::RunLoop loop_1; - auto mock_callbacks = - std::make_unique<testing::StrictMock<MockMojoIndexedDBCallbacks>>(); - EXPECT_CALL(*mock_callbacks, Error(blink::mojom::IDBException::kUnknownError, - std::u16string(u"Internal error."))) - .Times(1) - .WillOnce(base::test::RunClosure(loop_1.QuitClosure())); - - example_remote->GetDatabaseInfo(mock_callbacks->CreateInterfacePtrAndBind()); - loop_1.Run(); - - testing::Mock::VerifyAndClear(&mock_callbacks); + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; + example_remote->GetDatabaseInfo(info_future.GetCallback()); + auto [info, error] = info_future.Take(); + EXPECT_EQ(blink::mojom::IDBException::kUnknownError, error->error_code); + EXPECT_EQ(u"Internal error.", error->error_message); // IDBFactory::Open base::RunLoop loop_2; - mock_callbacks = + auto mock_callbacks = std::make_unique<testing::StrictMock<MockMojoIndexedDBCallbacks>>(); auto database_callbacks = std::make_unique<MockMojoIndexedDBDatabaseCallbacks>();
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.cc b/content/browser/indexed_db/indexed_db_dispatcher_host.cc index a064486..89859f5 100644 --- a/content/browser/indexed_db/indexed_db_dispatcher_host.cc +++ b/content/browser/indexed_db/indexed_db_dispatcher_host.cc
@@ -253,30 +253,23 @@ } void IndexedDBDispatcherHost::GetDatabaseInfo( - mojo::PendingAssociatedRemote<blink::mojom::IDBCallbacks> - pending_callbacks) { + GetDatabaseInfoCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // Return error if failed to retrieve bucket from the QuotaManager. if (!receivers_.current_context().bucket.has_value()) { - auto callbacks = base::MakeRefCounted<IndexedDBCallbacks>( - this->AsWeakPtr(), absl::nullopt, std::move(pending_callbacks), - IDBTaskRunner()); - IndexedDBDatabaseError error = IndexedDBDatabaseError( - blink::mojom::IDBException::kUnknownError, u"Internal error."); - callbacks->OnError(error); + std::move(callback).Run( + {}, blink::mojom::IDBError::New( + blink::mojom::IDBException::kUnknownError, u"Internal error.")); return; } const auto& bucket = *receivers_.current_context().bucket; - auto callbacks = base::MakeRefCounted<IndexedDBCallbacks>( - this->AsWeakPtr(), bucket, std::move(pending_callbacks), IDBTaskRunner()); - storage::BucketLocator bucket_locator = bucket.ToBucketLocator(); base::FilePath indexed_db_path = indexed_db_context_->GetDataPath(bucket_locator); indexed_db_context_->GetIDBFactory()->GetDatabaseInfo( - std::move(callbacks), bucket_locator, indexed_db_path); + bucket_locator, indexed_db_path, std::move(callback)); } void IndexedDBDispatcherHost::Open(
diff --git a/content/browser/indexed_db/indexed_db_dispatcher_host.h b/content/browser/indexed_db/indexed_db_dispatcher_host.h index bfd998614..d4992ce 100644 --- a/content/browser/indexed_db/indexed_db_dispatcher_host.h +++ b/content/browser/indexed_db/indexed_db_dispatcher_host.h
@@ -131,8 +131,7 @@ storage::mojom::FileSystemAccessContext* file_system_access_context(); // blink::mojom::IDBFactory implementation: - void GetDatabaseInfo(mojo::PendingAssociatedRemote<blink::mojom::IDBCallbacks> - pending_callbacks) override; + void GetDatabaseInfo(GetDatabaseInfoCallback callback) override; void Open(mojo::PendingAssociatedRemote<blink::mojom::IDBCallbacks> pending_callbacks, mojo::PendingAssociatedRemote<blink::mojom::IDBDatabaseCallbacks>
diff --git a/content/browser/indexed_db/indexed_db_factory.cc b/content/browser/indexed_db/indexed_db_factory.cc index 70c6d71..4fad727 100644 --- a/content/browser/indexed_db/indexed_db_factory.cc +++ b/content/browser/indexed_db/indexed_db_factory.cc
@@ -193,9 +193,9 @@ } void IndexedDBFactory::GetDatabaseInfo( - scoped_refptr<IndexedDBCallbacks> callbacks, const storage::BucketLocator& bucket_locator, - const base::FilePath& data_directory) { + const base::FilePath& data_directory, + blink::mojom::IDBFactory::GetDatabaseInfoCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); TRACE_EVENT0("IndexedDB", "IndexedDBFactory::GetDatabaseInfo"); IndexedDBBucketStateHandle bucket_state_handle; @@ -209,9 +209,10 @@ /*create_if_missing=*/false); if (!bucket_state_handle.IsHeld() || !bucket_state_handle.bucket_state()) { if (s.IsNotFound()) { - callbacks->OnSuccess(std::move(names_and_versions)); + std::move(callback).Run(std::move(names_and_versions), nullptr); } else { - callbacks->OnError(error); + std::move(callback).Run( + {}, blink::mojom::IDBError::New(error.code(), error.message())); } if (s.IsCorruption()) { HandleBackingStoreCorruption(bucket_locator, error); @@ -228,13 +229,15 @@ error = IndexedDBDatabaseError(blink::mojom::IDBException::kUnknownError, "Internal error opening backing store for " "indexedDB.databases()."); - callbacks->OnError(error); + std::move(callback).Run( + {}, blink::mojom::IDBError::New(error.code(), error.message())); if (s.IsCorruption()) { HandleBackingStoreCorruption(bucket_locator, error); } return; } - callbacks->OnSuccess(std::move(names_and_versions)); + + std::move(callback).Run(std::move(names_and_versions), nullptr); } void IndexedDBFactory::Open(
diff --git a/content/browser/indexed_db/indexed_db_factory.h b/content/browser/indexed_db/indexed_db_factory.h index 9fd0636b..e8e6af89 100644 --- a/content/browser/indexed_db/indexed_db_factory.h +++ b/content/browser/indexed_db/indexed_db_factory.h
@@ -36,6 +36,7 @@ #include "content/browser/indexed_db/indexed_db_task_helper.h" #include "content/common/content_export.h" #include "third_party/blink/public/common/storage_key/storage_key.h" +#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom.h" #include "third_party/leveldatabase/src/include/leveldb/status.h" namespace base { @@ -62,9 +63,10 @@ ~IndexedDBFactory() override; - void GetDatabaseInfo(scoped_refptr<IndexedDBCallbacks> callbacks, - const storage::BucketLocator& bucket_locator, - const base::FilePath& data_directory); + void GetDatabaseInfo( + const storage::BucketLocator& bucket_locator, + const base::FilePath& data_directory, + blink::mojom::IDBFactory::GetDatabaseInfoCallback callback); void Open(const std::u16string& name, std::unique_ptr<IndexedDBPendingConnection> connection, const storage::BucketLocator& bucket_locator,
diff --git a/content/browser/indexed_db/indexed_db_factory_unittest.cc b/content/browser/indexed_db/indexed_db_factory_unittest.cc index 9ab9a5c..fbe9441a 100644 --- a/content/browser/indexed_db/indexed_db_factory_unittest.cc +++ b/content/browser/indexed_db/indexed_db_factory_unittest.cc
@@ -20,6 +20,7 @@ #include "base/test/scoped_feature_list.h" #include "base/test/simple_test_clock.h" #include "base/test/task_environment.h" +#include "base/test/test_future.h" #include "base/test/test_simple_task_runner.h" #include "base/time/default_clock.h" #include "components/services/storage/filesystem_proxy_factory.h" @@ -1019,18 +1020,19 @@ TEST_F(IndexedDBFactoryTest, GetDatabaseNames_NoFactory) { SetupContext(); - auto callbacks = base::MakeRefCounted<MockIndexedDBCallbacks>( - /*expect_connection=*/false); - const blink::StorageKey storage_key = blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); auto bucket_locator = storage::BucketLocator(); bucket_locator.storage_key = storage_key; - factory()->GetDatabaseInfo(callbacks, bucket_locator, - context()->GetDataPath(bucket_locator)); + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; + factory()->GetDatabaseInfo(bucket_locator, + context()->GetDataPath(bucket_locator), + info_future.GetCallback()); + ASSERT_TRUE(info_future.Wait()); - EXPECT_TRUE(callbacks->info_called()); // Don't create a factory if one doesn't exist. EXPECT_FALSE(factory()->GetBucketFactory(bucket_locator.id)); } @@ -1038,9 +1040,6 @@ TEST_F(IndexedDBFactoryTest, GetDatabaseNames_ExistingFactory) { SetupContext(); - auto callbacks = base::MakeRefCounted<MockIndexedDBCallbacks>( - /*expect_connection=*/false); - const blink::StorageKey storage_key = blink::StorageKey::CreateFromStringForTesting("http://localhost:81"); auto bucket_locator = storage::BucketLocator(); @@ -1054,10 +1053,14 @@ /*create_if_missing=*/true); EXPECT_TRUE(bucket_state_handle.IsHeld()) << s.ToString(); - factory()->GetDatabaseInfo(callbacks, bucket_locator, - context()->GetDataPath(bucket_locator)); + base::test::TestFuture<std::vector<blink::mojom::IDBNameAndVersionPtr>, + blink::mojom::IDBErrorPtr> + info_future; + factory()->GetDatabaseInfo(bucket_locator, + context()->GetDataPath(bucket_locator), + info_future.GetCallback()); + ASSERT_TRUE(info_future.Wait()); - EXPECT_TRUE(callbacks->info_called()); EXPECT_TRUE(factory()->GetBucketFactory(bucket_locator.id)); // GetDatabaseInfo didn't create the factory, so it shouldn't close it. EXPECT_FALSE(factory()->GetBucketFactory(bucket_locator.id)->IsClosing());
diff --git a/content/browser/indexed_db/mock_indexed_db_callbacks.cc b/content/browser/indexed_db/mock_indexed_db_callbacks.cc index 83c0bac..c69d57d 100644 --- a/content/browser/indexed_db/mock_indexed_db_callbacks.cc +++ b/content/browser/indexed_db/mock_indexed_db_callbacks.cc
@@ -41,13 +41,6 @@ void MockIndexedDBCallbacks::OnSuccess(int64_t result) {} void MockIndexedDBCallbacks::OnSuccess( - std::vector<blink::mojom::IDBNameAndVersionPtr> names_and_versions) { - info_called_ = true; - if (call_on_info_success_) - call_on_info_success_.Run(); -} - -void MockIndexedDBCallbacks::OnSuccess( std::unique_ptr<IndexedDBConnection> connection, const IndexedDBDatabaseMetadata& metadata) { if (!upgrade_called_)
diff --git a/content/browser/indexed_db/mock_indexed_db_callbacks.h b/content/browser/indexed_db/mock_indexed_db_callbacks.h index 59a7358b..25cf89a 100644 --- a/content/browser/indexed_db/mock_indexed_db_callbacks.h +++ b/content/browser/indexed_db/mock_indexed_db_callbacks.h
@@ -32,8 +32,6 @@ void OnSuccess() override; void OnSuccess(int64_t result) override; - void OnSuccess(std::vector<blink::mojom::IDBNameAndVersionPtr> - names_and_versions) override; void OnSuccess(std::unique_ptr<IndexedDBConnection> connection, const blink::IndexedDBDatabaseMetadata& metadata) override; IndexedDBConnection* connection() { return connection_.get(); }
diff --git a/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h b/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h index 7220c79..3b53b7c 100644 --- a/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h +++ b/content/browser/indexed_db/mock_mojo_indexed_db_callbacks.h
@@ -37,9 +37,6 @@ void(blink::mojom::IDBException code, const std::u16string& message)); - MOCK_METHOD1(SuccessNamesAndVersionsList, - void(std::vector<blink::mojom::IDBNameAndVersionPtr> list)); - MOCK_METHOD1(SuccessStringList, void(const std::vector<std::u16string>& value));
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 5fd665a..f778743 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -6,6 +6,7 @@ #include <stdint.h> +#include <functional> #include <limits> #include <map> #include <memory> @@ -138,6 +139,19 @@ blink::mojom::DebugModeDetails::New()); const auction_worklet::mojom::PrivateAggregationRequestPtr + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest = + auction_worklet::mojom::PrivateAggregationRequest::New( + auction_worklet::mojom::AggregatableReportContribution:: + NewHistogramContribution( + blink::mojom::AggregatableReportHistogramContribution::New( + /*bucket=*/static_cast<uint64_t>( + auction_worklet::mojom::RejectReason:: + kBelowKAnonThreshold), + /*value=*/0)), + blink::mojom::AggregationServiceMode::kDefault, + blink::mojom::DebugModeDetails::New()); + +const auction_worklet::mojom::PrivateAggregationRequestPtr kExpectedReportWinPrivateAggregationRequest = auction_worklet::mojom::PrivateAggregationRequest::New( auction_worklet::mojom::AggregatableReportContribution:: @@ -452,13 +466,25 @@ } )"; -// A simple bid script that returns either `bid` or nothing depending on whether -// all incoming ads got filtered. If the interestGroup has components, the -// ad URL with /1 and /2 generated will be returned as components in the bid. +// A bid script that returns either `bid` or nothing depending on whether all +// incoming ads got filtered. If the interestGroup has components, the ad URL +// with /1 and /2 generated will be returned as components in the bid. Records +// privateAggregation events for "reserved.loss" to enable checking for kanon +// failure reporting. std::string MakeFilteringBidScript(int bid) { return base::StringPrintf(R"( function generateBid(interestGroup, auctionSignals, perBuyerSignals, trustedBiddingSignals, browserSignals) { + + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "bid-reject-reason"}, + value: 0, + }); + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "winning-bid"}, + value: 2, + }); + if (interestGroup.ads.length === 0) return; @@ -12633,8 +12659,8 @@ int reported_recency; EXPECT_TRUE(base::StringToInt(split[1], &reported_recency)); // Even noised results should be in the recency range. - EXPECT_GE(reported_recency, 1); - EXPECT_LE(reported_recency, 32); + EXPECT_GE(reported_recency, 0); + EXPECT_LE(reported_recency, 31); if (reported_recency == kRecencyBucketed) { num_correct++; } @@ -14652,7 +14678,24 @@ TEST_P(AuctionRunnerKAnonTest, SingleNonKAnon) { auction_worklet::AddJavascriptResponse( &url_loader_factory_, kBidder1Url, - MakeConstBidScript(1, "https://ad1.com") + kReportWinNoUrl); + // bidding script tries to bid with ad that is not k-anonymous. + std::string(R"( + function generateBid(interestGroup, auctionSignals, perBuyerSignals, + trustedBiddingSignals, browserSignals) { + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "bid-reject-reason"}, + value: 0, + }); + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "winning-bid"}, + value: 2, + }); + return {ad: {}, + bid: 1, + render: "https://ad1.com", + allowComponentAuction: true}; + })") + + kReportWinNoUrl); auction_worklet::AddJavascriptResponse( &url_loader_factory_, kSellerUrl, std::string(kMinimumDecisionScript) + kBasicReportResult); @@ -14689,6 +14732,11 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithOnlyNonKAnonBid(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); break; case KAnonMode::kEnforce: @@ -14704,6 +14752,14 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithOnlyNonKAnonBid(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kBidder1, + ElementsAreRequests( + BuildPrivateAggregationRequest(0, 0), + BuildPrivateAggregationRequest(0, 2), + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest)))); break; case KAnonMode::kSimulate: @@ -14716,6 +14772,11 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithOnlyNonKAnonBid(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); break; } } @@ -14723,7 +14784,7 @@ TEST_P(AuctionRunnerKAnonTest, SingleKAnon) { auction_worklet::AddJavascriptResponse( &url_loader_factory_, kBidder1Url, - MakeConstBidScript(1, "https://ad1.com") + kReportWinNoUrl); + MakeFilteringBidScript(1) + kReportWinNoUrl); auction_worklet::AddJavascriptResponse( &url_loader_factory_, kSellerUrl, std::string(kMinimumDecisionScript) + kBasicReportResult); @@ -14770,6 +14831,11 @@ expectations.SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1); } CheckMetrics(expectations); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); } // Test that k-anonymity for ads with ad components is handled correctly: @@ -14884,6 +14950,41 @@ .SetNumSellers(run_as_component ? 2 : 1) .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(2)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } + } break; case KAnonMode::kEnforce: @@ -14916,6 +15017,46 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest( + 0, 0), // reason not available + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest, + BuildPrivateAggregationRequest( + 1, 2))))); // bid was 1. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest( + 0, 0), // reason not available + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest, + BuildPrivateAggregationRequest( + 1, 2))))); // bid was 1. + } + } + break; case KAnonMode::kSimulate: @@ -14944,6 +15085,41 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } + } break; } @@ -15045,10 +15221,45 @@ .SetNumSellers(run_as_component ? 2 : 1) .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(2)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } + } break; case KAnonMode::kEnforce: - // k-anon requirement meands ad1 wins, but we also report ad2 as what + // k-anon requirement means ad1 wins, but we also report ad2 as what // would have won had it been authorized. EXPECT_EQ(GURL("https://ad1.com"), result_.ad_descriptor->url); expected_k_anon_keys_to_join.insert(ad1_k_anon_keys.begin(), @@ -15067,6 +15278,45 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest( + 0, 0), // reason not available + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest, + BuildPrivateAggregationRequest( + 1, 2))))); // bid was 1. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest( + 0, 0), // reason not available + kExpectedKAnonFailureGenerateBidPrivateAggregationRequest, + BuildPrivateAggregationRequest( + 1, 2))))); // bid was 1. + } + } break; case KAnonMode::kSimulate: @@ -15089,6 +15339,41 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + if (!run_as_component) { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } else { + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest, + // extra report for component auction. + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair( + kBidder1, + ElementsAreRequests(BuildPrivateAggregationRequest( + 0, 0), // reason not available + BuildPrivateAggregationRequest( + 2, 2))))); // bid was 2. + } + } break; } // Have to spin all message loops to flush any k-anon set join events. @@ -15168,6 +15453,22 @@ .SetNumSellers(1) .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(2)); + + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair(kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest(0, 0), + BuildPrivateAggregationRequest(2, 2))))); + } break; case KAnonMode::kEnforce: @@ -15184,6 +15485,22 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair(kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest(0, 0), + BuildPrivateAggregationRequest(2, 2))))); + } break; case KAnonMode::kSimulate: @@ -15200,6 +15517,22 @@ .SetNumBidderWorklets(2) .SetNumInterestGroupsWithOnlyNonKAnonBid(1) .SetNumInterestGroupsWithSameBidForKAnonAndNonKAnon(1)); + + { + auto requests = + private_aggregation_manager_.TakePrivateAggregationRequests(); + EXPECT_THAT( + requests, + testing::UnorderedElementsAre( + testing::Pair( + kSeller, + ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)), + testing::Pair(kBidder2, + ElementsAreRequests( + BuildPrivateAggregationRequest(0, 0), + BuildPrivateAggregationRequest(2, 2))))); + } break; } EXPECT_THAT(result_.report_urls, @@ -15277,6 +15610,11 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithOnlyNonKAnonBid(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); break; case KAnonMode::kEnforce: @@ -15296,6 +15634,11 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithSeparateBidsForKAnonAndNonKAnon(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); break; case KAnonMode::kSimulate: @@ -15315,6 +15658,11 @@ .SetNumSellers(1) .SetNumBidderWorklets(1) .SetNumInterestGroupsWithSeparateBidsForKAnonAndNonKAnon(1)); + EXPECT_THAT( + private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre(testing::Pair( + kSeller, ElementsAreRequests( + kExpectedReportResultPrivateAggregationRequest)))); break; } // Have to spin all message loops to flush any k-anon set join events. @@ -15388,6 +15736,8 @@ expectations.SetNumInterestGroupsWithSeparateBidsForKAnonAndNonKAnon(1); } CheckMetrics(expectations); + EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), + testing::UnorderedElementsAre()); } TEST_P(AuctionRunnerKAnonTest, MojoValidation) {
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc index 5ca98fa..5de7a4b 100644 --- a/content/browser/interest_group/interest_group_auction.cc +++ b/content/browser/interest_group/interest_group_auction.cc
@@ -635,6 +635,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) override { BidState* state = generate_bid_client_receiver_set_.current_context(); @@ -653,7 +654,7 @@ bidding_signals_data_version, has_bidding_signals_data_version, debug_loss_report_url, debug_win_report_url, set_priority, has_set_priority, std::move(update_priority_signals_overrides), - std::move(pa_requests), errors); + std::move(pa_requests), std::move(non_kanon_pa_requests), errors); } // Closes all Mojo pipes, releases all weak pointers, and stops the timeout @@ -773,6 +774,7 @@ // `signals` are the PostAuctionSignals from the auction `this` was a part of. void TakePrivateAggregationRequests( const BidState* winner, + const BidState* non_kanon_winner, const PostAuctionSignals& signals, std::map<url::Origin, PrivateAggregationRequests>& private_aggregation_requests_reserved, @@ -804,6 +806,28 @@ } } } + if (non_kanon_winner == state.get()) { + const url::Origin& bidder = state->bidder->interest_group.owner; + for (auction_worklet::mojom::PrivateAggregationRequestPtr& request : + state->non_kanon_private_aggregation_requests) { + absl::optional<PrivateAggregationRequestWithEventType> + converted_request = FillInPrivateAggregationRequest( + std::move(request), signals.winning_bid, + signals.highest_scoring_other_bid, + auction_worklet::mojom::RejectReason::kBelowKAnonThreshold, + false); + if (converted_request.has_value()) { + PrivateAggregationRequestWithEventType converted_request_value = + std::move(converted_request.value()); + // Only reserved types are supported for k-anon failures. + // This *should* be guaranteed by `FillInPrivateAggregationRequest` + // since we passed in `false` for `is_winner`. + DCHECK(!converted_request_value.event_type.has_value()); + private_aggregation_requests_reserved[bidder].emplace_back( + std::move(converted_request_value.request)); + } + } + } } } @@ -923,6 +947,7 @@ /*has_set_priority=*/false, /*update_priority_signals_overrides=*/{}, /*pa_requests=*/{}, + /*non_kanon_pa_requests=*/{}, /*errors=*/{}); } @@ -1094,6 +1119,7 @@ /*has_set_priority=*/false, /*update_priority_signals_overrides=*/{}, /*pa_requests=*/{}, + /*non_kanon_pa_requests=*/{}, /*errors=*/{}); // If this was the last bidder, and it was filtered out, there's nothing // else to do, and `this` may have already been deleted. @@ -1188,6 +1214,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, const std::vector<std::string>& errors) { DCHECK(!state->made_bid); DCHECK_GT(num_outstanding_bids_, 0); @@ -1254,6 +1281,10 @@ pa_requests, [](const auction_worklet::mojom::PrivateAggregationRequestPtr& request_ptr) { return request_ptr.is_null(); })); + DCHECK(base::ranges::none_of( + non_kanon_pa_requests, + [](const auction_worklet::mojom::PrivateAggregationRequestPtr& + request_ptr) { return request_ptr.is_null(); })); auction_->MaybeLogPrivateAggregationWebFeatures(pa_requests); if (!pa_requests.empty()) { PrivateAggregationRequests& pa_requests_for_bidder = @@ -1262,6 +1293,14 @@ std::move_iterator(pa_requests.begin()), std::move_iterator(pa_requests.end())); } + if (!non_kanon_pa_requests.empty()) { + PrivateAggregationRequests& non_kanon_pa_requests_for_bidder = + state->non_kanon_private_aggregation_requests; + non_kanon_pa_requests_for_bidder.insert( + non_kanon_pa_requests_for_bidder.end(), + std::move_iterator(non_kanon_pa_requests.begin()), + std::move_iterator(non_kanon_pa_requests.end())); + } auction_->errors_.insert(auction_->errors_.end(), errors.begin(), errors.end()); @@ -2012,6 +2051,9 @@ case auction_worklet::mojom::RejectReason::kCategoryExclusions: reject_reason_str = "category-exclusions"; break; + case auction_worklet::mojom::RejectReason::kBelowKAnonThreshold: + reject_reason_str = "below-kanon-threshold"; + break; } return reject_reason_str; } @@ -2176,6 +2218,12 @@ winner = leader.top_bid->bid->bid_state; } + BidState* non_kanon_winner = nullptr; + if (kanon_mode_ == auction_worklet::mojom::KAnonymityBidMode::kEnforce && + HasNonKAnonWinner() && !NonKAnonWinnerIsKAnon()) { + non_kanon_winner = top_non_kanon_enforced_bid()->bid->bid_state; + } + // `signals` includes post auction signals from current auction. PostAuctionSignals signals; signals.winning_bid = leader.top_bid ? leader.top_bid->bid->bid : 0.0; @@ -2224,7 +2272,8 @@ std::map<std::string, PrivateAggregationRequests> private_aggregation_requests_non_reserved; buyer_helper->TakePrivateAggregationRequests( - winner, signals, private_aggregation_requests_reserved, + winner, non_kanon_winner, signals, + private_aggregation_requests_reserved, private_aggregation_requests_non_reserved); for (auto& [origin, requests] : private_aggregation_requests_reserved) {
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h index f46e973..7b3dd03 100644 --- a/content/browser/interest_group/interest_group_auction.h +++ b/content/browser/interest_group/interest_group_auction.h
@@ -241,6 +241,10 @@ std::map<url::Origin, PrivateAggregationRequests> private_aggregation_requests; + // Requests made to Private aggregation API in generateBid() for the + // non-k-anonymous enforced bid when k-anonymity enforcement is active. + PrivateAggregationRequests non_kanon_private_aggregation_requests; + // The reason this bid was rejected by the auction (i.e., reason why score // was non-positive). auction_worklet::mojom::RejectReason reject_reason =
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc index f7726557..dd27fa2 100644 --- a/content/browser/interest_group/interest_group_storage.cc +++ b/content/browser/interest_group/interest_group_storage.cc
@@ -441,6 +441,9 @@ // Initializes the tables, returning true on success. // The tables cannot exist when calling this function. bool CreateV13Schema(sql::Database& db) { + // IMPORTANT: If you add or remove fields, you need to update + // `ClearExcessiveStorage()` to consider the size of added/removed fields for + // storage usage calculations. DCHECK(!db.DoesTableExist("interest_groups")); static const char kInterestGroupTableSql[] = // clang-format off @@ -2282,6 +2285,85 @@ return transaction.Commit(); } +// Removes interest groups so that per-owner limit is respected. Note that we're +// intentionally not trying to keep this in sync with +// `blink::InterestGroup::EstimateSize()`. There's not a compelling reason to +// keep those exactly aligned and keeping them in sync would require a +// significant amount of extra work. +bool ClearExcessiveStorage(sql::Database& db, size_t max_owner_storage_size) { + sql::Transaction transaction(&db); + if (!transaction.Begin()) { + return false; + } + + // We go through groups for each owner, starting with the ones that expire + // later, accumulating the stored size. If the accumulated size is too much, + // we start marking groups for deletion. This means that the interest groups + // expiring soonest will be deleted if we need to free up space. + // clang-format off + sql::Statement excessive_storage_groups(db.GetCachedStatement( + SQL_FROM_HERE, + "SELECT owner, name, " + "(LENGTH(interest_groups.owner)+" + "LENGTH(interest_groups.joining_origin)+" + "LENGTH(interest_groups.name)+" + "LENGTH(interest_groups.priority_vector)+" + "LENGTH(interest_groups.priority_signals_overrides)+" + "LENGTH(interest_groups.seller_capabilities)+" + "LENGTH(interest_groups.joining_url)+" + "LENGTH(interest_groups.bidding_url)+" + "LENGTH(interest_groups.bidding_wasm_helper_url)+" + "LENGTH(interest_groups.update_url)+" + "LENGTH(interest_groups.trusted_bidding_signals_url)+" + "LENGTH(interest_groups.trusted_bidding_signals_keys)+" + "LENGTH(interest_groups.user_bidding_signals)+" + "LENGTH(interest_groups.ads)+" + "LENGTH(interest_groups.ad_components)+" + "LENGTH(interest_groups.ad_sizes)+" + "LENGTH(interest_groups.size_groups)+" + "36) " // other fields are fixed at 36 bytes + "AS cum_size " + "FROM interest_groups " + "ORDER BY owner, expiration DESC" + )); + // clang-format on + if (!excessive_storage_groups.is_valid()) { + return false; + } + + excessive_storage_groups.Reset(true); + std::vector<blink::InterestGroupKey> groups_to_remove; + absl::optional<url::Origin> previous; + size_t cum_size; + while (excessive_storage_groups.Step()) { + url::Origin group_owner = + DeserializeOrigin(excessive_storage_groups.ColumnString(0)); + std::string group_name = excessive_storage_groups.ColumnString(1); + size_t group_size = excessive_storage_groups.ColumnInt64(2); + + if (!previous || *previous != group_owner) { + previous = group_owner; + cum_size = group_size; + continue; + } + cum_size += group_size; + if (cum_size > max_owner_storage_size) { + groups_to_remove.emplace_back(std::move(group_owner), + std::move(group_name)); + } + } + if (!excessive_storage_groups.Succeeded()) { + DLOG(ERROR) << "ClearExcessiveStorage could not get expired groups."; + // Keep going so we can clear any groups that we did get. + } + for (const auto& interest_group : groups_to_remove) { + if (!DoRemoveInterestGroup(db, interest_group)) { + return false; + } + } + return transaction.Commit(); +} + bool ClearExpiredKAnon(sql::Database& db, base::Time cutoff) { sql::Statement expired_kanon( db.GetCachedStatement(SQL_FROM_HERE, @@ -2300,29 +2382,41 @@ bool DoPerformDatabaseMaintenance(sql::Database& db, base::Time now, size_t max_owners, + size_t max_owner_storage_size, size_t max_owner_interest_groups) { SCOPED_UMA_HISTOGRAM_TIMER_MICROS("Storage.InterestGroup.DBMaintenanceTime"); sql::Transaction transaction(&db); - if (!transaction.Begin()) + if (!transaction.Begin()) { return false; - if (!ClearExcessInterestGroups(db, max_owners, max_owner_interest_groups)) + } + if (!ClearExcessInterestGroups(db, max_owners, max_owner_interest_groups)) { return false; - if (!ClearExpiredInterestGroups(db, now)) + } + if (!ClearExpiredInterestGroups(db, now)) { return false; - if (!DeleteOldJoins(db, now - InterestGroupStorage::kHistoryLength)) + } + if (!ClearExcessiveStorage(db, max_owner_storage_size)) { return false; - if (!DeleteOldBids(db, now - InterestGroupStorage::kHistoryLength)) + } + if (!DeleteOldJoins(db, now - InterestGroupStorage::kHistoryLength)) { return false; - if (!DeleteOldWins(db, now - InterestGroupStorage::kHistoryLength)) + } + if (!DeleteOldBids(db, now - InterestGroupStorage::kHistoryLength)) { return false; - if (!ClearExpiredKAnon(db, now - InterestGroupStorage::kHistoryLength)) + } + if (!DeleteOldWins(db, now - InterestGroupStorage::kHistoryLength)) { return false; + } + if (!ClearExpiredKAnon(db, now - InterestGroupStorage::kHistoryLength)) { + return false; + } return transaction.Commit(); } base::FilePath DBPath(const base::FilePath& base) { - if (base.empty()) + if (base.empty()) { return base; + } return base.Append(kDatabasePath); } @@ -2339,6 +2433,8 @@ max_owners_(blink::features::kInterestGroupStorageMaxOwners.Get()), max_owner_interest_groups_( blink::features::kInterestGroupStorageMaxGroupsPerOwner.Get()), + max_owner_storage_size_( + blink::features::kInterestGroupStorageMaxStoragePerOwner.Get()), max_ops_before_maintenance_( blink::features::kInterestGroupStorageMaxOpsBeforeMaintenance.Get()), db_(std::make_unique<sql::Database>(sql::DatabaseOptions{})), @@ -2790,6 +2886,7 @@ if (EnsureDBInitialized()) { DoPerformDatabaseMaintenance( *db_, last_maintenance_time_, /*max_owners=*/max_owners_, + /*max_owner_storage_size=*/max_owner_storage_size_, /*max_owner_interest_groups=*/max_owner_interest_groups_); } }
diff --git a/content/browser/interest_group/interest_group_storage.h b/content/browser/interest_group/interest_group_storage.h index 94d2038..c85632c8 100644 --- a/content/browser/interest_group/interest_group_storage.h +++ b/content/browser/interest_group/interest_group_storage.h
@@ -160,6 +160,7 @@ // and kInterestGroupStorageMaxGroupsPerOwner. const size_t max_owners_; const size_t max_owner_interest_groups_; + const size_t max_owner_storage_size_; // Maximum number of operations allowed between maintenance calls. // Set by the related blink::feature parameter
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc index 181075e..5d8fb9d 100644 --- a/content/browser/interest_group/interest_group_storage_unittest.cc +++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -56,7 +56,8 @@ blink::features::kInterestGroupStorage, {{"max_owners", "10"}, {"max_groups_per_owner", "10"}, - {"max_ops_before_maintenance", "100"}}); + {"max_ops_before_maintenance", "100"}, + {"max_storage_per_owner", "2048"}}); } std::unique_ptr<InterestGroupStorage> CreateStorage() { @@ -921,6 +922,60 @@ histograms.ExpectTotalCount("Storage.InterestGroup.DBMaintenanceTime", 1); } +// Maintenance should prune groups when the interest group owner exceeds the +// storage size limit. +TEST_F(InterestGroupStorageTest, JoinTooMuchStorage) { + base::HistogramTester histograms; + const size_t kExcessGroups = 3; + const url::Origin kTestOrigin = + url::Origin::Create(GURL("https://owner.example.com")); + const size_t kGroupSize = 800; + const size_t groups_before_full = + blink::features::kInterestGroupStorageMaxStoragePerOwner.Get() / + kGroupSize; + std::vector<std::string> added_groups; + + std::unique_ptr<InterestGroupStorage> storage = CreateStorage(); + for (size_t i = 0; i < groups_before_full + kExcessGroups; i++) { + const std::string group_name = base::NumberToString(i); + // Allow time to pass so that they have different expiration times. + // This makes which groups get removed deterministic as they are sorted by + // expiration time. + task_environment().FastForwardBy(base::Microseconds(1)); + blink::InterestGroup group = NewInterestGroup(kTestOrigin, group_name); + ASSERT_GT(kGroupSize, group.EstimateSize()); + group.user_bidding_signals = + std::string(kGroupSize - group.EstimateSize(), 'P'); + EXPECT_EQ(kGroupSize, group.EstimateSize()); + + storage->JoinInterestGroup(group, kTestOrigin.GetURL()); + added_groups.push_back(group_name); + } + + std::vector<url::Origin> origins = storage->GetAllInterestGroupOwners(); + EXPECT_EQ(1u, origins.size()); + + std::vector<StorageInterestGroup> interest_groups = + storage->GetInterestGroupsForOwner(kTestOrigin); + EXPECT_EQ(added_groups.size(), interest_groups.size()); + + // Allow enough idle time to trigger maintenance. + task_environment().FastForwardBy(InterestGroupStorage::kIdlePeriod + + base::Seconds(1)); + + interest_groups = storage->GetInterestGroupsForOwner(kTestOrigin); + ASSERT_EQ(groups_before_full, interest_groups.size()); + + std::vector<std::string> remaining_groups; + for (const auto& db_group : interest_groups) { + remaining_groups.push_back(db_group.interest_group.name); + } + std::vector<std::string> remaining_groups_expected( + added_groups.begin() + kExcessGroups, added_groups.end()); + EXPECT_THAT(remaining_groups, + UnorderedElementsAreArray(remaining_groups_expected)); +} + // Excess group owners should have their groups pruned by maintenance. // In this test we trigger maintenance by having too many operations in a short // period to test max_ops_before_maintenance_.
diff --git a/content/browser/interest_group/interest_group_update_manager.cc b/content/browser/interest_group/interest_group_update_manager.cc index c60437e1..fe0aec3 100644 --- a/content/browser/interest_group/interest_group_update_manager.cc +++ b/content/browser/interest_group/interest_group_update_manager.cc
@@ -44,9 +44,9 @@ namespace { -// 10 kb update size limit. We are potentially fetching many interest group +// 1 MB update size limit. We are potentially fetching many interest group // updates, so don't let this get too large. -constexpr size_t kMaxUpdateSize = 10 * 1024; +constexpr size_t kMaxUpdateSize = 1 * 1024 * 1024; // The maximum amount of time that the update process can run before it gets // cancelled for taking too long.
diff --git a/content/browser/interest_group/mock_auction_process_manager.cc b/content/browser/interest_group/mock_auction_process_manager.cc index be5dd97..731b658 100644 --- a/content/browser/interest_group/mock_auction_process_manager.cc +++ b/content/browser/interest_group/mock_auction_process_manager.cc
@@ -223,6 +223,7 @@ base::flat_map<std::string, auction_worklet::mojom::PrioritySignalsDoublePtr>(), /*pa_requests=*/std::move(pa_requests), + /*non_kanon_pa_requests=*/{}, /*bidding_latency=*/bidding_latency_, /*errors=*/std::vector<std::string>()); return; @@ -243,6 +244,7 @@ base::flat_map<std::string, auction_worklet::mojom::PrioritySignalsDoublePtr>(), /*pa_requests=*/std::move(pa_requests), + /*non_kanon_pa_requests=*/{}, /*bidding_latency=*/bidding_latency_, /*errors=*/std::vector<std::string>()); }
diff --git a/content/browser/media/capture/desktop_capture_device.cc b/content/browser/media/capture/desktop_capture_device.cc index 3d83084..41144045 100644 --- a/content/browser/media/capture/desktop_capture_device.cc +++ b/content/browser/media/capture/desktop_capture_device.cc
@@ -308,9 +308,9 @@ resolution_chooser_.SetConstraints(constraints.min_frame_size, constraints.max_frame_size, constraints.fixed_aspect_ratio); - DVLOG(1) << __func__ << " (requested_frame_rate=" << requested_frame_rate_ - << ", max_frame_size=" << constraints.max_frame_size.ToString() - << ")"; + VLOG(2) << __func__ << " (requested_frame_rate=" << requested_frame_rate_ + << ", max_frame_size=" << constraints.max_frame_size.ToString() + << ")"; DCHECK(!wake_lock_); RequestWakeLock(); @@ -325,7 +325,7 @@ void DesktopCaptureDevice::Core::RequestRefreshFrame() { DCHECK(task_runner_->BelongsToCurrentThread()); TRACE_EVENT0("webrtc", __func__); - DVLOG(1) << __func__ << " is called by the client"; + VLOG(2) << __func__ << " is called by the client"; // Simply send the last received frame, if we ever received one. Don't // schedule a new frame. if (output_frame_) { @@ -371,6 +371,7 @@ } if (!success) { + VLOG(2) << __func__ << " [ERROR]"; if (result == webrtc::DesktopCapturer::Result::ERROR_PERMANENT) { if (!first_permanent_error_logged) { first_permanent_error_logged = true; @@ -401,6 +402,7 @@ const bool zero_hertz_is_active = zero_hertz_is_supported() && output_frame_ && frame->updated_region().is_empty(); + VLOG(2) << __func__ << " [SUCCESS]" << (zero_hertz_is_active ? "[0Hz]" : ""); if (zero_hertz_is_supported()) { LogDesktopCaptureZeroHzIsActive(capturer_type_, zero_hertz_is_active); } @@ -416,6 +418,8 @@ resolution_chooser_.SetSourceSize( gfx::Size(frame->size().width(), frame->size().height())); last_frame_size_ = frame->size(); + VLOG(2) << " last_frame_size=(" << last_frame_size_.width() << "x" + << last_frame_size_.height() << ")"; } // Align to 2x2 pixel boundaries, as required by OnIncomingCapturedData() so // it can convert the frame to I420 format. @@ -427,6 +431,8 @@ // be guaranteed. output_size.set(2, 2); } + VLOG(2) << " output_size=(" << output_size.width() << "x" + << output_size.height() << ")"; gfx::ColorSpace frame_color_space; if (!frame->icc_profile().empty()) { @@ -471,6 +477,8 @@ DCHECK(!frame->size().is_empty()); if (!frame->size().equals(output_size)) { + VLOG(2) << " Downscaling: frame->size=(" << frame->size().width() << "x" + << frame->size().height() << ")"; // Down-scale and/or letterbox to the target format if the frame does // not match the output size. @@ -496,6 +504,7 @@ output_rect.height(), libyuv::kFilterBilinear); output_frame_is_black_ = false; } else if (IsFrameUnpackedOrInverted(frame.get())) { + VLOG(2) << " FrameUnpackedOrInverted"; // If |frame| is not packed top-to-bottom then create a packed // top-to-bottom copy. This is required if the frame is inverted (see // crbug.com/306876), or if |frame| is cropped form a larger frame (see @@ -509,6 +518,7 @@ webrtc::DesktopRect::MakeSize(frame->size())); output_frame_is_black_ = false; } else { + VLOG(2) << " output_frame_ = std::move(frame)"; // If the captured frame matches the output size, we can use the incoming // frame as is without any modifications. output_frame_ = std::move(frame); @@ -531,6 +541,8 @@ output_frame_->size().height() * webrtc::DesktopFrame::kBytesPerPixel; + VLOG(2) << __func__ << " [output_size=(" << output_frame_->size().width() + << "x" << output_frame_->size().height() << ")]"; base::TimeTicks now = NowTicks(); if (first_ref_time_.is_null()) first_ref_time_ = now; @@ -557,6 +569,7 @@ DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(!capture_in_progress_); TRACE_EVENT0("webrtc", __func__); + VLOG(2) << __func__; capture_start_time_ = NowTicks(); capture_in_progress_ = true; @@ -569,12 +582,16 @@ DCHECK(!capture_start_time_.is_null()); base::TimeDelta last_capture_duration = NowTicks() - capture_start_time_; + VLOG(2) << __func__ << " [last_capture_duration=" + << last_capture_duration.InMilliseconds() << "]"; // Limit frame-rate to reduce CPU consumption. base::TimeDelta capture_period = std::max((last_capture_duration * 100) / max_cpu_consumption_percentage_, requested_frame_duration_); + VLOG(2) << " timer(dT=" + << (capture_period - last_capture_duration).InMilliseconds() << ")"; // Schedule a task for the next frame. capture_timer_->Start(FROM_HERE, capture_period - last_capture_duration, this, &Core::OnCaptureTimer);
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc index 36c22d80..e5190be5 100644 --- a/content/browser/preloading/prefetch/prefetch_container.cc +++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -445,6 +445,14 @@ std::move(on_eligibility_check_complete_callback); } +bool PrefetchContainer::IsOnEligibilityCheckCompleteCallbackRegistered( + const GURL& url) const { + SinglePrefetch* this_prefetch = GetSinglePrefetch(url); + DCHECK(this_prefetch); + + return !this_prefetch->on_eligibility_check_complete_callback_.is_null(); +} + void PrefetchContainer::RegisterCookieListener( const GURL& url, network::mojom::CookieManager* cookie_manager) { @@ -611,6 +619,9 @@ } void PrefetchContainer::OnPrefetchComplete() { + UMA_HISTOGRAM_COUNTS_100("PrefetchProxy.Prefetch.RedirectChainSize", + redirect_chain_.size()); + if (!streaming_loader_) { return; } @@ -745,6 +756,8 @@ void PrefetchContainer::OnReturnPrefetchToServe(bool served) { if (served) { + UMA_HISTOGRAM_COUNTS_100("PrefetchProxy.AfterClick.RedirectChainSize", + redirect_chain_.size()); navigated_to_ = true; }
diff --git a/content/browser/preloading/prefetch/prefetch_container.h b/content/browser/preloading/prefetch/prefetch_container.h index 34edde4c..a91cc0e 100644 --- a/content/browser/preloading/prefetch/prefetch_container.h +++ b/content/browser/preloading/prefetch/prefetch_container.h
@@ -130,6 +130,10 @@ OnEligibilityCheckCompleteCallback on_eligibility_check_complete_callback); + // Returns whether or not a callback has been registered for the given URL via + // |SetOnEligibilityCheckCompleteCallback|. + bool IsOnEligibilityCheckCompleteCallbackRegistered(const GURL& url) const; + // The length of the redirect chain for this prefetch. size_t GetRedirectChainSize() const { return redirect_chain_.size(); } GURL GetMatchingURLFromRedirectChain() const;
diff --git a/content/browser/preloading/prefetch/prefetch_container_unittest.cc b/content/browser/preloading/prefetch/prefetch_container_unittest.cc index 2b7ee0d2..e0fa738b 100644 --- a/content/browser/preloading/prefetch/prefetch_container_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
@@ -784,4 +784,22 @@ base::Milliseconds(40), 1); } +TEST_F(PrefetchContainerTest, RecordRedirectChainSize) { + base::HistogramTester histogram_tester; + + PrefetchContainer prefetch_container( + GlobalRenderFrameHostId(1234, 5678), GURL("https://test.com"), + PrefetchType(/*use_isolated_network_context=*/true, + /*use_prefetch_proxy=*/true, + blink::mojom::SpeculationEagerness::kEager), + blink::mojom::Referrer(), absl::nullopt, nullptr); + + prefetch_container.AddRedirectHop(GURL("https://redirect1.com")); + prefetch_container.AddRedirectHop(GURL("https://redirect2.com")); + prefetch_container.OnPrefetchComplete(); + + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.RedirectChainSize", 3, 1); +} + } // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc index 1372745..6bef48c5 100644 --- a/content/browser/preloading/prefetch/prefetch_service.cc +++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -232,6 +232,35 @@ return web_content->GetBrowserContext(); } +void RecordRedirectResult(PrefetchRedirectResult result) { + UMA_HISTOGRAM_ENUMERATION("PrefetchProxy.Redirect.Result", result); +} + +void RecordRedirectNetworkContextTransition( + bool prefetch_requires_isolated_network_context, + bool redirect_requires_isolated_network_context) { + PrefetchRedirectNetworkContextTransition transition; + if (!prefetch_requires_isolated_network_context && + !redirect_requires_isolated_network_context) { + transition = PrefetchRedirectNetworkContextTransition::kDefaultToDefault; + } + if (!prefetch_requires_isolated_network_context && + redirect_requires_isolated_network_context) { + transition = PrefetchRedirectNetworkContextTransition::kDefaultToIsolated; + } + if (prefetch_requires_isolated_network_context && + !redirect_requires_isolated_network_context) { + transition = PrefetchRedirectNetworkContextTransition::kIsolatedToDefault; + } + if (prefetch_requires_isolated_network_context && + redirect_requires_isolated_network_context) { + transition = PrefetchRedirectNetworkContextTransition::kIsolatedToIsolated; + } + + UMA_HISTOGRAM_ENUMERATION( + "PrefetchProxy.Redirect.NetworkContextStateTransition", transition); +} + } // namespace // static @@ -640,6 +669,10 @@ return; } + RecordRedirectResult(eligible + ? PrefetchRedirectResult::kSuccessRedirectFollowed + : PrefetchRedirectResult::kFailedIneligible); + // If the redirect is ineligible, the prefetch may change into a decoy. bool is_decoy = false; if (!eligible) { @@ -953,6 +986,7 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!prefetch_container) { + RecordRedirectResult(PrefetchRedirectResult::kFailedNullPrefetch); return PrefetchStreamingURLLoaderStatus::kFailedInvalidRedirect; } @@ -973,6 +1007,15 @@ Prefetch(); + if (!base::FeatureList::IsEnabled(features::kPrefetchRedirects)) { + RecordRedirectResult(PrefetchRedirectResult::kFailedRedirectsDisabled); + } else if (redirect_info.new_method != "GET") { + RecordRedirectResult(PrefetchRedirectResult::kFailedInvalidMethod); + } else if (response_head.headers->response_code() < 300 || + response_head.headers->response_code() >= 400) { + RecordRedirectResult(PrefetchRedirectResult::kFailedInvalidResponseCode); + } + return PrefetchStreamingURLLoaderStatus::kFailedInvalidRedirect; } @@ -983,6 +1026,9 @@ bool is_isolated_network_context_required = !url::Origin::Create(prefetch_container->GetReferrer().url) .IsSameOriginWith(redirect_info.new_url); + RecordRedirectNetworkContextTransition( + prefetch_container->GetPrefetchType().IsIsolatedNetworkContextRequired(), + is_isolated_network_context_required); if (is_isolated_network_context_required != prefetch_container->GetPrefetchType() .IsIsolatedNetworkContextRequired()) { @@ -996,6 +1042,9 @@ Prefetch(); + RecordRedirectResult( + PrefetchRedirectResult::kFailedInvalidChangeInNetworkContext); + return PrefetchStreamingURLLoaderStatus::kFailedInvalidRedirect; }
diff --git a/content/browser/preloading/prefetch/prefetch_service.h b/content/browser/preloading/prefetch/prefetch_service.h index 667350b4..0fc1a64 100644 --- a/content/browser/preloading/prefetch/prefetch_service.h +++ b/content/browser/preloading/prefetch/prefetch_service.h
@@ -37,6 +37,29 @@ class PrefetchServiceDelegate; class ServiceWorkerContext; +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class PrefetchRedirectResult { + kSuccessRedirectFollowed = 0, + kFailedNullPrefetch = 1, + kFailedRedirectsDisabled = 2, + kFailedInvalidMethod = 3, + kFailedInvalidResponseCode = 4, + kFailedInvalidChangeInNetworkContext = 5, + kFailedIneligible = 6, + kMaxValue = kFailedIneligible, +}; + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. +enum class PrefetchRedirectNetworkContextTransition { + kDefaultToDefault = 0, + kDefaultToIsolated = 1, + kIsolatedToDefault = 2, + kIsolatedToIsolated = 3, + kMaxValue = kIsolatedToIsolated, +}; + // Manages all prefetches within a single BrowserContext. Responsible for // checking the eligibility of the prefetch, making the network request for the // prefetch, and provide prefetched resources to URL loader interceptor when
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc index e662d11c..08ac50a 100644 --- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -16,6 +16,7 @@ #include "content/browser/preloading/prefetch/prefetch_params.h" #include "content/browser/preloading/prefetch/prefetch_status.h" #include "content/browser/preloading/preloading.h" +#include "content/browser/preloading/preloading_config.h" #include "content/browser/preloading/preloading_data_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/frame_accept_header.h" @@ -220,6 +221,7 @@ ->GetCookieManager(cookie_manager_.BindNewPipeAndPassReceiver()); InitScopedFeatureList(); + PreloadingConfig::GetInstance().ParseConfig(); PrefetchService::SetURLLoaderFactoryForTesting( test_shared_url_loader_factory_.get()); @@ -249,6 +251,8 @@ PrefetchService::SetServiceWorkerContextForTesting(nullptr); PrefetchService::SetURLLoaderFactoryForTesting(nullptr); test_content_browser_client_.reset(); + scoped_feature_list_.Reset(); + PreloadingConfig::GetInstance().ParseConfig(); RenderViewHostTestHarness::TearDown(); } @@ -280,9 +284,14 @@ PrefetchDocumentManager::GetOrCreateForCurrentDocument(main_rfh()); if (enable_no_vary_search_header) prefetch_document_manager->EnableNoVarySearchSupport(); + + blink::mojom::Referrer referrer; + if (!prefetch_type.IsIsolatedNetworkContextRequired()) { + referrer.url = url; + } + network::mojom::NoVarySearchPtr no_vary_search_expected; - prefetch_document_manager->PrefetchUrl(url, prefetch_type, - blink::mojom::Referrer(), + prefetch_document_manager->PrefetchUrl(url, prefetch_type, referrer, no_vary_search_expected, nullptr); } @@ -725,6 +734,9 @@ ASSERT_TRUE(serveable_prefetch_container->GetHead()); EXPECT_TRUE(serveable_prefetch_container->GetHead()->was_in_prefetch_cache); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.AfterClick.RedirectChainSize", 1, 1); + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kReady, @@ -3321,6 +3333,13 @@ /*use_prefetch_proxy=*/true, {}, GURL("https://redirect.com"))); VerifyFollowRedirectParams(1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kSuccessRedirectFollowed, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.NetworkContextStateTransition", + PrefetchRedirectNetworkContextTransition::kIsolatedToIsolated, 1); + MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, /*use_prefetch_proxy=*/true, {{"X-Testing", "Hello World"}}, kHTMLBody); @@ -3368,6 +3387,9 @@ ASSERT_TRUE(serveable_prefetch_container->GetHead()); EXPECT_TRUE(serveable_prefetch_container->GetHead()->was_in_prefetch_cache); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.AfterClick.RedirectChainSize", 2, 1); + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kReady, @@ -3413,6 +3435,13 @@ // requires mojo, the eligibility check will not complete immediately. VerifyFollowRedirectParams(0); + histogram_tester.ExpectUniqueSample("PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kFailedIneligible, + 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.NetworkContextStateTransition", + PrefetchRedirectNetworkContextTransition::kIsolatedToIsolated, 1); + Navigate(GURL("https://example.com"), main_rfh()->GetGlobalId()); histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode", @@ -3447,6 +3476,9 @@ GetPrefetchToServe(GURL("https://example.com")); EXPECT_FALSE(serveable_prefetch_container); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.AfterClick.RedirectChainSize", 0); + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kFailure, @@ -3496,6 +3528,13 @@ // immediately. VerifyFollowRedirectParams(0); + histogram_tester.ExpectUniqueSample("PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kFailedIneligible, + 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.NetworkContextStateTransition", + PrefetchRedirectNetworkContextTransition::kIsolatedToIsolated, 1); + Navigate(GURL("https://example.com"), main_rfh()->GetGlobalId()); histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode", @@ -3530,6 +3569,9 @@ GetPrefetchToServe(GURL("https://example.com")); EXPECT_FALSE(serveable_prefetch_container); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.AfterClick.RedirectChainSize", 0); + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kFailure, @@ -3570,6 +3612,12 @@ GURL("https://redirect.com"))); VerifyFollowRedirectParams(0); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kFailedInvalidResponseCode, 1); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.Redirect.NetworkContextStateTransition", 0); + Navigate(GURL("https://example.com"), main_rfh()->GetGlobalId()); histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode", @@ -3603,6 +3651,194 @@ GetPrefetchToServe(GURL("https://example.com")); EXPECT_FALSE(serveable_prefetch_container); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.AfterClick.RedirectChainSize", 0); + + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, + PreloadingHoldbackStatus::kAllowed, + PreloadingTriggeringOutcome::kFailure, + ToPreloadingFailureReason( + PrefetchStatus::kPrefetchFailedInvalidRedirect)); +} + +// TODO(crbug.com/1396460): Test flaky on lacros trybots. +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_PrefetchSameOriginEligibleRedirect \ + DISABLED_PrefetchSameOriginEligibleRedirect +#else +#define MAYBE_PrefetchSameOriginEligibleRedirect \ + PrefetchSameOriginEligibleRedirect +#endif +TEST_F(PrefetchServiceAllowRedirectTest, + MAYBE_PrefetchSameOriginEligibleRedirect) { + base::HistogramTester histogram_tester; + + MakePrefetchService( + std::make_unique<testing::NiceMock<MockPrefetchServiceDelegate>>()); + + MakePrefetchOnMainFrame( + GURL("https://example.com"), + PrefetchType(/*use_isolated_network_context=*/false, + /*use_prefetch_proxy=*/false, + blink::mojom::SpeculationEagerness::kEager)); + + base::RunLoop().RunUntilIdle(); + + VerifyCommonRequestState(GURL("https://example.com"), + /*use_prefetch_proxy=*/false); + VerifyFollowRedirectParams(0); + + net::RedirectInfo redirect_info; + redirect_info.new_method = "GET"; + redirect_info.new_url = GURL("https://example.com/redirect"); + MakeSingleRedirectAndWait(redirect_info, + CreateURLResponseHeadForPrefetch( + net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, + /*use_prefetch_proxy=*/true, {}, + GURL("https://example.com/redirect"))); + VerifyFollowRedirectParams(1); + + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kSuccessRedirectFollowed, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.NetworkContextStateTransition", + PrefetchRedirectNetworkContextTransition::kDefaultToDefault, 1); + + MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, + /*use_prefetch_proxy=*/false, + {{"X-Testing", "Hello World"}}, kHTMLBody); + + Navigate(GURL("https://example.com"), main_rfh()->GetGlobalId()); + + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.Mainframe.RespCode", net::HTTP_OK, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.Mainframe.NetError", net::OK, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.Mainframe.BodyLength", std::size(kHTMLBody), 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.Mainframe.TotalTime", kTotalTimeDuration, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Prefetch.Mainframe.ConnectTime", kConnectTimeDuration, 1); + + absl::optional<PrefetchReferringPageMetrics> referring_page_metrics = + PrefetchReferringPageMetrics::GetForCurrentDocument(main_rfh()); + EXPECT_EQ(referring_page_metrics->prefetch_attempted_count, 1); + EXPECT_EQ(referring_page_metrics->prefetch_eligible_count, 1); + EXPECT_EQ(referring_page_metrics->prefetch_successful_count, 1); + + absl::optional<PrefetchServingPageMetrics> serving_page_metrics = + GetMetricsForMostRecentNavigation(); + ASSERT_TRUE(serving_page_metrics); + EXPECT_TRUE(serving_page_metrics->prefetch_status); + EXPECT_EQ(serving_page_metrics->prefetch_status.value(), + static_cast<int>(PrefetchStatus::kPrefetchSuccessful)); + EXPECT_FALSE(serving_page_metrics->required_private_prefetch_proxy); + EXPECT_TRUE(serving_page_metrics->same_tab_as_prefetching_tab); + EXPECT_TRUE(serving_page_metrics->prefetch_header_latency); + EXPECT_EQ(serving_page_metrics->prefetch_header_latency.value(), + base::Milliseconds(kHeaderLatency)); + + base::WeakPtr<PrefetchContainer> serveable_prefetch_container = + GetPrefetchToServe(GURL("https://example.com")); + EXPECT_TRUE(serveable_prefetch_container); + ASSERT_TRUE(serveable_prefetch_container); + EXPECT_TRUE(serveable_prefetch_container->HasPrefetchStatus()); + EXPECT_EQ(serveable_prefetch_container->GetPrefetchStatus(), + PrefetchStatus::kPrefetchSuccessful); + EXPECT_TRUE( + serveable_prefetch_container->IsPrefetchServable(base::TimeDelta::Max())); + ASSERT_TRUE(serveable_prefetch_container->GetHead()); + EXPECT_TRUE(serveable_prefetch_container->GetHead()->was_in_prefetch_cache); + + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.AfterClick.RedirectChainSize", 2, 1); + + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, + PreloadingHoldbackStatus::kAllowed, + PreloadingTriggeringOutcome::kReady, + PreloadingFailureReason::kUnspecified); +} + +// TODO(crbug.com/1396460): Test flaky on lacros trybots. +#if BUILDFLAG(IS_CHROMEOS) +#define MAYBE_InvalidNetworkContextTransition \ + DISABLED_InvalidNetworkContextTransition +#else +#define MAYBE_InvalidNetworkContextTransition InvalidNetworkContextTransition +#endif +TEST_F(PrefetchServiceAllowRedirectTest, + MAYBE_InvalidNetworkContextTransition) { + base::HistogramTester histogram_tester; + + MakePrefetchService( + std::make_unique<testing::NiceMock<MockPrefetchServiceDelegate>>()); + + MakePrefetchOnMainFrame( + GURL("https://example.com"), + PrefetchType(/*use_isolated_network_context=*/false, + /*use_prefetch_proxy=*/false, + blink::mojom::SpeculationEagerness::kEager)); + base::RunLoop().RunUntilIdle(); + + VerifyCommonRequestState(GURL("https://example.com"), + /*use_prefetch_proxy=*/false); + VerifyFollowRedirectParams(0); + + net::RedirectInfo redirect_info; + redirect_info.new_method = "GET"; + redirect_info.new_url = GURL("https://redirect.com"); + MakeSingleRedirectAndWait( + redirect_info, + CreateURLResponseHeadForPrefetch( + net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, + /*use_prefetch_proxy=*/true, {}, GURL("https://redirect.com"))); + VerifyFollowRedirectParams(0); + + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.Result", + PrefetchRedirectResult::kFailedInvalidChangeInNetworkContext, 1); + histogram_tester.ExpectUniqueSample( + "PrefetchProxy.Redirect.NetworkContextStateTransition", + PrefetchRedirectNetworkContextTransition::kDefaultToIsolated, 1); + + Navigate(GURL("https://example.com"), main_rfh()->GetGlobalId()); + + histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.RespCode", + 0); + histogram_tester.ExpectTotalCount("PrefetchProxy.Prefetch.Mainframe.NetError", + 0); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.Prefetch.Mainframe.BodyLength", 0); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.Prefetch.Mainframe.TotalTime", 0); + histogram_tester.ExpectTotalCount( + "PrefetchProxy.Prefetch.Mainframe.ConnectTime", 0); + + absl::optional<PrefetchReferringPageMetrics> referring_page_metrics = + PrefetchReferringPageMetrics::GetForCurrentDocument(main_rfh()); + EXPECT_EQ(referring_page_metrics->prefetch_attempted_count, 1); + EXPECT_EQ(referring_page_metrics->prefetch_eligible_count, 1); + EXPECT_EQ(referring_page_metrics->prefetch_successful_count, 0); + + absl::optional<PrefetchServingPageMetrics> serving_page_metrics = + GetMetricsForMostRecentNavigation(); + ASSERT_TRUE(serving_page_metrics); + EXPECT_TRUE(serving_page_metrics->prefetch_status); + EXPECT_EQ(serving_page_metrics->prefetch_status.value(), + static_cast<int>(PrefetchStatus::kPrefetchFailedInvalidRedirect)); + EXPECT_FALSE(serving_page_metrics->required_private_prefetch_proxy); + EXPECT_TRUE(serving_page_metrics->same_tab_as_prefetching_tab); + EXPECT_FALSE(serving_page_metrics->prefetch_header_latency); + + base::WeakPtr<PrefetchContainer> serveable_prefetch_container = + GetPrefetchToServe(GURL("https://example.com")); + EXPECT_FALSE(serveable_prefetch_container); + + histogram_tester.ExpectTotalCount( + "PrefetchProxy.AfterClick.RedirectChainSize", 0); + ExpectCorrectUkmLogs(PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kFailure,
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc index bb5bcbb..a74faba 100644 --- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc +++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor.cc
@@ -7,6 +7,7 @@ #include <memory> #include "base/memory/weak_ptr.h" +#include "base/metrics/histogram_macros.h" #include "content/browser/browser_context_impl.h" #include "content/browser/loader/navigation_loader_interceptor.h" #include "content/browser/preloading/prefetch/prefetch_container.h" @@ -32,6 +33,12 @@ return web_content->GetBrowserContext(); } +void RecordWasFullRedirectChainServedHistogram( + bool was_full_redirect_chain_served) { + UMA_HISTOGRAM_BOOLEAN("PrefetchProxy.AfterClick.WasFullRedirectChainServed", + was_full_redirect_chain_served); +} + } // namespace // static @@ -70,6 +77,11 @@ return; } + if (redirect_prefetch_container_) { + RecordWasFullRedirectChainServedHistogram(false); + redirect_prefetch_container_ = nullptr; + } + GetPrefetch( tentative_resource_request, base::BindOnce(&PrefetchURLLoaderInterceptor::OnGetPrefetchComplete, @@ -120,6 +132,9 @@ base::MakeRefCounted<network::SingleRequestURLLoaderFactory>( raw_prefetch_streaming_url_loader->ServingFinalResponseHandler( std::move(prefetch_streaming_url_loader))); + if (redirect_prefetch_container_) { + RecordWasFullRedirectChainServedHistogram(true); + } redirect_prefetch_container_ = nullptr; } else { single_request_url_loader_factory =
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc index 574adb6..4e179bf 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.cc +++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -1236,6 +1236,21 @@ return entries_; } +std::list<BackForwardCacheImpl::Entry*> +BackForwardCacheImpl::GetEntriesForRenderViewHostImpl( + const RenderViewHostImpl* rvhi) const { + std::list<BackForwardCacheImpl::Entry*> entries_for_rvhi; + for (auto& entry : entries_) { + for (const auto& rvh : entry->render_view_hosts()) { + if (&*rvh == rvhi) { + entries_for_rvhi.push_back(entry.get()); + break; + } + } + } + return entries_for_rvhi; +} + BackForwardCacheImpl::Entry* BackForwardCacheImpl::GetEntry( int navigation_entry_id) { auto matching_entry = base::ranges::find(
diff --git a/content/browser/renderer_host/back_forward_cache_impl.h b/content/browser/renderer_host/back_forward_cache_impl.h index f9a7e60..493f5c4 100644 --- a/content/browser/renderer_host/back_forward_cache_impl.h +++ b/content/browser/renderer_host/back_forward_cache_impl.h
@@ -356,6 +356,8 @@ } const std::list<std::unique_ptr<Entry>>& GetEntries(); + std::list<Entry*> GetEntriesForRenderViewHostImpl( + const RenderViewHostImpl* rvhi) const; // BackForwardCache overrides: void Flush() override;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 4f72091..0e13e4c 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -11810,11 +11810,6 @@ bool RenderFrameHostImpl::IsNavigationSameSite( const UrlInfo& dest_url_info) const { - // TODO(peilinwang): remove when we've finished investigating BeginNavigation - // jank (https://crbug.com/1380942). - TRACE_EVENT0("navigation", "RenderFrameHostImpl::IsNavigationSameSite"); - SCOPED_UMA_HISTOGRAM_TIMER("Navigation.IsNavigationSameSite.Duration"); - if (!WebExposedIsolationInfo::AreCompatible( GetSiteInstance()->GetWebExposedIsolationInfo(), dest_url_info.web_exposed_isolation_info)) {
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 5266e9b..4653e7c 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -3101,6 +3101,8 @@ ResetOwnerInBFCache); FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplBrowserTestWithBFCache, ChildFramesHiddenWhileInBFCache); + FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplBrowserTestWithBFCache, + EvictionInBFCache); FRIEND_TEST_ALL_PREFIXES(RenderFrameHostImplPrerenderBrowserTest, KeepPrerenderRFHOwnerAfterActivation); class SubresourceLoaderFactoriesConfig;
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc index 6f33c5c..9c6da51 100644 --- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -34,6 +34,7 @@ #include "base/test/test_timeouts.h" #include "build/build_config.h" #include "components/ukm/test_ukm_recorder.h" +#include "components/viz/common/features.h" #include "content/browser/browser_main_loop.h" #include "content/browser/renderer_host/input/timeout_monitor.h" #include "content/browser/renderer_host/navigation_request.h" @@ -7641,16 +7642,55 @@ GetDefaultEnabledBackForwardCacheFeaturesForTesting( /*ignore_outstanding_network_request=*/false); enabled_features.push_back({kNavigationUpdatesChildViewsVisibility, {{}}}); + enabled_features.push_back({features::kEvictSubtree, {{}}}); scoped_feature_list_.InitWithFeaturesAndParameters( enabled_features, GetDefaultDisabledBackForwardCacheFeaturesForTesting()); } ~RenderFrameHostImplBrowserTestWithBFCache() override = default; + viz::SurfaceId GetSurfaceId(const FrameTreeNode* frame_tree_node) const; + bool ContainsSurfaceIdOrNewer(const std::vector<viz::SurfaceId>& ids, + viz::SurfaceId expected_id) const; + + protected: + void SetUpCommandLine(base::CommandLine* command_line) override; + private: base::test::ScopedFeatureList scoped_feature_list_; }; +viz::SurfaceId RenderFrameHostImplBrowserTestWithBFCache::GetSurfaceId( + const FrameTreeNode* frame_tree_node) const { + viz::SurfaceId id; + auto* view = static_cast<RenderWidgetHostViewBase*>( + frame_tree_node->current_frame_host()->GetView()); + if (view) { + id = view->GetCurrentSurfaceId(); + } + return id; +} + +bool RenderFrameHostImplBrowserTestWithBFCache::ContainsSurfaceIdOrNewer( + const std::vector<viz::SurfaceId>& ids, + viz::SurfaceId expected_id) const { + for (auto id : ids) { + if (id.IsSameOrNewerThan(expected_id)) { + return true; + } + } + return false; +} + +void RenderFrameHostImplBrowserTestWithBFCache::SetUpCommandLine( + base::CommandLine* command_line) { + // The full BackForwardCacheBrowserTest suite ads far more to the CommandLine. + // While we enable many features in the ctor, we need `--site-per-process` to + // ensure full testing of OOPIFs in BFCache. + IsolateAllSitesForTesting(command_line); + RenderFrameHostImplBrowserTest::SetUpCommandLine(command_line); +} + IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTestWithBFCache, ResetOwnerInBFCache) { GURL url_a(embedded_test_server()->GetURL( @@ -7766,6 +7806,60 @@ rfso_d.WaitForAnyFrameSubmission(); } +// Tests that when a RenderFrameHost is stored in BFCache, that when it is +// evicted, that both it and its child frames have their viz::SurfaceIds +// collected for eviction. +IN_PROC_BROWSER_TEST_F(RenderFrameHostImplBrowserTestWithBFCache, + EvictionInBFCache) { + GURL url_a(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(b)")); + GURL url_c(embedded_test_server()->GetURL("c.com", "/title2.html")); + + // 1) Navigate to A(B). + EXPECT_TRUE(NavigateToURL(shell(), url_a)); + + RenderFrameHostImpl* rfh_a = web_contents()->GetPrimaryMainFrame(); + RenderFrameHostImpl* rfh_b = rfh_a->child_at(0)->current_frame_host(); + FrameTreeNode* expected_parent_ftn = rfh_a->frame_tree_node(); + FrameTreeNode* expected_child_ftn = rfh_b->frame_tree_node(); + + viz::SurfaceId id_a = GetSurfaceId(expected_parent_ftn); + // On slower machines the Main-thread for the child frame may not have + // completed blink::RemoteFrameView::UpdateViewportIntersectionsForSubtree + // which can advance the viz::SurfaceId. The final may be newer than this, but + // from the same viz::FrameSink and viz::LocalSurfaceId::embed_token, so we + // cache now anyways. + viz::SurfaceId id_b = GetSurfaceId(expected_child_ftn); + EXPECT_TRUE(id_a.is_valid()); + EXPECT_TRUE(id_b.is_valid()); + // Ensure that they are separate surfaces and that site-isolation of test + // setup has not regressed. + EXPECT_NE(id_a, id_b); + + // 2) Navigate to C. + EXPECT_TRUE(NavigateToURL(shell(), url_c)); + RenderFrameHostImpl* rfh_c = web_contents()->GetPrimaryMainFrame(); + + // 3) Ensure A(B) are cached. + EXPECT_TRUE(rfh_a->IsInBackForwardCache()); + EXPECT_TRUE(rfh_b->IsInBackForwardCache()); + EXPECT_FALSE(rfh_c->IsInBackForwardCache()); + EXPECT_NE(rfh_a, rfh_c); + EXPECT_EQ(nullptr, rfh_a->owner_); + EXPECT_EQ(expected_child_ftn, rfh_b->owner_); + EXPECT_EQ(expected_parent_ftn, rfh_c->owner_); + + // Collect the viz::SurfaceIds to evict. We should find both `id_a` and + // `id_b`. + RenderViewHostImpl* rvh_a = + static_cast<RenderViewHostImpl*>(rfh_a->GetRenderViewHost()); + std::vector<viz::SurfaceId> ids = rvh_a->CollectSurfaceIdsForEviction(); + + EXPECT_EQ(ids.size(), 2u); + EXPECT_TRUE(ContainsSurfaceIdOrNewer(ids, id_a)); + EXPECT_TRUE(ContainsSurfaceIdOrNewer(ids, id_b)); +} + class RenderFrameHostImplPrerenderBrowserTest : public RenderFrameHostImplBrowserTest { public:
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index 5c4442d0..33467ce 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -101,13 +101,6 @@ url.scheme() == url::kDataScheme; } -// When enabled, we cache the result of IsNavigationSameSite() to avoid -// redundant work during a given navigation event. See -// RenderFrameHostManager::IsSameSiteGetter for more details. -BASE_FEATURE(kCacheIsNavigationSameSite, - "CacheIsNavigationSameSite", - base::FEATURE_ENABLED_BY_DEFAULT); - // Helper function to determine whether a navigation from `current_rfh` to // `destination_effective_url_info` should swap BrowsingInstances to ensure that // `destination_effective_url_info` ends up in a dedicated process. This is the @@ -338,22 +331,14 @@ } // namespace RenderFrameHostManager::IsSameSiteGetter::IsSameSiteGetter() - : is_same_site_(absl::nullopt), - should_use_cached_value_( - base::FeatureList::IsEnabled(kCacheIsNavigationSameSite)) {} + : is_same_site_(absl::nullopt) {} RenderFrameHostManager::IsSameSiteGetter::IsSameSiteGetter(bool is_same_site) - : is_same_site_(is_same_site), - should_use_cached_value_( - base::FeatureList::IsEnabled(kCacheIsNavigationSameSite)) {} + : is_same_site_(is_same_site) {} bool RenderFrameHostManager::IsSameSiteGetter::Get( const RenderFrameHostImpl& render_frame_host, const UrlInfo& url_info) { - if (!should_use_cached_value_) { - return render_frame_host.IsNavigationSameSite(url_info); - } - if (!is_same_site_.has_value()) { is_same_site_ = render_frame_host.IsNavigationSameSite(url_info); } else {
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h index 83448cd..6c4b266 100644 --- a/content/browser/renderer_host/render_frame_host_manager.h +++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -187,17 +187,15 @@ virtual ~Delegate() = default; }; - // Calling IsNavigationSameSite() many times is expensive - // (https://crbug.com/1380942). If kCacheIsNavigationSameSite is enabled, - // this struct will lazily cache the output of IsNavigationSameSite(). If - // there is no cached value, Get() will cache the output of - // IsNavigationSameSite(), and will return the cached value in subsequent - // calls. If kCacheIsNavigationSameSite is not enabled, Get() will always call - // IsNavigationSameSite(), no caching is done. + // Calling `IsNavigationSameSite()` many times is expensive + // (https://crbug.com/1380942). This struct will lazily cache the output of + // `IsNavigationSameSite()`. If there is no cached value, Get() will cache + // the output of `IsNavigationSameSite()`, and will return the cached value in + // subsequent calls. // // This struct is used by passing it as a parameter throughout a callstack - // that contains IsNavigationSameSite(). It is only used for a given - // navigation event (for which IsNavigationSameSite() will not change), and + // that contains `IsNavigationSameSite()`. It is only used for a given + // navigation event (for which `IsNavigationSameSite()` will not change), and // should not be stored or used for other events in the same navigation // (e.g., after redirects) or for other navigations. struct IsSameSiteGetter { @@ -216,7 +214,6 @@ private: absl::optional<bool> is_same_site_; - bool should_use_cached_value_; }; // The delegate pointer must be non-null and is not owned by this class. It @@ -568,10 +565,8 @@ // GetProcess() is called on the SiteInstance. In particular, calling this // function will never lead to a process being created for the navigation. // - // |is_same_site| is a struct to cache the output of IsNavigationSameSite() - // if/when it gets called. The value is cached only when - // kCacheIsNavigationSameSite is enabled. See IsSameSiteGetter for more - // details. + // |is_same_site| is a struct to cache the output of `IsNavigationSameSite()` + // if/when it gets called. See `IsSameSiteGetter` for more details. // // |reason| is an optional out-parameter that will be populated with // engineer-readable information describing the reason for the method
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 172f0b4..43c8a991 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -33,6 +33,7 @@ #include "base/values.h" #include "build/build_config.h" #include "cc/base/switches.h" +#include "components/viz/common/features.h" #include "content/browser/bad_message.h" #include "content/browser/child_process_security_policy_impl.h" #include "content/browser/dom_storage/session_storage_namespace_impl.h" @@ -184,6 +185,27 @@ const int PerProcessRenderViewHostSet::kUserDataKey; +// Finds all viz::SurfaceIds within `node_range` and adds them to `out_ids`. +void CollectSurfaceIdsForEvictionForFrameTreeNodeRange( + FrameTree::NodeRange& node_range, + std::vector<viz::SurfaceId>& out_ids) { + for (FrameTreeNode* node : node_range) { + if (!node->current_frame_host()->is_local_root()) { + continue; + } + RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( + node->current_frame_host()->GetView()); + if (!view) { + continue; + } + viz::SurfaceId id = view->GetCurrentSurfaceId(); + if (id.is_valid()) { + out_ids.push_back(id); + } + view->set_is_evicted(); + } +} + } // namespace /////////////////////////////////////////////////////////////////////////////// @@ -639,37 +661,21 @@ } void RenderViewHostImpl::OnBackForwardCacheTimeout() { - // TODO(yuzus): Implement a method to get a list of RenderFrameHosts - // associated with |this|, instead of iterating through all the - // RenderFrameHosts in bfcache. - const auto& entries = - frame_tree_->controller().GetBackForwardCache().GetEntries(); - for (auto& entry : entries) { - for (const auto& rvh : entry->render_view_hosts()) { - if (&*rvh == this) { - RenderFrameHostImpl* rfh = entry->render_frame_host(); - rfh->EvictFromBackForwardCacheWithReason( - BackForwardCacheMetrics::NotRestoredReason::kTimeoutPuttingInCache); - break; - } - } + auto entries = frame_tree_->controller() + .GetBackForwardCache() + .GetEntriesForRenderViewHostImpl(this); + for (auto* entry : entries) { + entry->render_frame_host()->EvictFromBackForwardCacheWithReason( + BackForwardCacheMetrics::NotRestoredReason::kTimeoutPuttingInCache); } } void RenderViewHostImpl::MaybeEvictFromBackForwardCache() { - // TODO(yuzus): Implement a method to get a list of RenderFrameHosts - // associated with |this|, instead of iterating through all the - // RenderFrameHosts in bfcache. - const auto& entries = - frame_tree_->controller().GetBackForwardCache().GetEntries(); - for (auto& entry : entries) { - for (const auto& rvh : entry->render_view_hosts()) { - if (&*rvh == this) { - RenderFrameHostImpl* rfh = entry->render_frame_host(); - rfh->MaybeEvictFromBackForwardCache(); - break; - } - } + auto entries = frame_tree_->controller() + .GetBackForwardCache() + .GetEntriesForRenderViewHostImpl(this); + for (auto* entry : entries) { + entry->render_frame_host()->MaybeEvictFromBackForwardCache(); } } @@ -883,37 +889,63 @@ } std::vector<viz::SurfaceId> RenderViewHostImpl::CollectSurfaceIdsForEviction() { - if (!is_active()) - return {}; - RenderFrameHostImpl* rfh = GetMainRenderFrameHost(); - if (!rfh || !rfh->IsActive()) - return {}; - - FrameTreeNode* root = rfh->frame_tree_node(); - FrameTree& tree = root->frame_tree(); - - // Inner tree nodes are used for several purposes, e.g. fenced frames, - // <webview>, portals and PDF. These may have a compositor surface as well, in - // which case we need to explore not the outer node only, but the inner ones - // as well. - FrameTree::NodeRange node_range = - base::FeatureList::IsEnabled( - features::kInnerFrameCompositorSurfaceEviction) - ? tree.NodesIncludingInnerTreeNodes() - : tree.SubtreeNodes(root); - std::vector<viz::SurfaceId> ids; - for (FrameTreeNode* node : node_range) { - if (!node->current_frame_host()->is_local_root()) - continue; - RenderWidgetHostViewBase* view = static_cast<RenderWidgetHostViewBase*>( - node->current_frame_host()->GetView()); - if (!view) - continue; - viz::SurfaceId id = view->GetCurrentSurfaceId(); - if (id.is_valid()) - ids.push_back(id); - view->set_is_evicted(); + if (is_active()) { + RenderFrameHostImpl* rfh = GetMainRenderFrameHost(); + if (!rfh || !rfh->IsActive()) { + return {}; + } + + FrameTreeNode* root = rfh->frame_tree_node(); + FrameTree& tree = root->frame_tree(); + + // Inner tree nodes are used for several purposes, e.g. fenced frames, + // <webview>, portals and PDF. These may have a compositor surface as well, + // in which case we need to explore not the outer node only, but the inner + // ones as well. + FrameTree::NodeRange node_range = + base::FeatureList::IsEnabled( + features::kInnerFrameCompositorSurfaceEviction) + ? tree.NodesIncludingInnerTreeNodes() + : tree.SubtreeNodes(root); + CollectSurfaceIdsForEvictionForFrameTreeNodeRange(node_range, ids); + } else if (is_in_back_forward_cache_ && + base::FeatureList::IsEnabled(features::kEvictSubtree)) { + // `FrameTree::SubtreeAndInnerTreeNodes` starts with the children of `rfh` + // so we need to add our current viz::SurfaceId to ensure it is evicted. + if (render_widget_host_) { + auto* view = render_widget_host_->GetView(); + if (view) { + if (view->GetCurrentSurfaceId().is_valid()) { + ids.push_back(view->GetCurrentSurfaceId()); + view->set_is_evicted(); + } + } + } + + auto entries = frame_tree_->controller() + .GetBackForwardCache() + .GetEntriesForRenderViewHostImpl(this); + for (auto* entry : entries) { + auto* rfh = entry->render_frame_host(); + if (!rfh) { + continue; + } + // While `is_in_back_forward_cache_` there is no `main_frame_routing_id_` + // so there is no `GetMainRenderFrameHost`. Furthermore the root of the + // `FrameTree` is now associated to the foreground + // `RenderWidgetHostView*`. Due to this `NodesIncludingInnerTreeNodes` + // does not find the children nodes associated with the BFCache entry. + // + // Instead we build a `FrameTree::NodeRange` that starts with the children + // of `rfh`. This will also be equivalent to + // `should_descend_into_inner_trees=true`. Thus finding all the compositor + // surfaces in the BFCache. + FrameTree::NodeRange node_range = FrameTree::SubtreeAndInnerTreeNodes( + rfh, + /*include_delegate_nodes_for_inner_frame_trees=*/true); + CollectSurfaceIdsForEvictionForFrameTreeNodeRange(node_range, ids); + } } return ids;
diff --git a/content/browser/tracing/background_tracing_manager_browsertest.cc b/content/browser/tracing/background_tracing_manager_browsertest.cc index 5c17b4d..aaee072 100644 --- a/content/browser/tracing/background_tracing_manager_browsertest.cc +++ b/content/browser/tracing/background_tracing_manager_browsertest.cc
@@ -661,8 +661,14 @@ } // This tests that browser metadata gets included in the trace. +// TODO(crbug.com/1413115): Re-enable this test on TSAN builds. +#if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER) +#define MAYBE_TraceMetadataInTrace DISABLED_TraceMetadataInTrace +#else +#define MAYBE_TraceMetadataInTrace TraceMetadataInTrace +#endif IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest, - TraceMetadataInTrace) { + MAYBE_TraceMetadataInTrace) { TestBackgroundTracingHelper background_tracing_helper; TestTraceReceiverHelper trace_receiver_helper;
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc index 3459f3a9..d2bd22ce 100644 --- a/content/browser/utility_process_host.cc +++ b/content/browser/utility_process_host.cc
@@ -362,6 +362,10 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) switches::kEnableResourcesFileSharing, #endif +#if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) + switches::kChromeOSVideoDecoderTaskRunner, + switches::kHardwareVideoDecodeFrameRate, +#endif }; cmd_line->CopySwitchesFrom(browser_command_line, kSwitchNames, std::size(kSwitchNames));
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index d645d913..bd4a6817 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -2886,16 +2886,16 @@ if (GetController().GetVisibleEntry() && GetController().GetVisibleEntry()->GetIsOverridingUserAgent()) { - bool is_request_desktop_site = false; #if BUILDFLAG(IS_ANDROID) // Only ignore viewport meta tag when Request Desktop Site is used, but not // in other situations where embedder changes to arbitrary mobile UA string. - is_request_desktop_site = + bool is_request_desktop_site = renderer_preferences_.user_agent_override.ua_metadata_override && !renderer_preferences_.user_agent_override.ua_metadata_override->mobile; -#endif - prefs.viewport_meta_enabled = !is_request_desktop_site; +#else + prefs.viewport_meta_enabled = false; +#endif } prefs.spatial_navigation_enabled =
diff --git a/content/browser/webid/fake_identity_request_dialog_controller.cc b/content/browser/webid/fake_identity_request_dialog_controller.cc index f7766d6..8c8df8f5 100644 --- a/content/browser/webid/fake_identity_request_dialog_controller.cc +++ b/content/browser/webid/fake_identity_request_dialog_controller.cc
@@ -63,4 +63,13 @@ return title_; } +void FakeIdentityRequestDialogController::ShowPopUpWindow( + const GURL& url, + TokenCallback on_resolve, + DismissCallback dismiss_callback) { + // Pretends that the url is loaded and calls the + // IdentityProvider.resolve() method with the fake token below. + std::move(on_resolve).Run("--fake-token-from-pop-up-window--"); +} + } // namespace content
diff --git a/content/browser/webid/fake_identity_request_dialog_controller.h b/content/browser/webid/fake_identity_request_dialog_controller.h index dde6e47..b1e6f9d 100644 --- a/content/browser/webid/fake_identity_request_dialog_controller.h +++ b/content/browser/webid/fake_identity_request_dialog_controller.h
@@ -34,6 +34,10 @@ std::string GetTitle() const override; + void ShowPopUpWindow(const GURL& url, + TokenCallback on_resolve, + DismissCallback dismiss_callback) override; + private: absl::optional<std::string> selected_account_; std::string title_;
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index b2af3620..8d518b1 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -105,11 +105,15 @@ // parameters in the FedCM spec. // // [1] https://openid.net/specs/openid-connect-core-1_0.html#ScopeClaims - query += "&scope=" + base::EscapeUrlEncodedData( - base::JoinString(scope, " "), /*use_plus=*/true); - query += "&response_type=" + - base::EscapeUrlEncodedData(base::JoinString(responseType, " "), - /*use_plus=*/true); + if (!scope.empty()) { + query += "&scope=" + base::EscapeUrlEncodedData( + base::JoinString(scope, " "), /*use_plus=*/true); + } + if (!responseType.empty()) { + query += "&response_type=" + + base::EscapeUrlEncodedData(base::JoinString(responseType, " "), + /*use_plus=*/true); + } for (const auto& pair : params) { // TODO(crbug.com/1429083): Should we use a prefix with these custom // parameters so that they don't collide with the standard ones? @@ -1326,6 +1330,9 @@ idp_info.provider->params), base::BindOnce(&FederatedAuthRequestImpl::OnTokenResponseReceived, weak_ptr_factory_.GetWeakPtr(), + idp_info.provider->Clone()), + base::BindOnce(&FederatedAuthRequestImpl::OnContinueOnResponseReceived, + weak_ptr_factory_.GetWeakPtr(), idp_info.provider->Clone())); } @@ -1374,6 +1381,28 @@ /*should_delay_callback=*/false); } +void FederatedAuthRequestImpl::OnContinueOnResponseReceived( + IdentityProviderConfigPtr idp, + IdpNetworkRequestManager::FetchStatus status, + const GURL& continue_on) { + if (!IsFedCmAuthzEnabled()) { + CompleteRequestWithError( + FederatedAuthRequestResult::kErrorFetchingIdTokenInvalidResponse, + TokenStatus::kIdTokenInvalidResponse, + /*should_delay_callback=*/true); + return; + } + + // TODO(crbug.com/1429083): record the appropriate metrics. + request_dialog_controller_->ShowPopUpWindow( + std::move(continue_on), + base::BindOnce(&FederatedAuthRequestImpl::CompleteTokenRequest, + weak_ptr_factory_.GetWeakPtr(), std::move(idp), + std::move(status)), + base::BindOnce(&FederatedAuthRequestImpl::OnDialogDismissed, + weak_ptr_factory_.GetWeakPtr())); +} + void FederatedAuthRequestImpl::OnTokenResponseReceived( IdentityProviderConfigPtr idp, IdpNetworkRequestManager::FetchStatus status,
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index 2e57bb3..f52676f7 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -218,6 +218,10 @@ void OnTokenResponseReceived(blink::mojom::IdentityProviderConfigPtr idp, IdpNetworkRequestManager::FetchStatus status, const std::string& token); + void OnContinueOnResponseReceived( + blink::mojom::IdentityProviderConfigPtr idp, + IdpNetworkRequestManager::FetchStatus status, + const GURL& url); void DispatchOneLogout(); void OnLogoutCompleted();
diff --git a/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc b/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc index 258fe584..6a0da3ae 100644 --- a/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc
@@ -107,7 +107,8 @@ void SendTokenRequest(const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) override { + TokenRequestCallback callback, + ContinueOnCallback continue_on) override { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), kFetchStatusSuccess, kToken));
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index 7e92e30..d5f5a33 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -400,7 +400,8 @@ void SendTokenRequest(const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) override { + TokenRequestCallback callback, + ContinueOnCallback on_continue) override { ++num_fetched_[FetchedEndpoint::TOKEN]; std::string delivered_token = @@ -461,13 +462,15 @@ void SendTokenRequest(const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) override { + TokenRequestCallback callback, + ContinueOnCallback on_continue) override { if (expected_selected_account_id_) EXPECT_EQ(expected_selected_account_id_, account); if (expected_url_encoded_post_data_) EXPECT_EQ(expected_url_encoded_post_data_, url_encoded_post_data); TestIdpNetworkRequestManager::SendTokenRequest( - token_url, account, url_encoded_post_data, std::move(callback)); + token_url, account, url_encoded_post_data, std::move(callback), + std::move(on_continue)); } private:
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc index 337b855..ac9ea7f 100644 --- a/content/browser/webid/idp_network_request_manager.cc +++ b/content/browser/webid/idp_network_request_manager.cc
@@ -85,7 +85,12 @@ constexpr char kIdpBrandingIconUrl[] = "url"; constexpr char kIdpBrandingIconSize[] = "size"; +// The id assertion endpoint contains a token result. constexpr char kTokenKey[] = "token"; +// The id assertion endpoint contains a URL, which indicates that +// the serve wants to direct the user to continue on a pop-up +// window before it provides a token result. +constexpr char kContinueOnKey[] = "continue_on"; // Body content types. constexpr char kUrlEncodedContentType[] = "application/x-www-form-urlencoded"; @@ -502,6 +507,7 @@ void OnTokenRequestParsed( IdpNetworkRequestManager::TokenRequestCallback callback, + IdpNetworkRequestManager::ContinueOnCallback continue_on_callback, FetchStatus fetch_status, data_decoder::DataDecoder::ValueOrError result) { if (fetch_status.parse_status != ParseStatus::kSuccess) { @@ -511,15 +517,30 @@ const base::Value::Dict& response = result->GetDict(); const std::string* token = response.FindString(kTokenKey); + const std::string* continue_on = response.FindString(kContinueOnKey); - if (!token) { - std::move(callback).Run( - {ParseStatus::kInvalidResponseError, fetch_status.response_code}, - std::string()); + if (token) { + std::move(callback).Run({ParseStatus::kSuccess, fetch_status.response_code}, + *token); return; } - std::move(callback).Run({ParseStatus::kSuccess, fetch_status.response_code}, - *token); + + if (continue_on) { + GURL url(*continue_on); + // TODO(crbug.com/1429083): support relative urls. + // TODO(crbug.com/1429083): check that the continue_on url is + // same-origin with the idp origin. + if (url.is_valid()) { + std::move(continue_on_callback) + .Run({ParseStatus::kSuccess, fetch_status.response_code}, + std::move(url)); + return; + } + } + + std::move(callback).Run( + {ParseStatus::kInvalidResponseError, fetch_status.response_code}, + std::string()); } void OnLogoutCompleted(IdpNetworkRequestManager::LogoutCallback callback, @@ -651,13 +672,15 @@ const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) { + TokenRequestCallback callback, + ContinueOnCallback continue_on) { std::unique_ptr<network::ResourceRequest> resource_request = CreateCredentialedResourceRequest(token_url, /* send_origin= */ true); DownloadJsonAndParse( std::move(resource_request), url_encoded_post_data, - base::BindOnce(&OnTokenRequestParsed, std::move(callback)), + base::BindOnce(&OnTokenRequestParsed, std::move(callback), + std::move(continue_on)), maxResponseSizeInKiB * 1024); }
diff --git a/content/browser/webid/idp_network_request_manager.h b/content/browser/webid/idp_network_request_manager.h index 07239ff..247be69c7 100644 --- a/content/browser/webid/idp_network_request_manager.h +++ b/content/browser/webid/idp_network_request_manager.h
@@ -141,6 +141,7 @@ data_decoder::DataDecoder::ValueOrError)>; using TokenRequestCallback = base::OnceCallback<void(FetchStatus, const std::string&)>; + using ContinueOnCallback = base::OnceCallback<void(FetchStatus, const GURL&)>; static std::unique_ptr<IdpNetworkRequestManager> Create( RenderFrameHostImpl* host); @@ -182,7 +183,8 @@ virtual void SendTokenRequest(const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback); + TokenRequestCallback callback, + ContinueOnCallback continue_on); // Sends metrics to metrics endpoint after a token was successfully generated. virtual void SendSuccessfulTokenRequestMetrics(
diff --git a/content/browser/webid/idp_network_request_manager_unittest.cc b/content/browser/webid/idp_network_request_manager_unittest.cc index 90d832c..06f7c8e 100644 --- a/content/browser/webid/idp_network_request_manager_unittest.cc +++ b/content/browser/webid/idp_network_request_manager_unittest.cc
@@ -221,9 +221,12 @@ run_loop.Quit(); }); + auto on_continue = + base::BindLambdaForTesting([&](FetchStatus status, const GURL& url) {}); + std::unique_ptr<IdpNetworkRequestManager> manager = CreateTestManager(); manager->SendTokenRequest(token_endpoint, account, request, - std::move(callback)); + std::move(callback), std::move(on_continue)); run_loop.Run(); return {fetch_status, token}; } @@ -1153,6 +1156,32 @@ EXPECT_EQ(net::HTTP_OK, fetch_status.response_code); } +TEST_F(IdpNetworkRequestManagerTest, FetchingTokenLeadsToAContinuationUrl) { + net::HttpStatusCode http_status = net::HTTP_OK; + const std::string& mime_type = "application/json"; + + const char response[] = + R"({"continue_on": "https://idp.example/continuation"})"; + GURL token_endpoint(kTestTokenEndpoint); + AddResponse(token_endpoint, http_status, mime_type, response); + + base::RunLoop run_loop; + auto callback = base::BindLambdaForTesting( + [&](FetchStatus status, const std::string& token_response) {}); + + auto on_continue = + base::BindLambdaForTesting([&](FetchStatus status, const GURL& url) { + // Checks that we got a continuation url event back. + EXPECT_EQ("https://idp.example/continuation", url.spec()); + run_loop.Quit(); + }); + + std::unique_ptr<IdpNetworkRequestManager> manager = CreateTestManager(); + manager->SendTokenRequest(token_endpoint, "account", "request", + std::move(callback), std::move(on_continue)); + run_loop.Run(); +} + } // namespace } // namespace content
diff --git a/content/browser/webid/test/delegated_idp_network_request_manager.cc b/content/browser/webid/test/delegated_idp_network_request_manager.cc index 46fcc2f..10ed181 100644 --- a/content/browser/webid/test/delegated_idp_network_request_manager.cc +++ b/content/browser/webid/test/delegated_idp_network_request_manager.cc
@@ -48,9 +48,10 @@ const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) { + TokenRequestCallback callback, + ContinueOnCallback continue_on) { delegate_->SendTokenRequest(token_url, account, url_encoded_post_data, - std::move(callback)); + std::move(callback), std::move(continue_on)); } void DelegatedIdpNetworkRequestManager::SendSuccessfulTokenRequestMetrics(
diff --git a/content/browser/webid/test/delegated_idp_network_request_manager.h b/content/browser/webid/test/delegated_idp_network_request_manager.h index b56f594..09c4b5f 100644 --- a/content/browser/webid/test/delegated_idp_network_request_manager.h +++ b/content/browser/webid/test/delegated_idp_network_request_manager.h
@@ -39,7 +39,8 @@ void SendTokenRequest(const GURL& token_url, const std::string& account, const std::string& url_encoded_post_data, - TokenRequestCallback callback) override; + TokenRequestCallback callback, + ContinueOnCallback continue_on_callback) override; void SendSuccessfulTokenRequestMetrics( const GURL& metrics_endpoint_url, base::TimeDelta api_call_to_show_dialog_time,
diff --git a/content/browser/webid/test/mock_idp_network_request_manager.h b/content/browser/webid/test/mock_idp_network_request_manager.h index 808bebb..2722959 100644 --- a/content/browser/webid/test/mock_idp_network_request_manager.h +++ b/content/browser/webid/test/mock_idp_network_request_manager.h
@@ -28,11 +28,12 @@ FetchClientMetadataCallback)); MOCK_METHOD3(SendAccountsRequest, void(const GURL&, const std::string&, AccountsRequestCallback)); - MOCK_METHOD4(SendTokenRequest, + MOCK_METHOD5(SendTokenRequest, void(const GURL&, const std::string&, const std::string&, - TokenRequestCallback)); + TokenRequestCallback, + ContinueOnCallback)); MOCK_METHOD5(SendSuccessfulTokenRequestMetrics, void(const GURL&, base::TimeDelta,
diff --git a/content/browser/webid/webid_browsertest.cc b/content/browser/webid/webid_browsertest.cc index 96a44ee..7a7f167 100644 --- a/content/browser/webid/webid_browsertest.cc +++ b/content/browser/webid/webid_browsertest.cc
@@ -547,8 +547,8 @@ EXPECT_EQ("test-mdoc", EvalJs(shell(), script)); } -// Verify a standard login flow with IdP sign-in page. -IN_PROC_BROWSER_TEST_F(WebIdAuthzBrowserTest, PopUpWindowAuthzFlow) { +// Verify that the Authz parameters are passed to the id assertion endpoint. +IN_PROC_BROWSER_TEST_F(WebIdAuthzBrowserTest, Authz_noPopUpWindow) { IdpTestServer::ConfigDetails config_details = BuildValidConfigDetails(); // Points the id assertion endpoint to a servlet. @@ -568,7 +568,7 @@ content += "disclosure_text_shown=false&"; // Asserts that the scope, response_type and params parameters // were passed correctly to the id assertion endpoint. - content += "scope=name+email+photo+calendar.readonly&"; + content += "scope=name+email+picture&"; content += "response_type=id_token+code&"; content += "%3F+gets+://=%26+escaped+!&"; content += "foo=bar&"; @@ -579,6 +579,8 @@ auto response = std::make_unique<BasicHttpResponse>(); response->set_code(net::HTTP_OK); response->set_content_type("text/json"); + // Standard scopes were used, so no extra permission needed. + // Return a token immediately. response->set_content(R"({"token": "[request lgtm!]"})"); return response; }); @@ -597,8 +599,7 @@ scope: [ 'name', 'email', - 'photo', - 'calendar.readonly' + 'picture', ], responseType: [ 'id_token', @@ -619,4 +620,61 @@ EXPECT_EQ(std::string("[request lgtm!]"), EvalJs(shell(), script)); } +// Verify that the id assertion endpoint can request a pop-up window. +IN_PROC_BROWSER_TEST_F(WebIdAuthzBrowserTest, Authz_openPopUpWindow) { + IdpTestServer::ConfigDetails config_details = BuildValidConfigDetails(); + + // Points the id assertion endpoint to a servlet. + config_details.id_assertion_endpoint_url = "/authz/id_assertion_endpoint.php"; + + // Add a servlet to serve a response for the id assertoin endpoint. + config_details.servlets["/authz/id_assertion_endpoint.php"] = + base::BindRepeating( + [](const HttpRequest& request) -> std::unique_ptr<HttpResponse> { + std::string content; + content += "client_id=client_id_1&"; + content += "nonce=12345&"; + content += "account_id=not_real_account&"; + content += "disclosure_text_shown=false&"; + content += "scope=calendar.readonly"; + + EXPECT_EQ(request.content, content); + + auto response = std::make_unique<BasicHttpResponse>(); + response->set_code(net::HTTP_OK); + response->set_content_type("text/json"); + // scope=calendar.readonly was requested, so need to + // return a continuation url instead of a token. + response->set_content( + R"({"continue_on": "https://idp.example/continue.php"})"); + return response; + }); + + idp_server()->SetConfigResponseDetails(config_details); + + std::string script = R"( + (async () => { + var x = (await navigator.credentials.get({ + identity: { + providers: [{ + configURL: ')" + + BaseIdpUrl() + R"(', + clientId: 'client_id_1', + nonce: '12345', + scope: [ + 'calendar.readonly' + ], + }] + } + })); + return x.token; + }) () + )"; + + // Assert that a fake token was returned from the pop-up window, + // as opposed to directly from the id assertion endpoint. + EXPECT_EQ(std::string("--fake-token-from-pop-up-window--"), + EvalJs(shell(), script)); +} + } // namespace content
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java index 103e8b722..2f242e3 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityHistogramRecorder.java
@@ -22,6 +22,9 @@ public static final String PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE = "Accessibility.Android.OnDemand.PercentageDropped.Complete"; @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + public static final String PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS = + "Accessibility.Android.OnDemand.PercentageDropped.FormControls"; + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) public static final String PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC = "Accessibility.Android.OnDemand.PercentageDropped.Basic"; @@ -36,6 +39,9 @@ public static final String ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE = "Accessibility.Android.OnDemand.OneHundredPercentEventsDropped.Complete"; @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) + public static final String ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS = + "Accessibility.Android.OnDemand.OneHundredPercentEventsDropped.FormControls"; + @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) public static final String ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC = "Accessibility.Android.OnDemand.OneHundredPercentEventsDropped.Basic"; @@ -120,11 +126,13 @@ */ public void recordEventsHistograms() { // To investigate whether adding more AXModes could be beneficial, track separate - // stats when both the ComputeAXMode and OnDemand features are enabled. - boolean isComputeAXModeEnabled = - ContentFeatureList.isEnabled(ContentFeatureList.COMPUTE_AX_MODE); + // stats when both the AccessibilityAXModes and OnDemand features are enabled. + boolean isAccessibilityAXModesEnabled = + ContentFeatureList.isEnabled(ContentFeatureList.ACCESSIBILITY_AX_MODES); + // There are only 2 AXModes, kAXModeComplete is used when a screenreader is active. boolean isAXModeComplete = AccessibilityState.isScreenReaderEnabled(); + boolean isAXModeFormControls = AccessibilityState.isOnlyPasswordManagersEnabled(); // If we did not enqueue any events, we can ignore the data as a trivial case. if (mTotalEnqueuedEvents > 0) { @@ -133,9 +141,11 @@ RecordHistogram.recordPercentageHistogram( PERCENTAGE_DROPPED_HISTOGRAM, 100 - percentSent); // Log the percentage dropped per AXMode as well. - if (isComputeAXModeEnabled) { + if (isAccessibilityAXModesEnabled) { RecordHistogram.recordPercentageHistogram(isAXModeComplete ? PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE + : isAXModeFormControls + ? PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS : PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC, 100 - percentSent); } @@ -155,9 +165,11 @@ EVENTS_DROPPED_HISTOGRAM_BUCKET_COUNT); // Log the 100% events count per AXMode as well. - if (isComputeAXModeEnabled) { + if (isAccessibilityAXModesEnabled) { RecordHistogram.recordCustomCountHistogram(isAXModeComplete ? ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE + : isAXModeFormControls + ? ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS : ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC, mTotalEnqueuedEvents - mTotalDispatchedEvents, EVENTS_DROPPED_HISTOGRAM_MIN_BUCKET,
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index cbb7138..7f08783 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -412,7 +412,8 @@ // generic Exception. (refer to crbug.com/1186406 or AutofillManagerWrapper ctor). try { AutofillManager autofillManager = mContext.getSystemService(AutofillManager.class); - if (autofillManager != null && autofillManager.isEnabled()) { + if (autofillManager != null && autofillManager.isEnabled() + && autofillManager.hasEnabledAutofillServices()) { // Native accessibility is usually initialized when getAccessibilityNodeProvider // is called, but the Autofill compatibility bridge only calls that method after // it has received the first accessibility events. To solve the chicken-and-egg
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java index b40304c..d740cb1 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/ContentFeatureList.java
@@ -66,13 +66,13 @@ // Alphabetical: public static final String ACCESSIBILITY_PAGE_ZOOM = "AccessibilityPageZoom"; + public static final String ACCESSIBILITY_AX_MODES = "AccessibilityAXModes"; + public static final String AUTO_DISABLE_ACCESSIBILITY_V2 = "AutoDisableAccessibilityV2"; public static final String BACKGROUND_MEDIA_RENDERER_HAS_MODERATE_BINDING = "BackgroundMediaRendererHasModerateBinding"; - public static final String COMPUTE_AX_MODE = "ComputeAXMode"; - public static final String ON_DEMAND_ACCESSIBILITY_EVENTS = "OnDemandAccessibilityEvents"; public static final String OPTIMIZE_IMM_HIDE_CALLS = "OptimizeImmHideCalls";
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java index 8645249..436e9b47 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityContentShellActivityTestRule.java
@@ -98,6 +98,7 @@ public void setupTestFramework() { mWcax = getWebContentsAccessibility(); mWcax.setAccessibilityEnabledForTesting(); + AccessibilityState.setAccessibilityEnabledForTesting(true); AccessibilityState.setEventTypeMaskForTesting(EVENT_TYPE_MASK_ALL); mNodeProvider = getAccessibilityNodeProvider();
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java index d1b4100..0c8220b 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -55,9 +55,11 @@ import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.ONE_HUNDRED_PERCENT_HISTOGRAM; import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC; import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE; +import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS; import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.PERCENTAGE_DROPPED_HISTOGRAM; import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC; import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE; +import static org.chromium.content.browser.accessibility.AccessibilityHistogramRecorder.PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS; import static org.chromium.content.browser.accessibility.AccessibilityNodeInfoBuilder.EXTRAS_DATA_REQUEST_IMAGE_DATA_KEY; import static org.chromium.content.browser.accessibility.AccessibilityNodeInfoBuilder.EXTRAS_KEY_CHROME_ROLE; import static org.chromium.content.browser.accessibility.AccessibilityNodeInfoBuilder.EXTRAS_KEY_IMAGE_DATA; @@ -154,9 +156,9 @@ "Expected focus to be on a different node than it is."; // ContentFeatureList maps used for various tests. - private static final Map<String, Boolean> ON_DEMAND_ON_COMPUTE_ON = + private static final Map<String, Boolean> ON_DEMAND_ON_AXMODES_ON = Map.of(ContentFeatureList.ON_DEMAND_ACCESSIBILITY_EVENTS, true, - ContentFeatureList.COMPUTE_AX_MODE, true); + ContentFeatureList.ACCESSIBILITY_AX_MODES, true); // Constant values for unit tests private static final int UNSUPPRESSED_EXPECTED_COUNT = 15; @@ -378,7 +380,7 @@ } /** - * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode complete. + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Complete. */ @Test @SmallTest @@ -388,10 +390,12 @@ + "<p>This is a test 2</p>\n" + "<p>This is a test 3</p>"); - // Set the relevant features and screen reader state. - FeatureList.setTestFeatures(ON_DEMAND_ON_COMPUTE_ON); - TestThreadUtils.runOnUiThreadBlocking( - () -> AccessibilityState.setScreenReaderModeForTesting(true)); + // Set the relevant features and accessibility state. + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); + TestThreadUtils.runOnUiThreadBlocking(() -> { + AccessibilityState.setScreenReaderEnabledForTesting(true); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(false); + }); performHistogramActions(); @@ -403,6 +407,9 @@ PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, RecordHistogram.getHistogramTotalCountForTesting(EVENTS_DROPPED_HISTOGRAM)); @@ -413,11 +420,61 @@ ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC)); } /** - * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode basic. + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Form Controls. + */ + @Test + @SmallTest + public void testUMAHistograms_OnDemand_AXModeFormControls() throws Throwable { + // Build a simple web page with a few nodes to traverse. + setupTestWithHTML("<p>This is a test 1</p>\n" + + "<p>This is a test 2</p>\n" + + "<p>This is a test 3</p>"); + + // Set the relevant features and accessibility state. + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); + TestThreadUtils.runOnUiThreadBlocking(() -> { + AccessibilityState.setScreenReaderEnabledForTesting(false); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(true); + }); + + performHistogramActions(); + + // Verify results were recorded in histograms. + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting(PERCENTAGE_DROPPED_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting(EVENTS_DROPPED_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting(ONE_HUNDRED_PERCENT_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC)); + } + + /** + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Basic. */ @Test @SmallTest @@ -428,9 +485,11 @@ + "<p>This is a test 3</p>"); // Set the relevant features and screen reader state. - FeatureList.setTestFeatures(ON_DEMAND_ON_COMPUTE_ON); - TestThreadUtils.runOnUiThreadBlocking( - () -> AccessibilityState.setScreenReaderModeForTesting(false)); + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); + TestThreadUtils.runOnUiThreadBlocking(() -> { + AccessibilityState.setScreenReaderEnabledForTesting(false); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(false); + }); performHistogramActions(); @@ -440,6 +499,9 @@ Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); @@ -452,11 +514,14 @@ ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC)); } /** - * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode complete + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Complete * when 100% of events are dropped. */ @Test @@ -469,10 +534,11 @@ + "<p>This is a test 3</p>"); // Set the relevant features and screen reader state, set event type masks to empty. - FeatureList.setTestFeatures(ON_DEMAND_ON_COMPUTE_ON); + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); TestThreadUtils.runOnUiThreadBlocking(() -> { AccessibilityState.setEventTypeMaskForTesting(EVENT_TYPE_MASK_NONE); - AccessibilityState.setScreenReaderModeForTesting(true); + AccessibilityState.setScreenReaderEnabledForTesting(true); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(false); }); performHistogramActions(); @@ -485,6 +551,9 @@ PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, RecordHistogram.getHistogramTotalCountForTesting(EVENTS_DROPPED_HISTOGRAM)); @@ -495,11 +564,63 @@ ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC)); } /** - * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode basic + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Form Controls + * when 100% of events are dropped. + */ + @Test + @SmallTest + public void testUMAHistograms_OnDemand_AXModeFormControls_100Percent() throws Throwable { + // Build a simple web page with a few nodes to traverse. + setupTestWithHTML("<p>This is a test 1</p>\n" + + "<p>This is a test 2</p>\n" + + "<p>This is a test 3</p>"); + + // Set the relevant features and screen reader state, set event type masks to empty. + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); + TestThreadUtils.runOnUiThreadBlocking(() -> { + AccessibilityState.setEventTypeMaskForTesting(EVENT_TYPE_MASK_NONE); + AccessibilityState.setScreenReaderEnabledForTesting(false); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(true); + }); + + performHistogramActions(); + + // Verify results were recorded in histograms. + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting(PERCENTAGE_DROPPED_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting(EVENTS_DROPPED_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting(ONE_HUNDRED_PERCENT_HISTOGRAM)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC)); + } + + /** + * Test that UMA histograms are recorded for the OnDemand AT feature and AX Mode Basic * when 100% of events are dropped. */ @Test @@ -511,10 +632,11 @@ + "<p>This is a test 3</p>"); // Set the relevant features and screen reader state, set event type masks to empty. - FeatureList.setTestFeatures(ON_DEMAND_ON_COMPUTE_ON); + FeatureList.setTestFeatures(ON_DEMAND_ON_AXMODES_ON); TestThreadUtils.runOnUiThreadBlocking(() -> { AccessibilityState.setEventTypeMaskForTesting(EVENT_TYPE_MASK_NONE); - AccessibilityState.setScreenReaderModeForTesting(false); + AccessibilityState.setScreenReaderEnabledForTesting(false); + AccessibilityState.setOnlyPasswordManagersEnabledForTesting(false); }); performHistogramActions(); @@ -525,6 +647,9 @@ Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_FORM_CONTROLS)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, RecordHistogram.getHistogramTotalCountForTesting( PERCENTAGE_DROPPED_HISTOGRAM_AXMODE_BASIC)); @@ -535,6 +660,9 @@ Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, RecordHistogram.getHistogramTotalCountForTesting( ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_COMPLETE)); + Assert.assertEquals(UMA_HISTOGRAM_ERROR, 0, + RecordHistogram.getHistogramTotalCountForTesting( + ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_FORM_CONTROLS)); Assert.assertEquals(UMA_HISTOGRAM_ERROR, 1, RecordHistogram.getHistogramTotalCountForTesting( ONE_HUNDRED_PERCENT_HISTOGRAM_AXMODE_BASIC));
diff --git a/content/public/browser/identity_request_dialog_controller.cc b/content/public/browser/identity_request_dialog_controller.cc index b5c5dee..d1afc7e 100644 --- a/content/public/browser/identity_request_dialog_controller.cc +++ b/content/public/browser/identity_request_dialog_controller.cc
@@ -92,4 +92,13 @@ } } +void IdentityRequestDialogController::ShowPopUpWindow( + const GURL& url, + TokenCallback on_resolve, + DismissCallback dismiss_callback) { + if (!is_interception_enabled_) { + std::move(dismiss_callback).Run(DismissReason::kOther); + } +} + } // namespace content
diff --git a/content/public/browser/identity_request_dialog_controller.h b/content/public/browser/identity_request_dialog_controller.h index 8a77a34..b18f739b 100644 --- a/content/public/browser/identity_request_dialog_controller.h +++ b/content/public/browser/identity_request_dialog_controller.h
@@ -80,6 +80,8 @@ base::OnceCallback<void(const GURL& idp_config_url, const std::string& /*account_id*/, bool /*is_sign_in*/)>; + using TokenCallback = base::OnceCallback<void(const std::string& /*token*/)>; + using DismissCallback = base::OnceCallback<void(DismissReason dismiss_reason)>; @@ -132,6 +134,11 @@ // Show dialog notifying user that IdP sign-in failed. virtual void ShowIdpSigninFailureDialog(base::OnceClosure dismiss_callback); + // Show a pop-up window that the IdP controls. + virtual void ShowPopUpWindow(const GURL& url, + TokenCallback on_resolve, + DismissCallback dismiss_callback); + protected: bool is_interception_enabled_{false}; };
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index c56013285..909157d 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -159,7 +159,7 @@ mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker> broker_remote) : agent_group_scheduler_( blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()), + .CreateWebAgentGroupScheduler()), render_thread_(render_thread), // `receiver_` will be bound by `OnAssociatedInterfaceRequest()`. receiver_(this) { @@ -193,7 +193,7 @@ mojo::PendingRemote<blink::mojom::BrowserInterfaceBroker> broker_remote) : agent_group_scheduler_( blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()), + .CreateWebAgentGroupScheduler()), render_thread_(render_thread), receiver_(this, std::move(receiver),
diff --git a/content/services/auction_worklet/bidder_worklet.cc b/content/services/auction_worklet/bidder_worklet.cc index b7ecabe..4f2ecdd 100644 --- a/content/services/auction_worklet/bidder_worklet.cc +++ b/content/services/auction_worklet/bidder_worklet.cc
@@ -116,6 +116,26 @@ return true; } +bool HasKAnonFailureComponent( + const auction_worklet::mojom::PrivateAggregationRequestPtr& request) { + if (request->contribution->is_histogram_contribution()) { + return false; + } + const auction_worklet::mojom::AggregatableReportForEventContributionPtr& + event_contribution = request->contribution->get_for_event_contribution(); + if (event_contribution->bucket->is_signal_bucket() && + event_contribution->bucket->get_signal_bucket()->base_value == + auction_worklet::mojom::BaseValue::kBidRejectReason) { + return true; + } + if (event_contribution->value->is_signal_value() && + event_contribution->value->get_signal_value()->base_value == + auction_worklet::mojom::BaseValue::kBidRejectReason) { + return true; + } + return false; +} + } // namespace BidderWorklet::BidderWorklet( @@ -744,15 +764,24 @@ } if (kanon_mode == mojom::KAnonymityBidMode::kEnforce) { + PrivateAggregationRequests non_kanon_pa_requests = + std::move(result->pa_requests); + base::EraseIf( + non_kanon_pa_requests, + [](const auction_worklet::mojom::PrivateAggregationRequestPtr& + request) { return !HasKAnonFailureComponent(request); }); + // We are enforcing the k-anonymity, so the restricted result is the one // to use for reporting, etc., and needs to succeed. if (!restricted_result.has_value()) { PostErrorBidCallbackToUserThread( std::move(callback), - /*bidding_latency=*/base::TimeTicks::Now() - bidding_start); + /*bidding_latency=*/base::TimeTicks::Now() - bidding_start, + std::move(non_kanon_pa_requests)); return; } result = std::move(restricted_result); + result->non_kanon_pa_requests = std::move(non_kanon_pa_requests); } else { DCHECK_EQ(kanon_mode, mojom::KAnonymityBidMode::kSimulate); // Here, `result` is already what we want for reporting, etc., so @@ -770,6 +799,7 @@ std::move(result->set_priority), std::move(result->update_priority_signals_overrides), std::move(result->pa_requests), + std::move(result->non_kanon_pa_requests), /*bidding_latency=*/base::TimeTicks::Now() - bidding_start, std::move(result->error_msgs))); } @@ -1221,6 +1251,7 @@ void BidderWorklet::V8State::PostErrorBidCallbackToUserThread( GenerateBidCallbackInternal callback, base::TimeDelta bidding_latency, + PrivateAggregationRequests non_kanon_pa_requests, std::vector<std::string> error_msgs) { DCHECK_CALLED_ON_VALID_SEQUENCE(v8_sequence_checker_); user_thread_->PostTask( @@ -1235,8 +1266,8 @@ /*update_priority_signals_overrides=*/ base::flat_map<std::string, mojom::PrioritySignalsDoublePtr>(), /*pa_requests=*/ - PrivateAggregationRequests(), bidding_latency, - std::move(error_msgs))); + PrivateAggregationRequests(), std::move(non_kanon_pa_requests), + bidding_latency, std::move(error_msgs))); } void BidderWorklet::ResumeIfPaused() { @@ -1676,6 +1707,7 @@ base::flat_map<std::string, mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, std::vector<std::string> error_msgs) { DCHECK_CALLED_ON_VALID_SEQUENCE(user_sequence_checker_); @@ -1692,7 +1724,7 @@ bidding_signals_data_version.has_value(), debug_loss_report_url, debug_win_report_url, set_priority.value_or(0), set_priority.has_value(), std::move(update_priority_signals_overrides), std::move(pa_requests), - bidding_latency, error_msgs); + std::move(non_kanon_pa_requests), bidding_latency, error_msgs); CleanUpBidTaskOnUserThread(task); }
diff --git a/content/services/auction_worklet/bidder_worklet.h b/content/services/auction_worklet/bidder_worklet.h index 91b2e03..44996dc 100644 --- a/content/services/auction_worklet/bidder_worklet.h +++ b/content/services/auction_worklet/bidder_worklet.h
@@ -320,6 +320,7 @@ base::flat_map<std::string, mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, std::vector<std::string> error_msgs)>; using ReportWinCallbackInternal = @@ -364,6 +365,7 @@ base::flat_map<std::string, mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides; PrivateAggregationRequests pa_requests; + PrivateAggregationRequests non_kanon_pa_requests; std::vector<std::string> error_msgs; }; @@ -465,6 +467,8 @@ void PostErrorBidCallbackToUserThread( GenerateBidCallbackInternal callback, base::TimeDelta bidding_latency, + PrivateAggregationRequests non_kanon_pa_requests = + PrivateAggregationRequests(), std::vector<std::string> error_msgs = std::vector<std::string>()); static void PostResumeToUserThread( @@ -574,6 +578,7 @@ base::flat_map<std::string, mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, std::vector<std::string> error_msgs);
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc index c5512af..a592f1a 100644 --- a/content/services/auction_worklet/bidder_worklet_unittest.cc +++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -141,6 +141,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors)>; @@ -190,6 +191,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { ADD_FAILURE() << "OnGenerateBidComplete should not be invoked."; @@ -228,6 +230,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) override { // OnBiddingSignalsReceived() must be called first. @@ -238,7 +241,8 @@ has_data_version, debug_loss_report_url, debug_win_report_url, set_priority, has_set_priority, std::move(update_priority_signals_overrides), - std::move(pa_requests), bidding_latency, errors); + std::move(pa_requests), std::move(non_kanon_pa_requests), + bidding_latency, errors); } private: @@ -368,13 +372,15 @@ const base::flat_map<std::string, absl::optional<double>>& expected_update_priority_signals_overrides = base::flat_map<std::string, absl::optional<double>>(), - PrivateAggregationRequests expected_pa_requests = {}) { + PrivateAggregationRequests expected_pa_requests = {}, + PrivateAggregationRequests expected_non_kanon_pa_requests = {}) { RunGenerateBidWithJavascriptExpectingResult( CreateGenerateBidScript(raw_return_value), std::move(expected_bid), expected_data_version, expected_errors, expected_debug_loss_report_url, expected_debug_win_report_url, expected_set_priority, expected_update_priority_signals_overrides, - std::move(expected_pa_requests)); + std::move(expected_pa_requests), + std::move(expected_non_kanon_pa_requests)); } // Configures `url_loader_factory_` to return a script with the specified @@ -391,7 +397,8 @@ const base::flat_map<std::string, absl::optional<double>>& expected_update_priority_signals_overrides = base::flat_map<std::string, absl::optional<double>>(), - PrivateAggregationRequests expected_pa_requests = {}) { + PrivateAggregationRequests expected_pa_requests = {}, + PrivateAggregationRequests expected_non_kanon_pa_requests = {}) { SCOPED_TRACE(javascript); AddJavascriptResponse(&url_loader_factory_, interest_group_bidding_url_, javascript); @@ -399,7 +406,8 @@ std::move(expected_bid), expected_data_version, expected_errors, expected_debug_loss_report_url, expected_debug_win_report_url, expected_set_priority, expected_update_priority_signals_overrides, - std::move(expected_pa_requests)); + std::move(expected_pa_requests), + std::move(expected_non_kanon_pa_requests)); } // Loads and runs a generateBid() script, expecting the provided result. @@ -418,7 +426,8 @@ const base::flat_map<std::string, absl::optional<double>>& expected_update_priority_signals_overrides = base::flat_map<std::string, absl::optional<double>>(), - PrivateAggregationRequests expected_pa_requests = {}) { + PrivateAggregationRequests expected_pa_requests = {}, + PrivateAggregationRequests expected_non_kanon_pa_requests = {}) { auto bidder_worklet = CreateWorkletAndGenerateBid(); EXPECT_EQ(expected_bid.is_null(), bid_.is_null()); @@ -441,6 +450,7 @@ EXPECT_EQ(expected_debug_loss_report_url, bid_debug_loss_report_url_); EXPECT_EQ(expected_debug_win_report_url, bid_debug_win_report_url_); EXPECT_EQ(expected_pa_requests, pa_requests_); + EXPECT_EQ(expected_non_kanon_pa_requests, non_kanon_pa_requests_); EXPECT_EQ(expected_errors, bid_errors_); EXPECT_EQ(expected_set_priority, set_priority_); EXPECT_EQ(expected_update_priority_signals_overrides, @@ -705,6 +715,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { absl::optional<uint32_t> maybe_data_version; @@ -729,6 +740,7 @@ } pa_requests_ = std::move(pa_requests); + non_kanon_pa_requests_ = std::move(non_kanon_pa_requests); bid_errors_ = errors; load_script_run_loop_->Quit(); } @@ -851,6 +863,7 @@ base::flat_map<std::string, absl::optional<double>> update_priority_signals_overrides_; PrivateAggregationRequests pa_requests_; + PrivateAggregationRequests non_kanon_pa_requests_; std::vector<std::string> bid_errors_; network::TestURLLoaderFactory url_loader_factory_; @@ -2312,6 +2325,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { EXPECT_EQ(bid_value, bid->bid); @@ -2422,6 +2436,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { EXPECT_EQ(base::NumberToString(i), bid->ad); @@ -2540,6 +2555,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { EXPECT_EQ(base::NumberToString(i), bid->ad); @@ -2664,6 +2680,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { EXPECT_EQ(base::NumberToString(i), bid->ad); @@ -2767,6 +2784,7 @@ auction_worklet::mojom::PrioritySignalsDoublePtr> update_priority_signals_overrides, PrivateAggregationRequests pa_requests, + PrivateAggregationRequests non_kanon_pa_requests, base::TimeDelta bidding_latency, const std::vector<std::string>& errors) { EXPECT_EQ(base::NumberToString(i), bid->ad); @@ -6743,8 +6761,72 @@ /*expected_debug_loss_report_url=*/absl::nullopt, /*expected_debug_win_report_url=*/absl::nullopt, /*expected_set_priority=*/absl::nullopt, + /*expected_update_priority_signals_overrides=*/{}, /*expected_pa_requests=*/{}); } + + // Requests where reject reason is specified and k-anonymity enforcement is + // active. + kanon_mode_ = mojom::KAnonymityBidMode::kEnforce; + { + PrivateAggregationRequests expected_non_kanon_pa_requests; + expected_non_kanon_pa_requests.push_back( + mojom::PrivateAggregationRequest::New( + mojom::AggregatableReportContribution::NewForEventContribution( + mojom::AggregatableReportForEventContribution::New( + /*bucket=*/mojom::ForEventSignalBucket::NewSignalBucket( + mojom::SignalBucket::New( + /*baseValue=*/mojom::BaseValue::kWinningBid, + /*scale=*/1.0, + /*offset=*/nullptr)), + /*value=*/ + mojom::ForEventSignalValue::NewSignalValue( + mojom::SignalValue::New( + /*baseValue=*/mojom::BaseValue::kBidRejectReason, + /*scale=*/1.0, + /*offset=*/0)), + /*event_type=*/"reserved.loss")), + blink::mojom::AggregationServiceMode::kDefault, + blink::mojom::DebugModeDetails::New())); + + RunGenerateBidWithJavascriptExpectingResult( + CreateGenerateBidScript( + R"({ad: "ad", bid:1, render:"https://response.test/" })", + /*extra_code=*/R"( + if (interestGroup.ads.length > 0) { + privateAggregation.sendHistogramReport( + {bucket: 18446744073709551616n, value: 1}); + privateAggregation.reportContributionForEvent( + "reserved.win", {bucket: 18446744073709551616n, value: 2}); + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "highest-scoring-other-bid", offset: 0n}, + value: 1, + }); + privateAggregation.reportContributionForEvent("reserved.loss", { + bucket: {baseValue: "winning-bid"}, + value: {baseValue: "bid-reject-reason"}, + }); + } + )"), + /*expected_bid=*/ + mojom::BidderWorkletBid::New( + "\"ad\"", 1, blink::kUnspecifiedAdCurrency, + /*ad_cost=*/absl::nullopt, + blink::AdDescriptor(GURL("https://response.test/")), + /*ad_component_descriptors=*/absl::nullopt, + /*modeling_signals=*/absl::nullopt, base::TimeDelta()), + /*expected_data_version=*/absl::nullopt, + /*expected_errors=*/ + {"https://url.test/ generateBid() bid render URL " + "'https://response.test/' isn't one of the registered creative URLs."}, + /*expected_debug_loss_report_url=*/absl::nullopt, + /*expected_debug_win_report_url=*/absl::nullopt, + /*expected_set_priority=*/absl::nullopt, + /*expected_update_priority_signals_overrides=*/{}, + /*expected_pa_requests=*/{}, + /*expected_non_kanon_pa_requests=*/ + std::move(expected_non_kanon_pa_requests)); + } } TEST_F(BidderWorkletPrivateAggregationEnabledTest, ReportWin) {
diff --git a/content/services/auction_worklet/public/mojom/bidder_worklet.mojom b/content/services/auction_worklet/public/mojom/bidder_worklet.mojom index fa1855b..f9e7edb3 100644 --- a/content/services/auction_worklet/public/mojom/bidder_worklet.mojom +++ b/content/services/auction_worklet/public/mojom/bidder_worklet.mojom
@@ -250,6 +250,7 @@ bool has_set_priority, map<string, PrioritySignalsDouble?> update_priority_signals_overrides, array<PrivateAggregationRequest> pa_requests, + array<PrivateAggregationRequest> non_kanon_pa_requests, mojo_base.mojom.TimeDelta bidding_latency, array<string> errors); };
diff --git a/content/services/auction_worklet/public/mojom/seller_worklet.mojom b/content/services/auction_worklet/public/mojom/seller_worklet.mojom index 19f3b92fc..23b3281 100644 --- a/content/services/auction_worklet/public/mojom/seller_worklet.mojom +++ b/content/services/auction_worklet/public/mojom/seller_worklet.mojom
@@ -65,6 +65,7 @@ kBlockedByPublisher = 5, kLanguageExclusions = 6, kCategoryExclusions = 7, + kBelowKAnonThreshold = 8, }; // Interface for returning ScoreAd results. The advantage of having an interface
diff --git a/content/services/auction_worklet/set_bid_bindings.cc b/content/services/auction_worklet/set_bid_bindings.cc index 0d3b6b8c..cd14f62 100644 --- a/content/services/auction_worklet/set_bid_bindings.cc +++ b/content/services/auction_worklet/set_bid_bindings.cc
@@ -16,6 +16,7 @@ #include "content/services/auction_worklet/auction_v8_helper.h" #include "content/services/auction_worklet/bidder_worklet.h" #include "content/services/auction_worklet/public/mojom/bidder_worklet.mojom.h" +#include "content/services/auction_worklet/public/mojom/private_aggregation_request.mojom.h" #include "gin/converter.h" #include "gin/dictionary.h" #include "third_party/blink/public/common/interest_group/ad_auction_constants.h"
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index ab64f6fb..77c8830 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -322,6 +322,9 @@ crbug.com/1417485 [ android android-nexus-5x passthrough ] conformance/glsl/samplers/glsl-function-texture2dprojlod.html [ Failure ] crbug.com/1417485 [ android android-nexus-5x passthrough ] conformance/reading/read-pixels-test.html [ Failure ] +# VANGLE + debug timeouts on Windows and Linux +crbug.com/1432243 [ debug angle-vulkan passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Skip ] + ############################### # Permanent Slow Expectations # ############################### @@ -333,15 +336,20 @@ # builds, but the validating decoder/debug builds slow them down significantly. # Also slow on Fuchsia smart displays due to their lower specs. crbug.com/1426593 [ no-passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] -crbug.com/1426593 [ debug passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-d3d9 passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-d3d11 passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-metal passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-opengl passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-opengles passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +crbug.com/1426593 [ debug angle-swiftshader passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] crbug.com/1426593 [ passthrough web-engine-shell ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] # Seems to do enough JavaScript work that heartbeats are not reliably sent. +crbug.com/1432580 [ android android-Pixel-2 ] conformance2/misc/uninitialized-test-2.html [ Slow ] crbug.com/1426916 [ chromeos chromeos-board-amd64-generic passthrough ] conformance2/misc/uninitialized-test-2.html [ Slow ] crbug.com/1426916 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/extensions/oes-texture-half-float-linear.html [ Slow ] crbug.com/1426916 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/extensions/webgl-compressed-texture-astc.html [ Slow ] crbug.com/1426916 [ chromeos chromeos-board-amd64-generic no-passthrough ] conformance/reading/read-pixels-test.html [ Slow ] -crbug.com/1426916 [ win angle-swiftshader ] conformance/reading/read-pixels-test.html [ Slow ] # Timeouts on Windows + debug + VANGLE crbug.com/1432294 [ debug angle-vulkan passthrough win ] conformance/glsl/bugs/complex-glsl-does-not-crash.html [ Slow ] @@ -418,6 +426,9 @@ # Win failures # #################### +# Failing even with Slow due to heartbeat +crbug.com/1432255 [ win angle-swiftshader ] conformance/reading/read-pixels-test.html [ Failure ] + # Consistent failures in functions.control_flow.return_in_nested_loop_vertex and functions.control_flow.return_in_nested_loop_fragment # Possible HLSL compiler bug. crbug.com/478572 [ win angle-d3d9 passthrough ] deqp/data/gles2/shaders/functions.html [ Failure ]
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py b/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py index e162bf4a..551fdba 100644 --- a/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py +++ b/content/test/gpu/gpu_tests/webgl_conformance_integration_test_base.py
@@ -279,12 +279,23 @@ self._verified_flags = True url = self.UrlOfStaticFilePath(test_path) self.tab.Navigate(url, script_to_evaluate_on_commit=harness_script) - self.tab.action_runner.EvaluateJavaScript( - 'connectWebsocket("%d")' % self.__class__.websocket_server.server_port, - timeout=self._GetWebsocketJavaScriptTimeout()) - self.__class__.websocket_server.WaitForConnection() + # TODO(crbug.com/1432592): Remove this special casing once the flaky adb + # issues are investigated/resolved. + if self.browser.platform.GetOSName() != 'android': + self.tab.action_runner.EvaluateJavaScript( + 'connectWebsocket("%d")' % + self.__class__.websocket_server.server_port, + timeout=self._GetWebsocketJavaScriptTimeout()) + self.__class__.websocket_server.WaitForConnection() def _HandleMessageLoop(self, test_timeout: float) -> None: + # TODO(crbug.com/1432592): Remove this special casing once the flaky adb + # issues are investigated/resolved. + if self.browser.platform.GetOSName() == 'android': + self.tab.action_runner.WaitForJavaScriptCondition( + 'webglTestHarness._finished', timeout=test_timeout) + return + start_time = time.time() try: while True:
diff --git a/content/web_test/renderer/test_runner.cc b/content/web_test/renderer/test_runner.cc index 4c4195fe..67b04df 100644 --- a/content/web_test/renderer/test_runner.cc +++ b/content/web_test/renderer/test_runner.cc
@@ -11,6 +11,7 @@ #include <limits> #include <utility> +#include "base/check_deref.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/containers/cxx20_erase.h" @@ -2050,7 +2051,7 @@ blink::scheduler::WebThreadScheduler* scheduler = content::RenderThreadImpl::current()->GetWebMainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting( - scheduler, WrapV8Closure(std::move(v8_callback))); + CHECK_DEREF(scheduler), WrapV8Closure(std::move(v8_callback))); } std::string TestRunnerBindings::PlatformName() {
diff --git a/device/bluetooth/bluez/OWNERS b/device/bluetooth/bluez/OWNERS index 8505807c..d3bd417cf 100644 --- a/device/bluetooth/bluez/OWNERS +++ b/device/bluetooth/bluez/OWNERS
@@ -1,2 +1,6 @@ +abhishekpandit@chromium.org +laikatherine@chromium.org mcchou@chromium.org +michaelfsun@google.com sonnysasaka@chromium.org +yinghsu@chromium.org
diff --git a/device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h b/device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h index d2cabdc..d57d176 100644 --- a/device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h +++ b/device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h
@@ -45,6 +45,7 @@ Type type() const { return type_; } size_t size() const { return size_; } + bool is_sequence() const { return type_ == Type::SEQUENCE; } const Sequence& sequence() const { return *sequence_.get(); } const base::Value& value() const { return *value_; }
diff --git a/device/bluetooth/bluez/bluetooth_service_record_bluez.cc b/device/bluetooth/bluez/bluetooth_service_record_bluez.cc index 0ebc81a..b981cb0 100644 --- a/device/bluetooth/bluez/bluetooth_service_record_bluez.cc +++ b/device/bluetooth/bluez/bluetooth_service_record_bluez.cc
@@ -45,7 +45,7 @@ std::pair<uint16_t, BluetoothServiceAttributeValueBlueZ>(id, value)); } -bool BluetoothServiceRecordBlueZ::IsAttributePresented(uint16_t id) { +bool BluetoothServiceRecordBlueZ::IsAttributePresented(uint16_t id) const { return attributes_.find(id) != attributes_.end(); }
diff --git a/device/bluetooth/bluez/bluetooth_service_record_bluez.h b/device/bluetooth/bluez/bluetooth_service_record_bluez.h index 3a27d8bb..d138aacd 100644 --- a/device/bluetooth/bluez/bluetooth_service_record_bluez.h +++ b/device/bluetooth/bluez/bluetooth_service_record_bluez.h
@@ -44,7 +44,7 @@ // Returns true if the given attribute ID is found in the attribute map, false // otherwise. - bool IsAttributePresented(uint16_t id); + bool IsAttributePresented(uint16_t id) const; private: std::map<uint16_t, BluetoothServiceAttributeValueBlueZ> attributes_;
diff --git a/device/bluetooth/dbus/OWNERS b/device/bluetooth/dbus/OWNERS index 8505807c..d3bd417cf 100644 --- a/device/bluetooth/dbus/OWNERS +++ b/device/bluetooth/dbus/OWNERS
@@ -1,2 +1,6 @@ +abhishekpandit@chromium.org +laikatherine@chromium.org mcchou@chromium.org +michaelfsun@google.com sonnysasaka@chromium.org +yinghsu@chromium.org
diff --git a/docs/accessibility/browser/android.md b/docs/accessibility/browser/android.md index 046bfac..7af46d50 100644 --- a/docs/accessibility/browser/android.md +++ b/docs/accessibility/browser/android.md
@@ -775,18 +775,18 @@ has created a noticeable improvement for accessibility services that do not require the entire suite to function. -### ComputeAXMode +### AccessibilityAXModes -Loosely related to the OnDemand feature above, the "ComputeAXMode" feature is also +Loosely related to the OnDemand feature above, the "AccessibilityAXModes" feature is also a recent addition to improve overall performance. This feature uses the same mechanism as OnDemand to query the currently enabled services and the information -they are interested in. ComputeAXMode then takes this information and uses a different +they are interested in. AccessibilityAXModes then takes this information and uses a different [AXMode](https://source.chromium.org/chromium/chromium/src/+/main:ui/accessibility/ax_mode.h) based on the situation. This effectively does the same thing as OnDemand, but further left/up-the-chain, giving a more significant performance -improvement. This feature is still rolling out, and it currently only has two -AXModes (full or basic). As it rolls out and we gather more data we will potentially -add more AXModes in the future. +improvement. This feature is still rolling out, and it currently only has three +AXModes (basic, form controls only, and complete). As it rolls out and we gather more data +we will potentially add more AXModes in the future. ### AutoDisableAccessibility
diff --git a/docs/ui/ui_devtools/index.md b/docs/ui/ui_devtools/index.md index 3fd86bd..d9a9b2c 100644 --- a/docs/ui/ui_devtools/index.md +++ b/docs/ui/ui_devtools/index.md
@@ -19,7 +19,7 @@ * If you want to use a different port, add the port number in the flag `--enable-ui-devtools=<port>`. -2. Enable `ui-debug-tools` feature flag from `chrome://flags` +2. Enable `enable-ui-devtools` feature flag from `chrome://flags` Once enabled, go to `chrome://inspect#native-ui` and click the `Inspect Native UI` button to launch the DevTools front-end in a separate tab.
diff --git a/extensions/renderer/scoped_web_frame.cc b/extensions/renderer/scoped_web_frame.cc index ea0dcff..0048613 100644 --- a/extensions/renderer/scoped_web_frame.cc +++ b/extensions/renderer/scoped_web_frame.cc
@@ -18,7 +18,7 @@ ScopedWebFrame::ScopedWebFrame() : agent_group_scheduler_( blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()), + .CreateWebAgentGroupScheduler()), view_(blink::WebView::Create( /*client=*/nullptr, /*is_hidden=*/false,
diff --git a/fuchsia_web/webengine/browser/web_engine_config.cc b/fuchsia_web/webengine/browser/web_engine_config.cc index 693c72c..14e029b 100644 --- a/fuchsia_web/webengine/browser/web_engine_config.cc +++ b/fuchsia_web/webengine/browser/web_engine_config.cc
@@ -147,37 +147,18 @@ command_line->HasSwitch(switches::kPlayreadyKeySystem); const bool widevine_enabled = command_line->HasSwitch(switches::kEnableWidevine); - - const bool allow_protected_graphics = - config.FindBool("allow-protected-graphics").value_or(false); - const bool force_protected_graphics = - config.FindBool("force-protected-graphics").value_or(false); + const bool force_protected_video_buffers = + config.FindBool("force-protected-video-buffers").value_or(false); const bool enable_protected_graphics = - ((playready_enabled || widevine_enabled) && allow_protected_graphics) || - force_protected_graphics; - const bool use_overlays_for_video = - config.FindBool("use-overlays-for-video").value_or(false); + playready_enabled || widevine_enabled || force_protected_video_buffers; if (enable_protected_graphics) { command_line->AppendSwitch(switches::kEnableVulkanProtectedMemory); command_line->AppendSwitch(switches::kEnableProtectedVideoBuffers); - const bool force_protected_video_buffers = - config.FindBool("force-protected-video-buffers").value_or(false); - if (force_protected_video_buffers) { - command_line->AppendSwitch(switches::kForceProtectedVideoOutputBuffers); - } } - if (use_overlays_for_video) { - // Overlays are only available if OutputPresenterFuchsia is in use. - AppendToSwitch(switches::kEnableFeatures, - features::kUseSkiaOutputDeviceBufferQueue.name, - command_line); - AppendToSwitch(switches::kEnableFeatures, - features::kUseRealBuffersForPageFlipTest.name, command_line); - command_line->AppendSwitchASCII(switches::kEnableHardwareOverlays, - "underlay"); - command_line->AppendSwitch(switches::kUseOverlaysForVideo); + if (force_protected_video_buffers) { + command_line->AppendSwitch(switches::kForceProtectedVideoOutputBuffers); } return true;
diff --git a/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc b/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc index 73bc323..ce153632 100644 --- a/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc +++ b/fuchsia_web/webengine/browser/web_engine_content_browser_client.cc
@@ -118,7 +118,6 @@ switches::kEnableCastStreamingReceiver, switches::kEnableProtectedVideoBuffers, switches::kForceProtectedVideoOutputBuffers, - switches::kUseOverlaysForVideo, switches::kMinVideoDecoderOutputBufferSize, // TODO(crbug/1013412): Delete these two switches when fixed.
diff --git a/gpu/OWNERS b/gpu/OWNERS index 94f24fd..97d3b3ac 100644 --- a/gpu/OWNERS +++ b/gpu/OWNERS
@@ -14,6 +14,8 @@ # For SharedImages vikassoni@chromium.org +hitawala@chromium.org +blundell@chromium.org # D3D, dcomp, Windows platform integration, etc. rafael.cintron@microsoft.com
diff --git a/gpu/command_buffer/common/shared_image_usage.cc b/gpu/command_buffer/common/shared_image_usage.cc index 790b626..25e8a867 100644 --- a/gpu/command_buffer/common/shared_image_usage.cc +++ b/gpu/command_buffer/common/shared_image_usage.cc
@@ -29,7 +29,6 @@ {SHARED_IMAGE_USAGE_SCANOUT, "Scanout"}, {SHARED_IMAGE_USAGE_OOP_RASTERIZATION, "OopRasterization"}, {SHARED_IMAGE_USAGE_WEBGPU, "Webgpu"}, - {SHARED_IMAGE_USAGE_PROTECTED, "Protected"}, {SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE, "ConcurrentReadWrite"}, {SHARED_IMAGE_USAGE_VIDEO_DECODE, "VideoDecode"}, {SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE, "WebgpuSwapChainTexture"},
diff --git a/gpu/command_buffer/common/shared_image_usage.h b/gpu/command_buffer/common/shared_image_usage.h index 7a368f4..77753a604 100644 --- a/gpu/command_buffer/common/shared_image_usage.h +++ b/gpu/command_buffer/common/shared_image_usage.h
@@ -34,41 +34,39 @@ SHARED_IMAGE_USAGE_OOP_RASTERIZATION = 1 << 6, // Image will be used by Dawn (for WebGPU) SHARED_IMAGE_USAGE_WEBGPU = 1 << 7, - // Image will be used in a protected Vulkan context on Fuchsia. - SHARED_IMAGE_USAGE_PROTECTED = 1 << 8, // Image may use concurrent read/write access. Used by single buffered canvas. // TODO(crbug.com/969114): This usage is currently not supported in GL/Vulkan // interop cases. - SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE = 1 << 9, + SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE = 1 << 8, // Image will be used for video decode acceleration on Chrome OS. - SHARED_IMAGE_USAGE_VIDEO_DECODE = 1 << 10, + SHARED_IMAGE_USAGE_VIDEO_DECODE = 1 << 9, // Image will be used as a WebGPU swapbuffer - SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE = 1 << 11, + SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE = 1 << 10, // The image was created by VideoToolbox on macOS, and is backed by a // CVPixelBuffer's IOSurface. Because of this backing, IOSurfaceIsInUse will // always return true. - SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX = 1 << 12, + SHARED_IMAGE_USAGE_MACOS_VIDEO_TOOLBOX = 1 << 11, // Image will be used with mipmap enabled - SHARED_IMAGE_USAGE_MIPMAP = 1 << 13, + SHARED_IMAGE_USAGE_MIPMAP = 1 << 12, // Image will be used for CPU Writes by client - SHARED_IMAGE_USAGE_CPU_WRITE = 1 << 14, + SHARED_IMAGE_USAGE_CPU_WRITE = 1 << 13, // Image will be used in RasterInterface with RawDraw. - SHARED_IMAGE_USAGE_RAW_DRAW = 1 << 15, + SHARED_IMAGE_USAGE_RAW_DRAW = 1 << 14, // Image will be used in RasterInterface for DelegatedCompositing. // TODO(crbug.com/1254033): this usage shall be removed after cc is able to // set a single (duplicated) fence for bunch of tiles instead of having the SI // framework creating fences for each single message when write access ends. - SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING = 1 << 16, + SHARED_IMAGE_USAGE_RASTER_DELEGATED_COMPOSITING = 1 << 15, // Image will be created on the high performance GPU if supported. - SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU = 1 << 17, + SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU = 1 << 16, // Windows only: image will be backed by a DComp surface. A swap chain is // preferred when an image is opaque and expected to update frequently and // independently of other overlays. This flag is incompatible with // DISPLAY_READ. - SHARED_IMAGE_USAGE_SCANOUT_DCOMP_SURFACE = 1 << 18, + SHARED_IMAGE_USAGE_SCANOUT_DCOMP_SURFACE = 1 << 17, // Image will be used as a WebGPU storage texture. - SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE = 1 << 19, + SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE = 1 << 18, // Start service side only usage flags after this entry. They must be larger // than `LAST_CLIENT_USAGE`. @@ -77,7 +75,7 @@ // Image will have pixels uploaded from CPU. The backing must implement // `UploadFromMemory()` if it supports this usage. Clients should specify // SHARED_IMAGE_USAGE_CPU_WRITE if they need to write pixels to the image. - SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 20, + SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 19, LAST_SHARED_IMAGE_USAGE = SHARED_IMAGE_USAGE_CPU_UPLOAD };
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn index 0f02b5de..2bf5043 100644 --- a/gpu/command_buffer/service/BUILD.gn +++ b/gpu/command_buffer/service/BUILD.gn
@@ -266,6 +266,8 @@ "shared_image/shared_memory_image_backing_factory.h", "shared_image/skia_gl_image_representation.cc", "shared_image/skia_gl_image_representation.h", + "shared_image/texture_holder_vk.cc", + "shared_image/texture_holder_vk.h", "shared_image/wrapped_sk_image_backing.cc", "shared_image/wrapped_sk_image_backing.h", "shared_image/wrapped_sk_image_backing_factory.cc",
diff --git a/gpu/command_buffer/service/ahardwarebuffer_utils.cc b/gpu/command_buffer/service/ahardwarebuffer_utils.cc index 756f748..fd0985d 100644 --- a/gpu/command_buffer/service/ahardwarebuffer_utils.cc +++ b/gpu/command_buffer/service/ahardwarebuffer_utils.cc
@@ -8,7 +8,6 @@ #include "base/android/scoped_hardware_buffer_handle.h" #include "base/check.h" -#include "base/notreached.h" #include "components/viz/common/gpu/vulkan_context_provider.h" #include "gpu/command_buffer/service/gl_utils.h" #include "gpu/command_buffer/service/shared_context_state.h" @@ -22,41 +21,6 @@ namespace gpu { -bool AHardwareBufferSupportedFormat(viz::ResourceFormat format) { - switch (format) { - case viz::RGBA_8888: - case viz::RGB_565: - case viz::BGR_565: - case viz::RGBA_F16: - case viz::RGBX_8888: - case viz::RGBA_1010102: - return true; - default: - return false; - } -} - -unsigned int AHardwareBufferFormat(viz::ResourceFormat format) { - DCHECK(AHardwareBufferSupportedFormat(format)); - switch (format) { - case viz::RGBA_8888: - return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; - case viz::RGB_565: - return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; - case viz::BGR_565: - return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; - case viz::RGBA_F16: - return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT; - case viz::RGBX_8888: - return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM; - case viz::RGBA_1010102: - return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; - default: - NOTREACHED(); - return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; - } -} - std::unique_ptr<VulkanImage> CreateVkImageFromAhbHandle( base::android::ScopedHardwareBufferHandle ahb_handle, SharedContextState* context_state,
diff --git a/gpu/command_buffer/service/ahardwarebuffer_utils.h b/gpu/command_buffer/service/ahardwarebuffer_utils.h index 14ed9c0d..943747a 100644 --- a/gpu/command_buffer/service/ahardwarebuffer_utils.h +++ b/gpu/command_buffer/service/ahardwarebuffer_utils.h
@@ -30,21 +30,6 @@ class SharedContextState; class VulkanImage; -// TODO(vikassoni): In future we will need to expose the set of formats and -// constraints (e.g. max size) to the clients somehow that are available for -// certain combinations of SharedImageUsage flags (e.g. when Vulkan is on, -// SHARED_IMAGE_USAGE_GLES2 + SHARED_IMAGE_USAGE_DISPLAY_READ implies AHB, so -// those restrictions apply, but that's decided on the service side). For now -// getting supported format is a static mechanism like this. We probably need -// something like gpu::Capabilities.texture_target_exception_list. - -// Returns whether the format is supported by AHardwareBuffer. -bool GPU_GLES2_EXPORT -AHardwareBufferSupportedFormat(viz::ResourceFormat format); - -// Returns the corresponding AHardwareBuffer format. -unsigned int GPU_GLES2_EXPORT AHardwareBufferFormat(viz::ResourceFormat format); - // Create a vulkan image from the AHB handle. std::unique_ptr<VulkanImage> CreateVkImageFromAhbHandle( base::android::ScopedHardwareBufferHandle ahb_handle,
diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc index f4fe03d..c2134a13 100644 --- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
@@ -135,6 +135,50 @@ return service_id; } +// Returns whether the format is supported by AHardwareBuffer. +// TODO(vikassoni): In future we will need to expose the set of formats and +// constraints (e.g. max size) to the clients somehow that are available for +// certain combinations of SharedImageUsage flags (e.g. when Vulkan is on, +// SHARED_IMAGE_USAGE_GLES2 + SHARED_IMAGE_USAGE_DISPLAY_READ implies AHB, so +// those restrictions apply, but that's decided on the service side). For now +// getting supported format is a static mechanism like this. We probably need +// something like gpu::Capabilities.texture_target_exception_list. +bool AHardwareBufferSupportedFormat(viz::ResourceFormat format) { + switch (format) { + case viz::RGBA_8888: + case viz::RGB_565: + case viz::BGR_565: + case viz::RGBA_F16: + case viz::RGBX_8888: + case viz::RGBA_1010102: + return true; + default: + return false; + } +} + +// Returns the corresponding AHardwareBuffer format. +unsigned int AHardwareBufferFormat(viz::ResourceFormat format) { + DCHECK(AHardwareBufferSupportedFormat(format)); + switch (format) { + case viz::RGBA_8888: + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + case viz::RGB_565: + return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; + case viz::BGR_565: + return AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM; + case viz::RGBA_F16: + return AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT; + case viz::RGBX_8888: + return AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM; + case viz::RGBA_1010102: + return AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM; + default: + NOTREACHED(); + return AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM; + } +} + constexpr uint32_t kSupportedUsage = SHARED_IMAGE_USAGE_GLES2 | SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT | SHARED_IMAGE_USAGE_DISPLAY_WRITE | SHARED_IMAGE_USAGE_DISPLAY_READ |
diff --git a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc index 980cf885..251f93d 100644 --- a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.cc
@@ -21,6 +21,7 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorSpace.h" #include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "third_party/skia/include/gpu/GrBackendSurfaceMutableState.h" #include "ui/gl/egl_util.h" #include "ui/gl/gl_context.h" #include "ui/gl/scoped_egl_image.h" @@ -262,14 +263,7 @@ return false; } - GrVkImageInfo vk_info = CreateGrVkImageInfo(vulkan_image.get()); - - auto& vk_texture = vk_textures_.emplace_back(); - vk_texture.vulkan_image = std::move(vulkan_image); - vk_texture.backend_texture = - GrBackendTexture(plane_size.width(), plane_size.height(), vk_info); - vk_texture.promise_texture = - SkPromiseImageTexture::Make(vk_texture.backend_texture); + vk_textures_.emplace_back(std::move(vulkan_image)); } if (!data.empty()) { @@ -302,14 +296,7 @@ return false; } - GrVkImageInfo vk_info = CreateGrVkImageInfo(vulkan_image.get()); - - auto& vk_texture = vk_textures_.emplace_back(); - vk_texture.vulkan_image = std::move(vulkan_image); - vk_texture.backend_texture = - GrBackendTexture(size().width(), size().height(), vk_info); - vk_texture.promise_texture = - SkPromiseImageTexture::Make(vk_texture.backend_texture); + vk_textures_.emplace_back(std::move(vulkan_image)); SetCleared(); @@ -517,9 +504,7 @@ DCHECK_GE(kMaxTextures, vk_textures_.size()); for (size_t i = 0; i < vk_textures_.size(); ++i) { - GrVkImageInfo info; - bool result = vk_textures_[i].backend_texture.getVkImageInfo(&info); - DCHECK(result); + GrVkImageInfo info = vk_textures_[i].GetGrVkImageInfo(); gl_layouts_[i] = VkImageLayoutToGLImageLayout(info.fImageLayout); } } @@ -653,14 +638,6 @@ return true; } -AngleVulkanImageBacking::TextureHolderVk::TextureHolderVk() = default; -AngleVulkanImageBacking::TextureHolderVk::TextureHolderVk( - TextureHolderVk&& other) = default; -AngleVulkanImageBacking::TextureHolderVk& -AngleVulkanImageBacking::TextureHolderVk::operator=(TextureHolderVk&& other) = - default; -AngleVulkanImageBacking::TextureHolderVk::~TextureHolderVk() = default; - AngleVulkanImageBacking::TextureHolderGL::TextureHolderGL() = default; AngleVulkanImageBacking::TextureHolderGL::TextureHolderGL( TextureHolderGL&& other) = default;
diff --git a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.h b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.h index 90803ec..7631b1a 100644 --- a/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.h +++ b/gpu/command_buffer/service/shared_image/angle_vulkan_image_backing.h
@@ -9,7 +9,7 @@ #include "gpu/command_buffer/service/shared_image/gl_common_image_backing_factory.h" #include "gpu/command_buffer/service/shared_image/gl_texture_common_representations.h" #include "gpu/command_buffer/service/shared_image/shared_image_backing.h" -#include "third_party/skia/include/gpu/GrBackendSurface.h" +#include "gpu/command_buffer/service/shared_image/texture_holder_vk.h" #include "ui/gl/scoped_egl_image.h" namespace gpu { @@ -17,8 +17,6 @@ class TexturePassthrough; } -class VulkanImage; - class AngleVulkanImageBacking : public ClearTrackingSharedImageBacking, public GLTextureImageRepresentationClient { public: @@ -55,17 +53,6 @@ private: class SkiaAngleVulkanImageRepresentation; - struct TextureHolderVk { - TextureHolderVk(); - TextureHolderVk(TextureHolderVk&& other); - TextureHolderVk& operator=(TextureHolderVk&& other); - ~TextureHolderVk(); - - std::unique_ptr<VulkanImage> vulkan_image; - GrBackendTexture backend_texture; - sk_sp<SkPromiseImageTexture> promise_texture; - }; - struct TextureHolderGL { TextureHolderGL(); TextureHolderGL(TextureHolderGL&& other);
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc index 424b0f4a..5bae2a2 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.cc
@@ -1251,24 +1251,4 @@ } } -TextureHolderVk::TextureHolderVk(std::unique_ptr<VulkanImage> image) - : vulkan_image(std::move(image)) { - gfx::Size size = vulkan_image->size(); - GrVkImageInfo vk_image_info = CreateGrVkImageInfo(vulkan_image.get()); - backend_texture = - GrBackendTexture(size.width(), size.height(), vk_image_info); - promise_texture = SkPromiseImageTexture::Make(backend_texture); -} - -TextureHolderVk::TextureHolderVk(TextureHolderVk&& other) = default; -TextureHolderVk& TextureHolderVk::operator=(TextureHolderVk&& other) = default; -TextureHolderVk::~TextureHolderVk() = default; - -GrVkImageInfo TextureHolderVk::GetGrVkImageInfo() const { - GrVkImageInfo info; - bool result = backend_texture.getVkImageInfo(&info); - DCHECK(result); - return info; -} - } // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing.h b/gpu/command_buffer/service/shared_image/external_vk_image_backing.h index df35a7b..7300790 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing.h +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing.h
@@ -18,6 +18,7 @@ #include "gpu/command_buffer/service/external_semaphore_pool.h" #include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_image/shared_image_backing.h" +#include "gpu/command_buffer/service/shared_image/texture_holder_vk.h" #include "gpu/command_buffer/service/shared_memory_region_wrapper.h" #include "gpu/command_buffer/service/texture_manager.h" #include "gpu/vulkan/vulkan_device_queue.h" @@ -30,21 +31,6 @@ class VulkanCommandPool; class VulkanImage; -// Holds VulkanImage + skia representations of it. -// TODO(kylechar): Put this somewhere common and use in AngleVulkanImageBacking. -struct TextureHolderVk { - explicit TextureHolderVk(std::unique_ptr<VulkanImage> image); - TextureHolderVk(TextureHolderVk&& other); - TextureHolderVk& operator=(TextureHolderVk&& other); - ~TextureHolderVk(); - - GrVkImageInfo GetGrVkImageInfo() const; - - std::unique_ptr<VulkanImage> vulkan_image; - GrBackendTexture backend_texture; - sk_sp<SkPromiseImageTexture> promise_texture; -}; - class ExternalVkImageBacking final : public ClearTrackingSharedImageBacking { public: static std::unique_ptr<ExternalVkImageBacking> Create(
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc index 0591d6c..c35acc5 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
@@ -83,7 +83,7 @@ SHARED_IMAGE_USAGE_DISPLAY_WRITE | SHARED_IMAGE_USAGE_DISPLAY_READ | SHARED_IMAGE_USAGE_RASTER | SHARED_IMAGE_USAGE_OOP_RASTERIZATION | SHARED_IMAGE_USAGE_SCANOUT | SHARED_IMAGE_USAGE_WEBGPU | - SHARED_IMAGE_USAGE_PROTECTED | SHARED_IMAGE_USAGE_VIDEO_DECODE | + SHARED_IMAGE_USAGE_VIDEO_DECODE | SHARED_IMAGE_USAGE_WEBGPU_SWAP_CHAIN_TEXTURE | SHARED_IMAGE_USAGE_HIGH_PERFORMANCE_GPU | SHARED_IMAGE_USAGE_CPU_UPLOAD | SHARED_IMAGE_USAGE_CPU_WRITE | SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE;
diff --git a/gpu/command_buffer/service/shared_image/texture_holder_vk.cc b/gpu/command_buffer/service/shared_image/texture_holder_vk.cc new file mode 100644 index 0000000..639c5f3 --- /dev/null +++ b/gpu/command_buffer/service/shared_image/texture_holder_vk.cc
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gpu/command_buffer/service/shared_image/texture_holder_vk.h" + +#include "base/check.h" +#include "gpu/command_buffer/service/skia_utils.h" +#include "gpu/vulkan/vulkan_image.h" + +namespace gpu { + +TextureHolderVk::TextureHolderVk(std::unique_ptr<VulkanImage> image) + : vulkan_image(std::move(image)) { + gfx::Size size = vulkan_image->size(); + GrVkImageInfo vk_image_info = CreateGrVkImageInfo(vulkan_image.get()); + backend_texture = + GrBackendTexture(size.width(), size.height(), vk_image_info); + promise_texture = SkPromiseImageTexture::Make(backend_texture); +} + +TextureHolderVk::TextureHolderVk(TextureHolderVk&& other) = default; +TextureHolderVk& TextureHolderVk::operator=(TextureHolderVk&& other) = default; +TextureHolderVk::~TextureHolderVk() = default; + +GrVkImageInfo TextureHolderVk::GetGrVkImageInfo() const { + GrVkImageInfo info; + bool result = backend_texture.getVkImageInfo(&info); + CHECK(result); + return info; +} + +} // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image/texture_holder_vk.h b/gpu/command_buffer/service/shared_image/texture_holder_vk.h new file mode 100644 index 0000000..2d3c558e --- /dev/null +++ b/gpu/command_buffer/service/shared_image/texture_holder_vk.h
@@ -0,0 +1,34 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEXTURE_HOLDER_VK_H_ +#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEXTURE_HOLDER_VK_H_ + +#include <memory> + +#include "third_party/skia/include/core/SkPromiseImageTexture.h" +#include "third_party/skia/include/gpu/GrBackendSurface.h" +#include "third_party/skia/include/gpu/vk/GrVkTypes.h" + +namespace gpu { + +class VulkanImage; + +// Holds VulkanImage + skia representations of it. +struct TextureHolderVk { + explicit TextureHolderVk(std::unique_ptr<VulkanImage> image); + TextureHolderVk(TextureHolderVk&& other); + TextureHolderVk& operator=(TextureHolderVk&& other); + ~TextureHolderVk(); + + GrVkImageInfo GetGrVkImageInfo() const; + + std::unique_ptr<VulkanImage> vulkan_image; + GrBackendTexture backend_texture; + sk_sp<SkPromiseImageTexture> promise_texture; +}; + +} // namespace gpu + +#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEXTURE_HOLDER_VK_H_
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc index 5f322f6..875b650 100644 --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc
@@ -360,7 +360,7 @@ // discardable memory. BASE_FEATURE(kNoDiscardableMemoryForGpuDecodePath, "NoDiscardableMemoryForGpuDecodePath", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); // Use a 100-command limit before forcing context switch per command buffer // instead of 20.
diff --git a/infra/config/.lucicfgfmtrc b/infra/config/.lucicfgfmtrc index 5f067474..6bcac33 100644 --- a/infra/config/.lucicfgfmtrc +++ b/infra/config/.lucicfgfmtrc
@@ -73,4 +73,16 @@ arg: "builder" arg: "category" } +} +rules { + path: "targets" + function_args_sort { + arg: "name" + arg: "label" + arg: "label_type" + arg: "script" + arg: "executable" + arg: "executable_suffix" + arg: "skip_usage_check" + } } \ No newline at end of file
diff --git a/infra/config/PRESUBMIT.py b/infra/config/PRESUBMIT.py index 85f3c35..1f86a86 100644 --- a/infra/config/PRESUBMIT.py +++ b/infra/config/PRESUBMIT.py
@@ -100,6 +100,35 @@ input_api, output_api) +# TODO(gbeaty) pinpoint runs builds against revisions that aren't tip-of-tree, +# so recipe side config can't be updated to refer to +# //infra/config/generated/testing/gn_isolate_map.pyl until all of the revisions +# that pinpoint will run against have that file. To workaround this, we'll copy +# the generated file to //testing/buildbot/gn_isiolate_map.pyl. Once pinpoint is +# only building revisions that contain +# //infra/config/generated/testing/gn_isolate_map.pyl, the recipe configs can be +# updated and we can remove this presubmit check, +# //testing/buildbot/gn_isiolate_map.pyl and +# //infra/config/scripts/sync-isolate-map.py. +def CheckGnIsolateMapPylSynced(input_api, output_api): + if ('infra/config/generated/testing/gn_isolate_map.pyl' + in input_api.LocalPaths()): + with open('generated/testing/gn_isolate_map.pyl') as f: + ic_gn_isolate_map = f.read() + with open('../../testing/buildbot/gn_isolate_map.pyl') as f: + tb_gn_isolate_map = f.read() + if ic_gn_isolate_map != tb_gn_isolate_map: + sync_script_path = input_api.os_path.join(input_api.PresubmitLocalPath(), + 'scripts/sync-isolate-map.pyl') + return [ + output_api.PresubmitError( + '//testing/buildbot/gn_isolate_map.pyl must be kept in sync with' + ' //infra/config/generated/testing/gn_isolate_map.pyl, please run' + f' {sync_script_path}') + ] + return [] + + # Footer indicating a CL that is trying to address an outage by some mechanism # other than those in infra/config/outages _OUTAGE_ACTION_FOOTER = 'Infra-Config-Outage-Action'
diff --git "a/infra/config/generated/builders/reclient/Linux Builder \050canonical wd\051 \050reclient compare\051/properties.json" "b/infra/config/generated/builders/reclient/Linux Builder \050canonical wd\051 \050reclient compare\051/properties.json" new file mode 100644 index 0000000..994193d --- /dev/null +++ "b/infra/config/generated/builders/reclient/Linux Builder \050canonical wd\051 \050reclient compare\051/properties.json"
@@ -0,0 +1,63 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "reclient", + "builder": "Linux Builder (canonical wd) (reclient compare)", + "project": "chromium" + }, + "builder_spec": { + "builder_group": "chromium.reclient.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "reclient_test" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "reclient", + "builder": "Linux Builder (canonical wd) (reclient compare)", + "project": "chromium" + } + ] + } + }, + "$build/reclient": { + "ensure_verified": true, + "instance": "rbe-chromium-trusted-test", + "metrics_project": "chromium-reclient-metrics", + "rewrapper_env": { + "RBE_cache_silo": "Linux Builder (canonical wd) (reclient compare)", + "RBE_canonicalize_working_dir": "true", + "RBE_compare": "true", + "RBE_compression_threshold": "4000000" + } + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.reclient.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 3a2a915..e3ccaa75 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -550,3 +550,6 @@ * [mac12-arm64-rel](https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""mac12-arm64-rel"")) * Experiment percentage: 100.0 +* [win-presubmit](https://ci.chromium.org/p/chromium/builders/try/win-presubmit) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""win-presubmit"")) + * Experiment percentage: 100.0 +
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index f61dfe2..20d9a37c 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -3942,7 +3942,7 @@ } builders { name: "chromium/try/win-presubmit" - includable_only: true + experiment_percentage: 100 } builders { name: "chromium/try/win-rel"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 4491ca1..5259124 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -38534,7 +38534,10 @@ ' ]' ' },' ' "recipe": "presubmit",' - ' "repo_name": "chromium"' + ' "repo_name": "chromium",' + ' "sheriff_rotations": [' + ' "chromium"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -52708,6 +52711,91 @@ } } builders { + name: "Linux Builder (canonical wd) (reclient compare)" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:32" + dimensions: "cpu:x86-64" + dimensions: "free_space:standard" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/reclient/Linux Builder (canonical wd) (reclient compare)/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.reclient.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 50400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium_swarming.expose_merge_script_failures" + value: 100 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + description_html: "verify artifacts with canonicalize_working_dir enabled. should be removed after developer rollout. b/276727069" + } + builders { name: "Linux Builder reclient staging" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -61608,6 +61696,10 @@ value: 5 } experiments { + key: "chromium.add_one_test_shard" + value: 5 + } + experiments { key: "chromium_swarming.expose_merge_script_failures" value: 100 } @@ -73259,6 +73351,10 @@ value: 5 } experiments { + key: "chromium.add_one_test_shard" + value: 5 + } + experiments { key: "chromium_swarming.expose_merge_script_failures" value: 100 }
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 80d9110..f7a1525 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -13834,6 +13834,11 @@ short_name: "cmp" } builders { + name: "buildbucket/luci.chromium.reclient/Linux Builder (canonical wd) (reclient compare)" + category: "linux" + short_name: "compwd" + } + builders { name: "buildbucket/luci.chromium.reclient/ios-simulator reclient staging" category: "rbe|ios" short_name: "rcs"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 2a4a9cd..19dacff 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -1531,6 +1531,15 @@ } } job { + id: "Linux Builder (canonical wd) (reclient compare)" + realm: "reclient" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "reclient" + builder: "Linux Builder (canonical wd) (reclient compare)" + } +} +job { id: "Linux Builder (dbg)" realm: "ci" buildbucket { @@ -6660,6 +6669,7 @@ triggers: "mac-archive-rel-goma-rbe-latest" triggers: "Comparison Linux (reclient vs reclient remote links)" triggers: "Comparison Linux (reclient vs reclient remote links)(small)" + triggers: "Linux Builder (canonical wd) (reclient compare)" triggers: "Linux Builder reclient staging" triggers: "Linux Builder reclient staging untrusted" triggers: "Linux Builder reclient test"
diff --git a/infra/config/generated/sheriff-rotations/chromium.txt b/infra/config/generated/sheriff-rotations/chromium.txt index e2ac727..977ea41a 100644 --- a/infra/config/generated/sheriff-rotations/chromium.txt +++ b/infra/config/generated/sheriff-rotations/chromium.txt
@@ -115,6 +115,7 @@ ci/linux-lacros-builder-rel ci/linux-lacros-dbg ci/linux-lacros-tester-rel +ci/linux-presubmit ci/linux-ubsan-vptr ci/mac-archive-dbg ci/mac-archive-rel
diff --git a/infra/config/generated/testing/gn_isolate_map.pyl b/infra/config/generated/testing/gn_isolate_map.pyl new file mode 100644 index 0000000..06c2644 --- /dev/null +++ b/infra/config/generated/testing/gn_isolate_map.pyl
@@ -0,0 +1,2010 @@ +# THIS IS A GENERATED FILE DO NOT EDIT!!! +# Instead: +# 1. Modify //infra/config/targets/targets.star +# 2. Run //infra/config/main.star +# 3. Run //infra/config/scripts/sync-isolate-map.py + +{ + "All_syzygy": { + "label": "//:All_syzygy", + "type": "additional_compile_target", + }, + "absl_hardening_tests": { + "label": "//third_party/abseil-cpp:absl_hardening_tests", + "type": "console_test_launcher", + }, + "accessibility_unittests": { + "label": "//ui/accessibility:accessibility_unittests", + "type": "console_test_launcher", + }, + "android_browsertests": { + "label": "//chrome/test:android_browsertests", + "type": "windowed_test_launcher", + }, + "android_lint": { + "label": "//chrome/android:android_lint", + "type": "additional_compile_target", + }, + "android_sync_integration_tests": { + "label": "//chrome/test:android_sync_integration_tests", + "type": "windowed_test_launcher", + }, + "android_tools": { + "label": "//tools/android:android_tools", + "type": "additional_compile_target", + }, + "android_webview_junit_tests": { + "label": "//android_webview/test:android_webview_junit_tests", + "type": "generated_script", + }, + "android_webview_unittests": { + "label": "//android_webview/test:android_webview_unittests", + "type": "console_test_launcher", + }, + "angle_deqp_egl_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_egl_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles2_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles2_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles31_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles31_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles3_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles3_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_khr_gles2_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_khr_gles2_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_khr_gles3_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_khr_gles3_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_khr_gles31_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_khr_gles31_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles3_rotate180_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles3_rotate180_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles3_rotate270_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles3_rotate270_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles3_rotate90_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles3_rotate90_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles31_rotate180_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles31_rotate180_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles31_rotate270_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles31_rotate270_tests", + "type": "windowed_test_launcher", + }, + "angle_deqp_gles31_rotate90_tests": { + "label": "//third_party/angle/src/tests:angle_deqp_gles31_rotate90_tests", + "type": "windowed_test_launcher", + }, + "angle_end2end_tests": { + "label": "//third_party/angle/src/tests:angle_end2end_tests", + "type": "windowed_test_launcher", + }, + "angle_unittests": { + "label": "//third_party/angle/src/tests:angle_unittests", + "type": "windowed_test_launcher", + }, + "angle_white_box_tests": { + "label": "//third_party/angle/src/tests:angle_white_box_tests", + "type": "windowed_test_launcher", + }, + "app_shell_unittests": { + "label": "//extensions/shell:app_shell_unittests", + "type": "windowed_test_launcher", + }, + "ash_components_unittests": { + "label": "//ash/components:ash_components_unittests", + "type": "windowed_test_launcher", + }, + "ash_crosapi_tests": { + "label": "//chrome/test:ash_crosapi_tests", + "type": "windowed_test_launcher", + }, + "ash_webui_unittests": { + "label": "//ash/webui:ash_webui_unittests", + "type": "windowed_test_launcher", + }, + "ash_unittests": { + "label": "//ash:ash_unittests", + "type": "windowed_test_launcher", + }, + "ash_pixeltests": { + "label": "//ash:ash_pixeltests", + "type": "windowed_test_launcher", + }, + "aura_unittests": { + "label": "//ui/aura:aura_unittests", + "type": "windowed_test_launcher", + }, + "base_junit_tests": { + "label": "//base:base_junit_tests", + "type": "generated_script", + }, + "base_perftests": { + "label": "//base:base_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "base_perftests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], + }, + "base_unittests": { + "label": "//base:base_unittests", + "type": "console_test_launcher", + }, + "blink_common_unittests": { + "label": "//third_party/blink/common:blink_common_unittests", + "type": "console_test_launcher", + }, + "blink_fuzzer_unittests": { + "label": "//third_party/blink/renderer/platform:blink_fuzzer_unittests", + "type": "console_test_launcher", + }, + "blink_heap_unittests": { + "label": "//third_party/blink/renderer/platform/heap:blink_heap_unittests", + "type": "console_test_launcher", + }, + "blink_platform_unittests": { + "label": "//third_party/blink/renderer/platform:blink_platform_unittests", + "type": "console_test_launcher", + }, + "blink_python_tests": { + "label": "//:blink_python_tests", + "type": "generated_script", + }, + "blink_pytype": { + "label": "//third_party/blink/tools:blink_pytype", + "type": "script", + "script": "//third_party/blink/tools/run_pytype.py", + }, + "blink_tests": { + "label": "//:blink_tests", + "type": "additional_compile_target", + }, + "blink_unittests": { + "label": "//third_party/blink/renderer/controller:blink_unittests", + "type": "console_test_launcher", + }, + "blink_web_tests": { + "label": "//:blink_web_tests", + "type": "generated_script", + "args": [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], + }, + "blink_wpt_tests": { + "label": "//:blink_wpt_tests", + "type": "generated_script", + "args": [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], + }, + "boundary_interface_example_apk": { + "label": "//android_webview/support_library/boundary_interfaces:boundary_interface_example_apk", + "type": "additional_compile_target", + }, + "devtools_web_tests": { + "label": "//:devtools_web_tests", + "type": "generated_script", + "args": [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], + }, + "boringssl_crypto_tests": { + "label": "//third_party/boringssl:boringssl_crypto_tests", + "type": "console_test_launcher", + }, + "boringssl_ssl_tests": { + "label": "//third_party/boringssl:boringssl_ssl_tests", + "type": "console_test_launcher", + }, + "browser_tests": { + "label": "//chrome/test:browser_tests", + "type": "windowed_test_launcher", + }, + "build_junit_tests": { + "label": "//build/android:build_junit_tests", + "type": "generated_script", + }, + "captured_sites_interactive_tests": { + "label": "//chrome/test:captured_sites_interactive_tests", + "type": "windowed_test_launcher", + "args": [ + "--disable-extensions", + ], + }, + "capture_unittests": { + "label": "//media/capture:capture_unittests", + "type": "windowed_test_launcher", + }, + "cast_display_settings_unittests": { + "label": "//chromecast/ui/display_settings:cast_display_settings_unittests", + "type": "console_test_launcher", + }, + "cast_runner_browsertests": { + "label": "//fuchsia_web/runners:cast_runner_browsertests", + "type": "console_test_launcher", + }, + "cast_runner_integration_tests": { + "label": "//fuchsia_web/runners:cast_runner_integration_tests", + "type": "console_test_launcher", + }, + "cast_runner_pkg": { + "label": "//fuchsia_web/runners:cast_runner_pkg", + "type": "additional_compile_target", + }, + "cast_runner_unittests": { + "label": "//fuchsia_web/runners:cast_runner_unittests", + "type": "console_test_launcher", + }, + "cast_audio_backend_unittests": { + "label": "//chromecast/media/cma/backend:cast_audio_backend_unittests", + "type": "console_test_launcher", + }, + "cast_base_junit_tests": { + "label": "//chromecast/base:cast_base_junit_tests", + "type": "junit_test", + }, + "cast_base_unittests": { + "label": "//chromecast/base:cast_base_unittests", + "type": "console_test_launcher", + }, + "cast_cast_core_unittests": { + "label": "//chromecast/cast_core:cast_cast_core_unittests", + "type": "console_test_launcher", + }, + "cast_crash_unittests": { + "label": "//chromecast/crash:cast_crash_unittests", + "type": "console_test_launcher", + }, + "cast_graphics_unittests": { + "label": "//chromecast/graphics:cast_graphics_unittests", + "type": "console_test_launcher", + }, + "cast_junit_test_lists": { + "label": "//chromecast:cast_junit_test_lists", + "type": "additional_compile_target", + }, + "cast_media_unittests": { + "label": "//chromecast/media:cast_media_unittests", + "type": "console_test_launcher", + }, + "cast_shell": { + "label": "//chromecast:cast_shell", + "type": "additional_compile_target", + }, + "cast_shell_apk": { + "label": "//chromecast:cast_shell_apk", + "type": "additional_compile_target", + }, + "cast_shell_browsertests": { + "label": "//chromecast:cast_shell_browsertests", + "type": "console_test_launcher", + }, + "cast_shell_junit_tests": { + "label": "//chromecast/browser/android:cast_shell_junit_tests", + "type": "junit_test", + }, + "cast_shell_unittests": { + "label": "//chromecast:cast_shell_unittests", + "type": "console_test_launcher", + }, + "cast_test_lists": { + "label": "//chromecast:cast_test_lists", + "type": "additional_compile_target", + }, + "cast_unittests": { + "label": "//media/cast:cast_unittests", + "type": "windowed_test_launcher", + }, + "cc_unittests": { + "label": "//cc:cc_unittests", + "type": "windowed_test_launcher", + }, + "chrome": { + "label": "//chrome:chrome", + "type": "additional_compile_target", + }, + "chrome_all_tast_tests": { + "label": "//chromeos:chrome_all_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "chrome_app_unittests": { + "label": "//chrome/test:chrome_app_unittests", + "type": "console_test_launcher", + }, + "chrome_cleaner_unittests": { + "label": "//chrome/chrome_cleaner:chrome_cleaner_unittests", + "type": "console_test_launcher", + }, + "chrome_elf_unittests": { + "label": "//chrome/chrome_elf:chrome_elf_unittests", + "type": "console_test_launcher", + }, + "chrome_java_test_pagecontroller_junit_tests": { + "label": "//chrome/test/android:chrome_java_test_pagecontroller_junit_tests", + "type": "generated_script", + }, + "chrome_java_test_pagecontroller_tests": { + "label": "//chrome/test/android:chrome_java_test_pagecontroller_tests", + "type": "console_test_launcher", + }, + "chrome_java_test_wpr_tests": { + "label": "//chrome/test/android:chrome_java_test_wpr_tests", + "type": "console_test_launcher", + }, + "chrome_junit_tests": { + "label": "//chrome/android:chrome_junit_tests", + "type": "generated_script", + }, + "chrome_nocompile_tests": { + "label": "//chrome/android:chrome_nocompile_tests", + "type": "additional_compile_target", + }, + "chrome_official_builder": { + "label": "//:chrome_official_builder", + "type": "additional_compile_target", + }, + "chrome_official_builder_no_unittests": { + "label": "//:chrome_official_builder_no_unittests", + "type": "additional_compile_target", + }, + "chrome_pkg": { + "label": "//chrome/app:chrome_pkg", + "type": "additional_compile_target", + }, + "chrome_private_code_test": { + "label": "//chrome:chrome_private_code_test", + "type": "generated_script", + }, + "chrome_public_apk": { + "label": "//chrome/android:chrome_public_apk", + "type": "additional_compile_target", + }, + "chrome_public_smoke_test": { + "label": "//chrome/android:chrome_public_smoke_test", + "type": "console_test_launcher", + }, + "chrome_public_test_apk": { + "label": "//chrome/android:chrome_public_test_apk", + "type": "console_test_launcher", + }, + "chrome_public_test_vr_apk": { + "label": "//chrome/android:chrome_public_test_vr_apk", + "type": "console_test_launcher", + }, + "chrome_public_unit_test_apk": { + "label": "//chrome/android:chrome_public_unit_test_apk", + "type": "console_test_launcher", + }, + "chrome_public_wpt": { + "label": "//chrome/android:chrome_public_wpt", + "type": "generated_script", + }, + "chrome_sandbox": { + "label": "//sandbox/linux:chrome_sandbox", + "type": "additional_compile_target", + }, + "chrome_sizes": { + "label": "//chrome/test:chrome_sizes", + "type": "generated_script", + }, + "chrome_webapk_integration_tests": { + "label": "//chrome/test/android:chrome_webapk_integration_tests", + "type": "console_test_launcher", + }, + "chromedriver": { + "label": "//chrome/test/chromedriver:chromedriver_server", + "type": "additional_compile_target", + }, + "chromedriver_group": { + "label": "//:chromedriver_group", + "type": "additional_compile_target", + }, + "chromedriver_py_tests": { + "label": "//chrome/test/chromedriver:chromedriver_py_tests", + "type": "script", + "script": "//testing/xvfb.py", + "args": [ + "../../testing/scripts/run_chromedriver_tests.py", + "../../chrome/test/chromedriver/test/run_py_tests.py", + "--chromedriver=chromedriver", + "--log-path=${ISOLATED_OUTDIR}/chromedriver.log", + ], + }, + "chrome_variations_tast_tests": { + "label": "//chromeos:chrome_variations_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "chromedriver_webview_shell_apk": { + "label": "//chrome/test/chromedriver/test/webview_shell:chromedriver_webview_shell_apk", + "type": "additional_compile_target", + }, + "webdriver_wpt_tests": { + "label": "//:webdriver_wpt_tests", + "type": "generated_script", + "args": [ + "../../chrome/test/chromedriver/test/run_webdriver_tests.py", + "-v", + "--chromedriver=chromedriver", + "--log-path=${ISOLATED_OUTDIR}/chromedriver.log", + "--output-dir=${ISOLATED_OUTDIR}", + "--test-path=../../third_party/blink/web_tests/external/wpt/webdriver/tests/", + ], + }, + "wpt_tests_isolate": { + "label": "//:wpt_tests_isolate", + "type": "generated_script", + }, + "wpt_tests_isolate_content_shell": { + "label": "//:wpt_tests_isolate_content_shell", + "type": "generated_script", + }, + "wpt_tests_ios": { + "label": "//ios/chrome/test/wpt:wpt_tests_ios", + "type": "generated_script", + }, + "chrome/browser/media/router": { + "label": "//chrome/browser/media/router:router", + "type": "additional_compile_target", + }, + "chrome/browser/media/router:openscreen_unittests": { + "label": "//chrome/browser/media/router:openscreen_unittests", + "type": "additional_compile_target", + }, + "chrome/browser/media/router:unittests": { + "label": "//chrome/browser/media/router:unittests", + "type": "additional_compile_target", + }, + "chrome/installer/linux": { + "label": "//chrome/installer/linux:linux", + "type": "additional_compile_target", + }, + "chrome/installer/mac": { + "label": "//chrome/installer/mac:mac", + "type": "additional_compile_target", + }, + "variations_smoke_tests": { + "label": "//chrome/test:variations_smoke_tests", + "type": "generated_script", + }, + "chromedriver_replay_unittests": { + "label": "//chrome/test/chromedriver:chromedriver_replay_unittests", + "type": "script", + "script": "//chrome/test/chromedriver/log_replay/client_replay_unittest.py", + }, + "chromedriver_unittests": { + "label": "//chrome/test/chromedriver:chromedriver_unittests", + "type": "windowed_test_launcher", + }, + "chromeos_components_unittests": { + "label": "//chromeos/components:chromeos_components_unittests", + "type": "console_test_launcher", + }, + "chromeos_unittests": { + "label": "//chromeos:chromeos_unittests", + "type": "console_test_launcher", + }, + "chromium_builder_asan": { + "label": "//:chromium_builder_asan", + "type": "additional_compile_target", + }, + "chromium_builder_perf": { + "label": "//:chromium_builder_perf", + "type": "additional_compile_target", + }, + "chromiumos_preflight": { + "label": "//:chromiumos_preflight", + "type": "additional_compile_target", + }, + "color_unittests": { + "label": "//ui/color:color_unittests", + "type": "console_test_launcher", + }, + "command_buffer_perftests": { + "label": "//gpu:command_buffer_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "command_buffer_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], + }, + "components/media_router/common/providers/cast/channel": { + "label": "//components/media_router/common/providers/cast/channel:cast_channel", + "type": "additional_compile_target", + }, + "components/media_router/common/providers/cast/channel:unit_tests": { + "label": "//components/media_router/common/providers/cast/channel:unit_tests", + "type": "additional_compile_target", + }, + "components/media_router/common/providers/cast/certificate": { + "label": "//components/media_router/common/providers/cast/certificate", + "type": "additional_compile_target", + }, + "components/media_router/common/providers/cast/certificate:unit_tests": { + "label": "//components/media_router/common/providers/cast/certificate:unit_tests", + "type": "additional_compile_target", + }, + "components/mirroring/browser": { + "label": "//components/mirroring/browser:browser", + "type": "additional_compile_target", + }, + "components/mirroring/service:mirroring_service": { + "label": "//components/mirroring/service:mirrroring_service", + "type": "additional_compile_target", + }, + "components/mirroring:mirroring_tests": { + "label": "//components/mirroring:mirroring_tests", + "type": "additional_compile_target", + }, + "components/mirroring:mirroring_unittests": { + "label": "//components/mirroring:mirroring_unittests", + "type": "additional_compile_target", + }, + "components/openscreen_platform": { + "label": "//components/openscreen_platform", + "type": "additional_compile_target", + }, + "components_browsertests": { + "label": "//components:components_browsertests", + "type": "windowed_test_launcher", + }, + "components_junit_tests": { + "label": "//components:components_junit_tests", + "type": "generated_script", + }, + "components_perftests": { + "label": "//components:components_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "--xvfb", + "--non-telemetry=true", + "components_perftests", + ], + }, + "components_unittests": { + "label": "//components:components_unittests", + "type": "windowed_test_launcher", + }, + "compositor_unittests": { + "label": "//ui/compositor:compositor_unittests", + "type": "windowed_test_launcher", + }, + "content_browsertests": { + "label": "//content/test:content_browsertests", + "type": "windowed_test_launcher", + }, + "content_junit_tests": { + "label": "//content/public/android:content_junit_tests", + "type": "generated_script", + }, + "content_nocompile_tests": { + "label": "//content/test:content_nocompile_tests", + "type": "console_test_launcher", + }, + "content_shell_crash_test": { + "label": "//content/shell:content_shell_crash_test", + "type": "script", + "script": "//testing/scripts/content_shell_crash_test.py", + }, + "content_shell_test_apk": { + "label": "//content/shell/android:content_shell_test_apk", + "type": "console_test_launcher", + }, + "content_unittests": { + "label": "//content/test:content_unittests", + "type": "windowed_test_launcher", + }, + "core_runtime_simple": { + "label": "//chromecast/cast_core:core_runtime_simple", + "type": "additional_compile_target", + }, + "courgette_unittests": { + "label": "//courgette:courgette_unittests", + "type": "console_test_launcher", + }, + "crashpad_tests": { + "label": "//third_party/crashpad/crashpad:crashpad_tests", + "type": "console_test_launcher", + }, + "gnrt_unittests": { + "label": "//tools/crates/gnrt:gnrt_unittests", + "type": "console_test_launcher", + }, + "cronet_package": { + "label": "//components/cronet:cronet_package", + "type": "additional_compile_target", + }, + "cronet_perf_test_apk": { + "label": "//components/cronet/android:cronet_perf_test_apk", + "type": "additional_compile_target", + }, + "cronet_sample_test_apk": { + "label": "//components/cronet/android:cronet_sample_test_apk", + "type": "console_test_launcher", + }, + "cronet_sizes": { + "label": "//components/cronet/android:cronet_sizes", + "type": "generated_script", + }, + "cronet_smoketests_missing_native_library_instrumentation_apk": { + "label": "//components/cronet/android:cronet_smoketests_missing_native_library_instrumentation_apk", + "type": "console_test_launcher", + }, + "cronet_smoketests_platform_only_instrumentation_apk": { + "label": "//components/cronet/android:cronet_smoketests_platform_only_instrumentation_apk", + "type": "console_test_launcher", + }, + "cronet_test": { + "label": "//components/cronet/ios/test:cronet_test", + "type": "generated_script", + }, + "cronet_test_instrumentation_apk": { + "label": "//components/cronet/android:cronet_test_instrumentation_apk", + "type": "console_test_launcher", + }, + "cronet_tests": { + "label": "//components/cronet:cronet_tests", + "type": "console_test_launcher", + }, + "cronet_tests_android": { + "label": "//components/cronet/android:cronet_tests_android", + "type": "console_test_launcher", + }, + "cronet_unittests": { + "label": "//components/cronet:cronet_unittests", + "type": "console_test_launcher", + }, + "cronet_unittests_android": { + "label": "//components/cronet/android:cronet_unittests_android", + "type": "console_test_launcher", + }, + "crypto_unittests": { + "label": "//crypto:crypto_unittests", + "type": "console_test_launcher", + }, + "dawn_end2end_tests": { + "label": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests", + "type": "windowed_test_launcher", + }, + "dawn_perf_tests": { + "label": "//third_party/dawn/src/dawn/tests:dawn_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "dawn_perf_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], + }, + "dbus_unittests": { + "label": "//dbus:dbus_unittests", + "type": "windowed_test_launcher", + }, + "delayloads_unittests": { + "label": "//chrome/test:delayloads_unittests", + "type": "console_test_launcher", + }, + "device_junit_tests": { + "label": "//device:device_junit_tests", + "type": "generated_script", + }, + "device_unittests": { + "label": "//device:device_unittests", + "type": "console_test_launcher", + }, + "disk_usage_tast_test": { + "label": "//chromeos:disk_usage_tast_test", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "display_unittests": { + "label": "//ui/display:display_unittests", + "type": "console_test_launcher", + }, + "dump_syms": { + "label": "//third_party/breakpad:dump_syms", + "type": "additional_compile_target", + }, + "elevation_service_unittests": { + "label": "//chrome/elevation_service:elevation_service_unittests", + "type": "windowed_test_launcher", + }, + "empty_main": { + "label": "//testing:empty_main", + "type": "additional_compile_target", + }, + "events_unittests": { + "label": "//ui/events:events_unittests", + "type": "windowed_test_launcher", + }, + "exo_unittests": { + "label": "//components/exo:exo_unittests", + "type": "windowed_test_launcher", + }, + "extensions_browsertests": { + "label": "//extensions:extensions_browsertests", + "type": "windowed_test_launcher", + }, + "extensions_unittests": { + "label": "//extensions:extensions_unittests", + "type": "windowed_test_launcher", + }, + "filesystem_service_unittests": { + "label": "//components/services/filesystem:filesystem_service_unittests", + "type": "console_test_launcher", + }, + "flatbuffers_unittests": { + "label": "//third_party/flatbuffers:flatbuffers_unittests", + "type": "script", + "script": "//testing/scripts/run_flatbuffers_unittests.py", + }, + "fuchsia_pytype": { + "label": "//testing:fuchsia_pytype", + "type": "script", + "script": "//build/fuchsia/test/run_pytype.py", + }, + "fuchsia_sizes": { + "label": "//tools/fuchsia/size_tests:fuchsia_sizes", + "type": "generated_script", + }, + "gcm_unit_tests": { + "label": "//google_apis/gcm:gcm_unit_tests", + "type": "console_test_launcher", + }, + "gcp_unittests": { + "label": "//chrome/credential_provider/test:gcp_unittests", + "type": "console_test_launcher", + }, + "test_ash_chrome_cipd_yaml": { + "label": "//chrome/test:test_ash_chrome_cipd_yaml", + "type": "additional_compile_target", + }, + "gfx_unittests": { + "label": "//ui/gfx:gfx_unittests", + "type": "console_test_launcher", + }, + "gin_unittests": { + "label": "//gin:gin_unittests", + "type": "console_test_launcher", + }, + "gl_tests": { + "label": "//gpu:gl_tests", + "type": "windowed_test_launcher", + }, + "gl_unittests": { + "label": "//ui/gl:gl_unittests", + "type": "windowed_test_launcher", + }, + "gl_unittests_ozone": { + "label": "//ui/gl:gl_unittests_ozone", + "label_type": "group", + "type": "windowed_test_launcher", + "executable": "gl_unittests", + }, + "gles2_conform_test": { + "label": "//gpu/gles2_conform_support:gles2_conform_test", + "type": "console_test_launcher", + }, + "gn_all": { + "label": "//:gn_all", + "type": "additional_compile_target", + }, + "gold_common_pytype": { + "label": "//build:gold_common_pytype", + "type": "script", + "script": "//build/skia_gold_common/run_pytype.py", + }, + "google_apis_unittests": { + "label": "//google_apis:google_apis_unittests", + "type": "console_test_launcher", + }, + "gpu_perftests": { + "label": "//gpu:gpu_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "gpu_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], + }, + "gpu_pytype": { + "label": "//content/test:gpu_pytype", + "type": "script", + "script": "//content/test/gpu/run_pytype.py", + }, + "gpu_unittests": { + "label": "//gpu:gpu_unittests", + "type": "windowed_test_launcher", + }, + "grit_python_unittests": { + "label": "//tools/grit:grit_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", + "args": [ + "../../tools/grit/grit/test_suite_all.py", + ], + }, + "gwp_asan_unittests": { + "label": "//components/gwp_asan:gwp_asan_unittests", + "type": "console_test_launcher", + }, + "headless_browsertests": { + "label": "//headless:headless_browsertests", + "type": "console_test_launcher", + }, + "headless_unittests": { + "label": "//headless:headless_unittests", + "type": "console_test_launcher", + }, + "install_static_unittests": { + "label": "//chrome/install_static:install_static_unittests", + "type": "console_test_launcher", + }, + "installer_util_unittests": { + "label": "//chrome/installer/util:installer_util_unittests", + "type": "console_test_launcher", + }, + "interactive_ui_tests": { + "label": "//chrome/test:interactive_ui_tests", + "type": "windowed_test_launcher", + "args": [ + "--snapshot-output-dir=${ISOLATED_OUTDIR}", + ], + }, + "ios/chrome/app:chrome": { + "label": "//ios/chrome/app:chrome", + "type": "additional_compile_target", + }, + "ios/chrome/test:all_fuzzer_tests": { + "label": "//ios/chrome/test:all_fuzzer_tests", + "type": "additional_compile_target", + }, + "ios_chrome_clusterfuzz_asan_build": { + "label": "//ios/chrome/test/wpt:ios_chrome_clusterfuzz_asan_build", + "type": "additional_compile_target", + }, + "ios_chrome_unittests": { + "label": "//ios/chrome/test:ios_chrome_unittests", + "type": "generated_script", + }, + "ios_chrome_bookmarks_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_integration_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_settings_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_signin_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_smoke_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_ui_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module", + "type": "generated_script", + }, + "ios_chrome_web_eg2tests_module": { + "label": "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module", + "type": "generated_script", + }, + "ios_crash_xcuitests_module": { + "label": "//third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module", + "type": "generated_script", + }, + "ios_components_unittests": { + "label": "//ios/components:ios_components_unittests", + "type": "generated_script", + }, + "ios_net_unittests": { + "label": "//ios/net:ios_net_unittests", + "type": "generated_script", + }, + "ios_remoting_unittests": { + "label": "//remoting/ios:ios_remoting_unittests", + "type": "generated_script", + }, + "ios_showcase_eg2tests_module": { + "label": "//ios/showcase:ios_showcase_eg2tests_module", + "type": "generated_script", + }, + "ios_swift_interop_xcuitests_module": { + "label": "//ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module", + "type": "generated_script", + }, + "ios_testing_unittests": { + "label": "//ios/testing:ios_testing_unittests", + "type": "generated_script", + }, + "ios_web_inttests": { + "label": "//ios/web:ios_web_inttests", + "type": "generated_script", + }, + "ios_web_shell_eg2tests_module": { + "label": "//ios/web/shell/test:ios_web_shell_eg2tests_module", + "type": "generated_script", + }, + "ios_web_unittests": { + "label": "//ios/web:ios_web_unittests", + "type": "generated_script", + }, + "ios_web_view_inttests": { + "label": "//ios/web_view:ios_web_view_inttests", + "type": "generated_script", + }, + "ios_web_view_unittests": { + "label": "//ios/web_view:ios_web_view_unittests", + "type": "generated_script", + }, + "ipc_tests": { + "label": "//ipc:ipc_tests", + "type": "console_test_launcher", + }, + "junit_unit_tests": { + "label": "//testing/android/junit:junit_unit_tests", + "type": "generated_script", + }, + "keyboard_accessory_junit_tests": { + "label": "//chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests", + "type": "junit_test", + }, + "keyboard_unittests": { + "label": "//ash/keyboard/ui:keyboard_unittests", + "type": "windowed_test_launcher", + }, + "lacros_all_tast_tests": { + "label": "//chromeos/lacros:lacros_all_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "lacros_all_tast_tests_informational": { + "label": "//chromeos/lacros:lacros_all_tast_tests_informational", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "lacros_chrome_browsertests": { + "label": "//chrome/test:lacros_chrome_browsertests", + "type": "windowed_test_launcher", + }, + "lacros_chrome_browsertests_run_in_series": { + "label": "//chrome/test:lacros_chrome_browsertests_run_in_series", + "type": "windowed_test_launcher", + "args": [ + "--test-launcher-jobs=1", + ], + }, + "lacros_chrome_unittests": { + "label": "//chrome/test:lacros_chrome_unittests", + "type": "console_test_launcher", + }, + "lacros_cq_tast_tests_eve": { + "label": "//chromeos/lacros:lacros_cq_tast_tests_eve", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "lacros_cq_tast_tests_jacuzzi": { + "label": "//chromeos/lacros:lacros_cq_tast_tests_jacuzzi", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "lacros_fyi_tast_tests": { + "label": "//chromeos/lacros:lacros_fyi_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "lacros_variations_tast_tests": { + "label": "//chromeos/lacros:lacros_variations_tast_tests", + "type": "generated_script", + "args": [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], + }, + "latency_unittests": { + "label": "//ui/latency:latency_unittests", + "type": "console_test_launcher", + }, + "libcups_unittests": { + "label": "//chrome/services/cups_proxy:libcups_unittests", + "type": "console_test_launcher", + }, + "libjingle_xmpp_unittests": { + "label": "//third_party/libjingle_xmpp:libjingle_xmpp_unittests", + "type": "console_test_launcher", + }, + "liburlpattern_unittests": { + "label": "//third_party/liburlpattern:liburlpattern_unittests", + "type": "console_test_launcher", + }, + "linux_symbols": { + "label": "//chrome:linux_symbols", + "type": "additional_compile_target", + }, + "load_library_perf_tests": { + "label": "//chrome/test:load_library_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "load_library_perf_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + ], + }, + "mac_signing_tests": { + "label": "//chrome/installer/mac:mac_signing_tests", + "type": "generated_script", + }, + "media_base_junit_tests": { + "label": "//media/base/android:media_base_junit_tests", + "type": "generated_script", + }, + "media_perftests": { + "label": "//media:media_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "media_perftests", + "--non-telemetry=true", + "--single-process-tests", + "--test-launcher-retry-limit=0", + "--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::*unoptimized_aligned", + ], + }, + "media_router_e2e_tests": { + "label": "//chrome/test/media_router:media_router_e2e_tests", + "type": "script", + "script": "//chrome/test/media_router/internal/media_router_tests.py", + "args": [ + "--test_binary", + "./interactive_ui_tests", + ], + }, + "media_unittests": { + "label": "//media:media_unittests", + "type": "windowed_test_launcher", + }, + "message_center_unittests": { + "label": "//ui/message_center:message_center_unittests", + "type": "windowed_test_launcher", + }, + "microdump_stackwalk": { + "label": "//third_party/breakpad:microdump_stackwalk", + "type": "additional_compile_target", + }, + "midi_unittests": { + "label": "//media/midi:midi_unittests", + "type": "windowed_test_launcher", + }, + "mini_installer": { + "label": "//chrome/installer/mini_installer:mini_installer", + "type": "additional_compile_target", + }, + "mini_installer_tests": { + "label": "//chrome/test/mini_installer:mini_installer_tests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", + "args": [ + "../../chrome/test/mini_installer/run_mini_installer_tests.py", + "--output-dir=${ISOLATED_OUTDIR}", + ], + }, + "module_installer_junit_tests": { + "label": "//components/module_installer/android:module_installer_junit_tests", + "type": "generated_script", + }, + "monochrome_public_smoke_test": { + "label": "//chrome/android:monochrome_public_smoke_test", + "type": "console_test_launcher", + }, + "monochrome_public_bundle_smoke_test": { + "label": "//chrome/android:monochrome_public_bundle_smoke_test", + "type": "console_test_launcher", + }, + "mojo_python_unittests": { + "label": "//mojo/public/tools:mojo_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", + "args": [ + "../../mojo/public/tools/run_all_python_unittests.py", + ], + }, + "mojo_rust": { + "label": "//mojo/public/rust:mojo_rust", + "type": "additional_compile_target", + }, + "mojo_rust_integration_unittests": { + "label": "//mojo/public/rust:mojo_rust_integration_unittests", + "type": "console_test_launcher", + }, + "mojo_rust_unittests": { + "label": "//mojo/public/rust:mojo_rust_unittests", + "type": "console_test_launcher", + }, + "mojo_test_apk": { + "label": "//mojo/public/java/system:mojo_test_apk", + "type": "console_test_launcher", + }, + "mojo_unittests": { + "label": "//mojo:mojo_unittests", + "type": "console_test_launcher", + }, + "monochrome_public_apk_checker": { + "label": "//chrome/android/monochrome:monochrome_public_apk_checker", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", + "args": [ + "../../chrome/android/monochrome/scripts/monochrome_python_tests.py", + "--chrome-apk", + "apks/ChromePublic.apk", + "--chrome-pathmap", + "apks/ChromePublic.apk.pathmap.txt", + "--system-webview-apk", + "apks/SystemWebView.apk", + "--system-webview-pathmap", + "apks/SystemWebView.apk.pathmap.txt", + "--monochrome-apk", + "apks/MonochromePublic.apk", + "--monochrome-pathmap", + "apks/MonochromePublic.apk.pathmap.txt", + ], + }, + "monochrome_public_test_ar_apk": { + "label": "//chrome/android:monochrome_public_test_ar_apk", + "type": "console_test_launcher", + }, + "monochrome_static_initializers": { + "label": "//chrome/android:monochrome_static_initializers", + "type": "additional_compile_target", + }, + "nacl_helper": { + "label": "//components/nacl/loader:nacl_helper", + "type": "additional_compile_target", + "skip_usage_check": True, + }, + "nacl_helper_bootstrap": { + "label": "//native_client/src/trusted/service_runtime/linux:bootstrap", + "type": "additional_compile_target", + "skip_usage_check": True, + }, + "nacl_loader_unittests": { + "label": "//components/nacl/loader:nacl_loader_unittests", + "type": "console_test_launcher", + }, + "build_rust_tests": { + "label": "//build/rust/tests:build_rust_tests", + "type": "generated_script", + }, + "native_theme_unittests": { + "label": "//ui/native_theme:native_theme_unittests", + "type": "windowed_test_launcher", + }, + "net_junit_tests": { + "label": "//net/android:net_junit_tests", + "type": "generated_script", + }, + "net_perftests": { + "label": "//net:net_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "net_perftests", + "--non-telemetry=true", + ], + }, + "net_unittests": { + "label": "//net:net_unittests", + "type": "console_test_launcher", + }, + "notification_helper_unittests": { + "label": "//chrome/notification_helper:notification_helper_unittests", + "type": "windowed_test_launcher", + }, + "openscreen_unittests": { + "label": "//chrome/browser/media/router:openscreen_unittests", + "type": "console_test_launcher", + }, + "ozone_gl_unittests": { + "label": "//ui/ozone/gl:ozone_gl_unittests", + "type": "console_test_launcher", + }, + "ozone_unittests": { + "label": "//ui/ozone:ozone_unittests", + "type": "console_test_launcher", + }, + "ozone_x11_unittests": { + "label": "//ui/ozone:ozone_x11_unittests", + "type": "windowed_test_launcher", + }, + "paint_preview_junit_tests": { + "label": "//components/paint_preview/player/android:paint_preview_junit_tests", + "type": "generated_script", + }, + "password_check_junit_tests": { + "label": "//chrome/browser/password_check/android:password_check_junit_tests", + "type": "generated_script", + }, + "password_manager_junit_tests": { + "label": "//chrome/browser/password_manager/android:password_manager_junit_tests", + "type": "generated_script", + }, + "pdf_fuzzers": { + "label": "//pdf/pdfium/fuzzers:pdf_fuzzers", + "type": "additional_compile_target", + }, + "pdf_unittests": { + "label": "//pdf:pdf_unittests", + "type": "console_test_launcher", + }, + "pdfium_test": { + "label": "//third_party/pdfium/samples:pdfium_test", + "type": "additional_compile_target", + }, + "perfetto_unittests": { + "label": "//third_party/perfetto:perfetto_unittests", + "type": "console_test_launcher", + }, + "performance_browser_tests": { + "label": "//chrome/test:performance_browser_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "browser_tests", + "--non-telemetry=true", + "--full-performance-run", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + "--test-launcher-print-test-stdio=always", + "--ui-test-action-timeout=60000", + "--ui-test-action-max-timeout=60000", + "--test-launcher-timeout=60000", + "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*", + ], + }, + "performance_test_suite": { + "label": "//chrome/test:performance_test_suite", + "type": "generated_script", + }, + "performance_test_suite_android_clank_chrome": { + "label": "//chrome/test:performance_test_suite_android_clank_chrome", + "type": "generated_script", + }, + "performance_test_suite_android_clank_monochrome_64_32_bundle": { + "label": "//chrome/test:performance_test_suite_android_clank_monochrome_64_32_bundle", + "type": "generated_script", + }, + "performance_test_suite_android_clank_monochrome_bundle": { + "label": "//chrome/test:performance_test_suite_android_clank_monochrome_bundle", + "type": "generated_script", + }, + "performance_test_suite_android_clank_trichrome_chrome_google_64_32_bundle": { + "label": "//chrome/test:performance_test_suite_android_clank_trichrome_chrome_google_64_32_bundle", + "type": "generated_script", + }, + "performance_test_suite_android_clank_trichrome_bundle": { + "label": "//chrome/test:performance_test_suite_android_clank_trichrome_bundle", + "type": "generated_script", + }, + "performance_test_suite_eve": { + "label": "//chrome/test:performance_test_suite_eve", + "type": "generated_script", + }, + "performance_test_suite_octopus": { + "label": "//chrome/test:performance_test_suite_octopus", + "type": "generated_script", + }, + "performance_web_engine_test_suite": { + "label": "//content/test:performance_web_engine_test_suite", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "../../content/test/gpu/run_telemetry_benchmark_fuchsia.py", + "--per-test-logs-dir", + ], + }, + "performance_webview_test_suite": { + "label": "//chrome/test:performance_webview_test_suite", + "type": "script", + "script": "//third_party/catapult/devil/devil/android/tools/system_app.py", + "args": [ + "remove", + "--package", + "com.android.webview", + "com.google.android.webview", + "-v", + "--", + "../../testing/scripts/run_performance_tests.py", + "../../tools/perf/run_benchmark", + ], + }, + "polymer_tools_python_unittests": { + "label": "//tools/polymer:polymer_tools_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", + "args": [ + "../../tools/polymer/run_polymer_tools_tests.py", + ], + }, + "postmortem-metadata": { + "label": "//v8:postmortem-metadata", + "type": "additional_compile_target", + }, + "power_sampler_unittests": { + "label": "//tools/mac/power:power_sampler_unittests", + "type": "console_test_launcher", + }, + "ppapi_unittests": { + "label": "//ppapi:ppapi_unittests", + "type": "console_test_launcher", + }, + "previous_version_mini_installer": { + "label": "//chrome/installer/mini_installer:previous_version_mini_installer", + "type": "additional_compile_target", + }, + "printing_unittests": { + "label": "//printing:printing_unittests", + "type": "console_test_launcher", + }, + "private_code_failure_test": { + "label": "//build/private_code_test:private_code_failure_test", + "type": "generated_script", + }, + "profile_provider_unittest": { + "label": "//chrome/browser/metrics/perf:profile_provider_unittest", + "type": "console_test_launcher", + }, + "push_apps_to_background_apk": { + "label": "//tools/android/push_apps_to_background:push_apps_to_background_apk", + "type": "additional_compile_target", + }, + "remoting/client:client": { + "label": "//remoting/client:client", + "type": "additional_compile_target", + }, + "remoting/host:host": { + "label": "//remoting/host:host", + "type": "additional_compile_target", + }, + "remoting_unittests": { + "label": "//remoting:remoting_unittests", + "type": "console_test_launcher", + }, + "resource_sizes_chromecast": { + "label": "//chromecast:resource_sizes_chromecast", + "type": "generated_script", + }, + "resource_sizes_cronet_sample_apk": { + "label": "//components/cronet/android:resource_sizes_cronet_sample_apk", + "type": "generated_script", + }, + "resource_sizes_lacros_chrome": { + "label": "//chromeos/lacros:resource_sizes_lacros_chrome", + "type": "generated_script", + }, + "resource_sizes_monochrome_public_minimal_apks": { + "label": "//chrome/android:resource_sizes_monochrome_public_minimal_apks", + "type": "generated_script", + }, + "resource_sizes_trichrome": { + "label": "//chrome/android:resource_sizes_trichrome", + "type": "generated_script", + }, + "resource_sizes_system_webview_bundle": { + "label": "//android_webview:resource_sizes_system_webview_bundle", + "type": "generated_script", + }, + "rust_build_tests": { + "label": "//build/rust/tests", + "type": "additional_compile_target", + }, + "rust_gtest_interop_unittests": { + "label": "//testing/rust_gtest_interop:rust_gtest_interop_unittests", + "type": "console_test_launcher", + }, + "sandbox_linux_unittests": { + "label": "//sandbox/linux:sandbox_linux_unittests", + "type": "console_test_launcher", + }, + "sandbox_unittests": { + "label": "//sandbox:sandbox_unittests", + "type": "console_test_launcher", + }, + "sbox_integration_tests": { + "label": "//sandbox/win:sbox_integration_tests", + "type": "console_test_launcher", + }, + "sbox_unittests": { + "label": "//sandbox/win:sbox_unittests", + "type": "console_test_launcher", + }, + "sbox_validation_tests": { + "label": "//sandbox/win:sbox_validation_tests", + "type": "console_test_launcher", + }, + "services_junit_tests": { + "label": "//services:services_junit_tests", + "type": "generated_script", + }, + "service_manager_unittests": { + "label": "//services/service_manager/tests:service_manager_unittests", + "type": "console_test_launcher", + }, + "services_unittests": { + "label": "//services:services_unittests", + "type": "windowed_test_launcher", + }, + "setup_unittests": { + "label": "//chrome/installer/setup:setup_unittests", + "type": "console_test_launcher", + }, + "shell_encryption_unittests": { + "label": "//third_party/shell-encryption:shell_encryption_unittests", + "type": "console_test_launcher", + }, + "shell_dialogs_unittests": { + "label": "//ui/shell_dialogs:shell_dialogs_unittests", + "type": "console_test_launcher", + "args": [ + "--test-launcher-jobs=1", + ], + }, + "skia_unittests": { + "label": "//skia:skia_unittests", + "type": "console_test_launcher", + }, + "snapshot_unittests": { + "label": "//ui/snapshot:snapshot_unittests", + "type": "windowed_test_launcher", + }, + "sql_unittests": { + "label": "//sql:sql_unittests", + "type": "console_test_launcher", + }, + "strip_lacros_files": { + "label": "//chrome:strip_lacros_files", + "type": "additional_compile_target", + }, + "storage_unittests": { + "label": "//storage:storage_unittests", + "type": "console_test_launcher", + }, + "symupload": { + "label": "//third_party/breakpad:symupload", + "type": "additional_compile_target", + }, + "sync_integration_tests": { + "label": "//chrome/test:sync_integration_tests", + "type": "windowed_test_launcher", + }, + "sync_performance_tests": { + "label": "//chrome/test:sync_performance_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "sync_performance_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], + }, + "system_webview_apk": { + "label": "//android_webview:system_webview_apk", + "type": "additional_compile_target", + }, + "system_webview_shell_apk": { + "label": "//android_webview/tools/system_webview_shell:system_webview_shell_apk", + "type": "additional_compile_target", + }, + "system_webview_shell_layout_test_apk": { + "label": "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk", + "type": "console_test_launcher", + }, + "system_webview_wpt": { + "label": "//android_webview/test:system_webview_wpt", + "type": "generated_script", + }, + "telemetry_gpu_integration_test": { + "label": "//chrome/test:telemetry_gpu_integration_test", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", + "args": [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], + }, + "telemetry_gpu_integration_test_android_chrome": { + "label": "//chrome/test:telemetry_gpu_integration_test_android_chrome", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", + "args": [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], + }, + "telemetry_gpu_integration_test_android_webview": { + "label": "//chrome/test:telemetry_gpu_integration_test_android_webview", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", + "args": [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], + }, + "telemetry_gpu_integration_test_fuchsia": { + "label": "//chrome/test:telemetry_gpu_integration_test_fuchsia", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", + "args": [ + "../../content/test/gpu/run_gpu_integration_test_fuchsia.py", + "--logs-dir", + "${ISOLATED_OUTDIR}", + ], + }, + "telemetry_gpu_integration_test_scripts_only": { + "label": "//chrome/test:telemetry_gpu_integration_test_scripts_only", + "type": "additional_compile_target", + }, + "telemetry_gpu_unittests": { + "label": "//chrome/test:telemetry_gpu_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "../../content/test/gpu/run_unittests.py", + "-v", + ], + }, + "ct_telemetry_perf_tests_without_chrome": { + "label": "//chrome/test:ct_telemetry_perf_tests_without_chrome", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "../../tools/perf/run_benchmark", + ], + }, + "telemetry_perf_unittests": { + "label": "//chrome/test:telemetry_perf_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "../../tools/perf/run_tests", + "-v", + ], + }, + "telemetry_perf_unittests_android_chrome": { + "label": "//chrome/test:telemetry_perf_unittests_android_chrome", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "../../tools/perf/run_tests", + "-v", + ], + }, + "telemetry_perf_unittests_android_monochrome": { + "label": "//chrome/test:telemetry_perf_unittests_android_monochrome", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "../../tools/perf/run_tests", + "-v", + ], + }, + "telemetry_unittests": { + "label": "//chrome/test:telemetry_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "--xvfb", + "../../tools/perf/run_telemetry_tests", + "-v", + "--jobs=1", + "--chrome-root", + "../../", + ], + }, + "test_cpp_including_rust_unittests": { + "label": "//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests", + "type": "console_test_launcher", + }, + "test_serde_json_lenient": { + "label": "//build/rust/tests/test_serde_json_lenient:test_serde_json_lenient", + "type": "console_test_launcher", + }, + "touch_to_fill_junit_tests": { + "label": "//chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests", + "type": "generated_script", + }, + "trace_processor_shell": { + "label": "//third_party/perfetto/src/trace_processor:trace_processor_shell", + "type": "additional_compile_target", + }, + "tracing_perftests": { + "label": "//components/tracing:tracing_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "tracing_perftests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], + }, + "traffic_annotation_auditor_dependencies": { + "label": "//:traffic_annotation_auditor_dependencies", + "type": "additional_compile_target", + }, + "trichrome_chrome_bundle_smoke_test": { + "label": "//chrome/android:trichrome_chrome_bundle_smoke_test", + "type": "console_test_launcher", + }, + "ui_android_unittests": { + "label": "//ui/android:ui_android_unittests", + "type": "console_test_launcher", + }, + "ui_base_unittests": { + "label": "//ui/base:ui_base_unittests", + "type": "windowed_test_launcher", + }, + "ui_chromeos_unittests": { + "label": "//ui/chromeos:ui_chromeos_unittests", + "type": "windowed_test_launcher", + }, + "ui_junit_tests": { + "label": "//ui/android:ui_junit_tests", + "type": "generated_script", + }, + "ui_touch_selection_unittests": { + "label": "//ui/touch_selection:ui_touch_selection_unittests", + "type": "windowed_test_launcher", + }, + "testing_pytype": { + "label": "//testing:testing_pytype", + "type": "script", + "script": "//testing/run_pytype.py", + }, + "unit_tests": { + "label": "//chrome/test:unit_tests", + "type": "windowed_test_launcher", + }, + "updater_tests": { + "label": "//chrome/updater:updater_tests", + "type": "console_test_launcher", + "args": [ + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + ], + }, + "updater_tests_system": { + "label": "//chrome/updater:updater_tests_system", + "type": "console_test_launcher", + "args": [ + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + "--exclude-paths-from-win-defender", + ], + }, + "updater_tests_win_uac": { + "label": "//chrome/updater:updater_tests_win_uac", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", + "args": [ + "test_service/run_command_as_standard_user.py", + "--command=updater_tests.exe", + "--test-launcher-bot-mode", + "--cfi-diag=0", + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + ], + }, + "chrome/updater:all": { + "label": "//chrome/updater:all", + "type": "additional_compile_target", + }, + "upload_trace_processor": { + "label": "//tools/perf/core/perfetto_binary_roller:upload_trace_processor", + "type": "generated_script", + }, + "url_unittests": { + "label": "//url:url_unittests", + "type": "console_test_launcher", + }, + "usage_time_limit_unittests": { + "label": "//chrome/test:usage_time_limit_unittests", + "type": "console_test_launcher", + }, + "vaapi_unittest": { + "label": "//media/gpu/vaapi:vaapi_unittest", + "type": "console_test_launcher", + }, + "fake_libva_driver_unittest": { + "label": "//media/gpu/vaapi/test/fake_libva_driver:fake_libva_driver_unittest", + "type": "console_test_launcher", + }, + "views_examples_unittests": { + "label": "//ui/views/examples:views_examples_unittests", + "type": "windowed_test_launcher", + }, + "views_perftests": { + "label": "//ui/views:views_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "--xvfb", + "--non-telemetry=true", + "views_perftests", + ], + }, + "views_unittests": { + "label": "//ui/views:views_unittests", + "type": "windowed_test_launcher", + }, + "viz_unittests": { + "label": "//components/viz:viz_unittests", + "type": "windowed_test_launcher", + }, + "vr_android_unittests": { + "label": "//chrome/browser/android/vr:vr_android_unittests", + "type": "console_test_launcher", + }, + "vr_common_perftests": { + "label": "//chrome/browser/vr:vr_common_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "vr_common_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], + }, + "vr_common_unittests": { + "label": "//chrome/browser/vr:vr_common_unittests", + "type": "console_test_launcher", + }, + "vr_perf_tests": { + "label": "//tools/perf/contrib/vr_benchmarks:vr_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "args": [ + "../../tools/perf/run_benchmark", + ], + }, + "vrcore_fps_test": { + "label": "//chrome/test/vr/perf:vrcore_fps_test", + "type": "script", + "script": "//chrome/test/vr/perf/vrcore_fps/run_vrcore_fps_test.py", + "args": [ + "-v", + ], + }, + "vulkan_tests": { + "label": "//gpu/vulkan:vulkan_tests", + "type": "windowed_test_launcher", + }, + "wayland_client_perftests": { + "label": "//components/exo/wayland:wayland_client_perftests", + "type": "windowed_test_launcher", + }, + "wayland_client_tests": { + "label": "//components/exo/wayland:wayland_client_tests", + "type": "windowed_test_launcher", + }, + "web_engine_browsertests": { + "label": "//fuchsia_web/webengine:web_engine_browsertests", + "type": "console_test_launcher", + }, + "web_engine_integration_tests": { + "label": "//fuchsia_web/webengine:web_engine_integration_tests", + "type": "console_test_launcher", + }, + "web_engine_shell_pkg": { + "label": "//fuchsia_web/shell:web_engine_shell_pkg", + "type": "additional_compile_target", + }, + "web_engine_unittests": { + "label": "//fuchsia_web/webengine:web_engine_unittests", + "type": "console_test_launcher", + }, + "webapk_client_junit_tests": { + "label": "//chrome/android/webapk/libs/client:webapk_client_junit_tests", + "type": "generated_script", + }, + "webapk_shell_apk_h2o_junit_tests": { + "label": "//chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests", + "type": "generated_script", + }, + "webapk_shell_apk_junit_tests": { + "label": "//chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests", + "type": "generated_script", + }, + "webgpu_blink_web_tests": { + "label": "//:webgpu_blink_web_tests", + "type": "generated_script", + "args": [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], + }, + "weblayer_browsertests": { + "label": "//weblayer/test:weblayer_browsertests", + "type": "windowed_test_launcher", + }, + "webview_cts_tests": { + "label": "//android_webview/test:webview_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", + "args": [ + "--skip-expected-failures", + "--use-webview-provider", + "apks/SystemWebView.apk", + "--apk-under-test", + "apks/SystemWebView.apk", + "--use-apk-under-test-flags-file", + "-v", + ], + }, + "webview_trichrome_cts_tests": { + "label": "//android_webview/test:webview_trichrome_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", + "args": [ + "--skip-expected-failures", + "--additional-apk", + "apks/TrichromeLibrary.apk", + "--use-webview-provider", + "apks/TrichromeWebView.apk", + "--apk-under-test", + "apks/TrichromeWebView.apk", + "--use-apk-under-test-flags-file", + "-v", + ], + }, + "webview_trichrome_64_cts_tests": { + "label": "//android_webview/test:webview_trichrome_64_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", + "args": [ + "--skip-expected-failures", + "--additional-apk", + "apks/TrichromeLibrary64.apk", + "--use-webview-provider", + "apks/TrichromeWebView64.apk", + "--apk-under-test", + "apks/TrichromeWebView64.apk", + "--use-apk-under-test-flags-file", + "-v", + ], + }, + "webview_64_cts_tests": { + "label": "//android_webview/test:webview_64_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", + "args": [ + "--skip-expected-failures", + "--use-webview-provider", + "apks/SystemWebView64.apk", + "--apk-under-test", + "apks/SystemWebView64.apk", + "--use-apk-under-test-flags-file", + "-v", + ], + }, + "webengine_support_instrumentation_test_apk": { + "label": "//weblayer/browser/android/javatests:webengine_support_instrumentation_test_apk", + "type": "console_test_launcher", + }, + "weblayer_junit_tests": { + "label": "//weblayer/browser/java:weblayer_junit_tests", + "type": "junit_test", + }, + "webview_instrumentation_test_apk": { + "label": "//android_webview/test:webview_instrumentation_test_apk", + "type": "console_test_launcher", + }, + "webview_ui_test_app_test_apk": { + "label": "//android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk", + "type": "console_test_launcher", + "args": [ + "--use-apk-under-test-flags-file", + ], + }, + "wm_unittests": { + "label": "//ui/wm:wm_unittests", + "type": "windowed_test_launcher", + }, + "wtf_unittests": { + "label": "//third_party/blink/renderer/platform/wtf:wtf_unittests", + "type": "console_test_launcher", + }, + "xr_browser_tests": { + "label": "//chrome/test:xr_browser_tests", + "type": "windowed_test_launcher", + "executable": "run_xr_browser_tests.py", + "executable_suffix": "", + "args": [ + "--enable-gpu", + "--test-launcher-bot-mode", + "--test-launcher-jobs=1", + "--enable-pixel-output-in-tests", + ], + }, + "zlib_unittests": { + "label": "//third_party/zlib:zlib_unittests", + "type": "console_test_launcher", + "args": [ + "--test-launcher-timeout=400000", + ], + }, + "zucchini_unittests": { + "label": "//components/zucchini:zucchini_unittests", + "type": "console_test_launcher", + }, +}
diff --git a/infra/config/lib/targets.star b/infra/config/lib/targets.star new file mode 100644 index 0000000..927d79f --- /dev/null +++ b/infra/config/lib/targets.star
@@ -0,0 +1,243 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +"""Library for defining targets that the chromium family of recipes can build/test.""" + +load("@stdlib//internal/graph.star", "graph") +load("@stdlib//internal/luci/common.star", "keys") +load("./nodes.star", "nodes") + +_TARGET = nodes.create_unscoped_node_type("target") + +def _create_target( + *, + name, + type, + label, + label_type = None, + executable = None, + executable_suffix = None, + script = None, + skip_usage_check = False, + args = None): + target_key = _TARGET.add(name, props = dict( + type = type, + label = label, + label_type = label_type, + executable = executable, + executable_suffix = executable_suffix, + script = script, + skip_usage_check = skip_usage_check, + args = args, + )) + graph.add_edge(keys.project(), target_key) + +def _compile_target(*, name, label, skip_usage_check = False): + """Define a compile target to use in targets specs. + + A compile target provides a mapping to any ninja target that will + only be built, not executed. + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + """ + _create_target( + name = name, + type = "additional_compile_target", + label = label, + skip_usage_check = skip_usage_check, + ) + +def _console_test_launcher( + *, + name, + label, + label_type = None, + skip_usage_check = False, + args = None): + """Define a console test launcher target to use in targets specs. + + A console test launcher is a gtest-based test that uses the + parallelizing TestLauncher from //base/test:test_support but does + not need Xvfb. + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + label_type: The type of the label. This is used by MB to find + the generated runtime files in the correct place if the + target uses the test_launcher command-line conventions but + the label refers to a different type of target. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + args: The arguments to the test. These arguments will be + included when the test is run using "mb try" + """ + _create_target( + name = name, + type = "console_test_launcher", + label = label, + label_type = label_type, + skip_usage_check = skip_usage_check, + args = args, + ) + +def _generated_script(*, name, label, skip_usage_check = False, args = None): + """Define a generated script target to use in targets specs. + + A generated script target is a test that is executed via a script + generated at build time. The script must be in + output_dir/bin/run_$target (or output_dir\bin\run_$target.bat on + Windows). + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + args: The arguments to the test. These arguments will be + included when the test is run using "mb try" + """ + _create_target( + name = name, + type = "generated_script", + label = label, + skip_usage_check = skip_usage_check, + args = args, + ) + +def _junit_test(*, name, label, skip_usage_check = False): + """Define a junit test target to use in targets specs. + + A junit test target is a test using the JUnit test framework. + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + """ + _create_target( + name = name, + type = "junit_test", + label = label, + skip_usage_check = skip_usage_check, + ) + +def _script(*, name, label, script, skip_usage_check = False, args = None): + """Define a script target to use in targets specs. + + A script target is a test that is executed via a python script. + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + script: The GN path (e.g. //testing/scripts/foo.py" to the python + script to run. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + args: The arguments to the test. These arguments will be + included when the test is run using "mb try" + """ + _create_target( + name = name, + type = "script", + label = label, + script = script, + skip_usage_check = skip_usage_check, + args = args, + ) + +def _windowed_test_launcher( + *, + name, + label, + label_type = None, + executable = None, + executable_suffix = None, + skip_usage_check = False, + args = None): + """Define a windowed test launcher target to use in targets specs. + + A windowed test launcher is a gtest-based test that uses the + parallelizing TestLauncher from //base/test:test_support and needs + to run under Xvfb if run on some platforms (eg. Linux Desktop and + Ozone CrOS). + + Args: + name: The name that can be used to refer to the target. + label: The GN label for the ninja target. + label_type: The type of the label. This is used by MB to find + the generated runtime files in the correct place if the + target uses the test_launcher command-line conventions but + the label refers to a different type of target. + executable: The binary to run. By default, the ninja target name + will be used. On Windows, .exe will be appended, so it + should not appear in the executable name. + executable_suffix: The suffix to append to the executable name. + skip_usage_check: Disables checking that the target is actually + referenced in a targets spec for some builder. + args: The arguments to the test. These arguments will be + included when the test is run using "mb try" + """ + _create_target( + name = name, + type = "windowed_test_launcher", + label = label, + label_type = label_type, + executable = executable, + executable_suffix = executable_suffix, + skip_usage_check = skip_usage_check, + args = args, + ) + +targets = struct( + compile_target = _compile_target, + console_test_launcher = _console_test_launcher, + generated_script = _generated_script, + junit_test = _junit_test, + script = _script, + windowed_test_launcher = _windowed_test_launcher, +) + +GN_ISOLATE_MAP_PYL = """\ +# THIS IS A GENERATED FILE DO NOT EDIT!!! +# Instead: +# 1. Modify //infra/config/targets/targets.star +# 2. Run //infra/config/main.star +# 3. Run //infra/config/scripts/sync-isolate-map.py + +{{ +{entries} +}} +""" + +def _generate_gn_isolate_map_pyl(ctx): + entries = [] + for n in graph.children(keys.project(), _TARGET.kind, graph.DEFINITION_ORDER): + entries.append(' "{}": {{'.format(n.key.id)) + entries.append(' "label": "{}",'.format(n.props.label)) + if n.props.label_type != None: + entries.append(' "label_type": "{}",'.format(n.props.label_type)) + entries.append(' "type": "{}",'.format(n.props.type)) + if n.props.executable != None: + entries.append(' "executable": "{}",'.format(n.props.executable)) + if n.props.executable_suffix != None: + entries.append(' "executable_suffix": "{}",'.format(n.props.executable_suffix)) + if n.props.script != None: + entries.append(' "script": "{}",'.format(n.props.script)) + if n.props.skip_usage_check: + entries.append(' "skip_usage_check": {},'.format(n.props.skip_usage_check)) + if n.props.args: + entries.append(' "args": [') + for a in n.props.args: + entries.append(' "{}",'.format(a)) + entries.append(" ],") + entries.append(" },") + ctx.output["testing/gn_isolate_map.pyl"] = GN_ISOLATE_MAP_PYL.format(entries = "\n".join(entries)) + +lucicfg.generator(_generate_gn_isolate_map_pyl)
diff --git a/infra/config/main.star b/infra/config/main.star index 6366fac0..9ff27100 100755 --- a/infra/config/main.star +++ b/infra/config/main.star
@@ -40,6 +40,7 @@ "outages.pyl", "sheriff-rotations/*.txt", "project.pyl", + "testing/gn_isolate_map.pyl", ], fail_on_warnings = True, lint_checks = [ @@ -198,6 +199,7 @@ exec("//swarming.star") exec("//recipes.star") +exec("//targets/targets.star") exec("//notifiers.star")
diff --git a/infra/config/scripts/sync-isolate-map.py b/infra/config/scripts/sync-isolate-map.py new file mode 100755 index 0000000..02e383e --- /dev/null +++ b/infra/config/scripts/sync-isolate-map.py
@@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Update the copy of gn_isolate_map.pyl in //testing/buildbot. + +Until pinpoint is only building revisions that contain +//infra/config/generated/testing/gn_isolate_map.pyl, +//testing/buildbot/gn_isolate_map.pyl must exist and should be the same +as //infra/config/generated/testing/gn_isolate_map.pyl. This script +copies //infra/config/generated/testing/gn_isolate_map.pyl to +//testing/buildbot/gn_isolate_map.pyl and should be run after running +the starlark if it updates //testing/buildbot/gn_isolate_map.pyl. +""" + +import os.path +import shutil + +INFRA_CONFIG_DIR = os.path.normpath(f'{__file__}/../..') +TESTING_BUILDBOT_DIR = os.path.normpath( + f'{INFRA_CONFIG_DIR}/../../testing/buildbot') + +shutil.copyfile(f'{INFRA_CONFIG_DIR}/generated/testing/gn_isolate_map.pyl', + f'{TESTING_BUILDBOT_DIR}/gn_isolate_map.pyl')
diff --git a/infra/config/subprojects/chromium/ci/checks.star b/infra/config/subprojects/chromium/ci/checks.star index dd0400cb..5b25e072 100644 --- a/infra/config/subprojects/chromium/ci/checks.star +++ b/infra/config/subprojects/chromium/ci/checks.star
@@ -3,7 +3,7 @@ # found in the LICENSE file. """Definitions of builders in the presubmit.linux builder group.""" -load("//lib/builders.star", "os") +load("//lib/builders.star", "os", "sheriff_rotations") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") @@ -22,6 +22,7 @@ builderless = True, cores = 32, os = os.LINUX_DEFAULT, + sheriff_rotations = sheriff_rotations.CHROMIUM, console_view_entry = consoles.console_view_entry( console_view = "checks", category = "presubmit",
diff --git a/infra/config/subprojects/chromium/try/presubmit.star b/infra/config/subprojects/chromium/try/presubmit.star index df3ad69..96196043b 100644 --- a/infra/config/subprojects/chromium/try/presubmit.star +++ b/infra/config/subprojects/chromium/try/presubmit.star
@@ -42,7 +42,8 @@ """ if tryjob: tryjob_args = {a: getattr(tryjob, a) for a in dir(tryjob)} - tryjob_args["disable_reuse"] = True + if tryjob_args.get("disable_reuse") == None: + tryjob_args["disable_reuse"] = True tryjob_args["add_default_filters"] = False tryjob = try_.job(**tryjob_args) return try_.builder(name = name, tryjob = tryjob, **kwargs) @@ -151,7 +152,10 @@ }, "repo_name": "chromium", }, - tryjob = None, + tryjob = try_.job( + disable_reuse = False, + experiment_percentage = 100, + ), ) presubmit_builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index 586fefc2..2fc70927 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -57,6 +57,10 @@ branch_selector = branches.selector.CROS_LTS_BRANCHES, mirrors = ["ci/chromeos-amd64-generic-rel"], compilator = "chromeos-amd64-generic-rel-compilator", + experiments = { + # go/nplus1shardsproposal + "chromium.add_one_test_shard": 5, + }, main_list_view = "try", tryjob = try_.job(), # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools @@ -265,6 +269,10 @@ ], compilator = "linux-chromeos-rel-compilator", coverage_test_types = ["unit", "overall"], + experiments = { + # go/nplus1shardsproposal + "chromium.add_one_test_shard": 5, + }, main_list_view = "try", tryjob = try_.job(), use_clang_coverage = True,
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star index d7df8dc..3b49eda 100644 --- a/infra/config/subprojects/reclient/reclient.star +++ b/infra/config/subprojects/reclient/reclient.star
@@ -497,3 +497,36 @@ reclient_rewrapper_env = {"RBE_compare": "true"}, service_account = "chromium-cq-staging-builder@chops-service-accounts.iam.gserviceaccount.com", ) + +# TODO(b/276727069) Remove once developer rollout is done +ci.builder( + name = "Linux Builder (canonical wd) (reclient compare)", + description_html = "verify artifacts with canonicalize_working_dir enabled. should be removed after developer rollout. b/276727069", + builder_spec = builder_config.copy_from( + "ci/Linux Builder", + lambda spec: structs.evolve( + spec, + gclient_config = structs.extend( + spec.gclient_config, + apply_configs = ["reclient_test"], + ), + build_gs_bucket = None, + ), + ), + cores = 32, + os = os.LINUX_DEFAULT, + console_view_entry = consoles.console_view_entry( + category = "linux", + short_name = "compwd", + ), + execution_timeout = 14 * time.hour, + reclient_ensure_verified = True, + reclient_instance = reclient.instance.TEST_TRUSTED, + reclient_jobs = None, + reclient_rewrapper_env = { + "RBE_compare": "true", + "RBE_compression_threshold": "4000000", + "RBE_canonicalize_working_dir": "true", + "RBE_cache_silo": "Linux Builder (canonical wd) (reclient compare)", + }, +)
diff --git a/infra/config/targets/targets.star b/infra/config/targets/targets.star new file mode 100644 index 0000000..e323825 --- /dev/null +++ b/infra/config/targets/targets.star
@@ -0,0 +1,2452 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +load("//lib/targets.star", "targets") + +targets.compile_target( + name = "All_syzygy", + label = "//:All_syzygy", +) + +targets.console_test_launcher( + name = "absl_hardening_tests", + label = "//third_party/abseil-cpp:absl_hardening_tests", +) + +targets.console_test_launcher( + name = "accessibility_unittests", + label = "//ui/accessibility:accessibility_unittests", +) + +targets.windowed_test_launcher( + name = "android_browsertests", + label = "//chrome/test:android_browsertests", +) + +targets.compile_target( + name = "android_lint", + label = "//chrome/android:android_lint", +) + +targets.windowed_test_launcher( + name = "android_sync_integration_tests", + label = "//chrome/test:android_sync_integration_tests", +) + +targets.compile_target( + name = "android_tools", + label = "//tools/android:android_tools", +) + +targets.generated_script( + name = "android_webview_junit_tests", + label = "//android_webview/test:android_webview_junit_tests", +) + +targets.console_test_launcher( + name = "android_webview_unittests", + label = "//android_webview/test:android_webview_unittests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_egl_tests", + label = "//third_party/angle/src/tests:angle_deqp_egl_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles2_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles2_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles31_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles31_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles3_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles3_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_khr_gles2_tests", + label = "//third_party/angle/src/tests:angle_deqp_khr_gles2_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_khr_gles3_tests", + label = "//third_party/angle/src/tests:angle_deqp_khr_gles3_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_khr_gles31_tests", + label = "//third_party/angle/src/tests:angle_deqp_khr_gles31_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles3_rotate180_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles3_rotate180_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles3_rotate270_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles3_rotate270_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles3_rotate90_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles3_rotate90_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles31_rotate180_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles31_rotate180_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles31_rotate270_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles31_rotate270_tests", +) + +targets.windowed_test_launcher( + name = "angle_deqp_gles31_rotate90_tests", + label = "//third_party/angle/src/tests:angle_deqp_gles31_rotate90_tests", +) + +targets.windowed_test_launcher( + name = "angle_end2end_tests", + label = "//third_party/angle/src/tests:angle_end2end_tests", +) + +targets.windowed_test_launcher( + name = "angle_unittests", + label = "//third_party/angle/src/tests:angle_unittests", +) + +targets.windowed_test_launcher( + name = "angle_white_box_tests", + label = "//third_party/angle/src/tests:angle_white_box_tests", +) + +targets.windowed_test_launcher( + name = "app_shell_unittests", + label = "//extensions/shell:app_shell_unittests", +) + +targets.windowed_test_launcher( + name = "ash_components_unittests", + label = "//ash/components:ash_components_unittests", +) + +targets.windowed_test_launcher( + name = "ash_crosapi_tests", + label = "//chrome/test:ash_crosapi_tests", +) + +targets.windowed_test_launcher( + name = "ash_webui_unittests", + label = "//ash/webui:ash_webui_unittests", +) + +targets.windowed_test_launcher( + name = "ash_unittests", + label = "//ash:ash_unittests", +) + +targets.windowed_test_launcher( + name = "ash_pixeltests", + label = "//ash:ash_pixeltests", +) + +targets.windowed_test_launcher( + name = "aura_unittests", + label = "//ui/aura:aura_unittests", +) + +targets.generated_script( + name = "base_junit_tests", + label = "//base:base_junit_tests", +) + +targets.script( + name = "base_perftests", + label = "//base:base_perftests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "base_perftests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], +) + +targets.console_test_launcher( + name = "base_unittests", + label = "//base:base_unittests", +) + +targets.console_test_launcher( + name = "blink_common_unittests", + label = "//third_party/blink/common:blink_common_unittests", +) + +targets.console_test_launcher( + name = "blink_fuzzer_unittests", + label = "//third_party/blink/renderer/platform:blink_fuzzer_unittests", +) + +targets.console_test_launcher( + name = "blink_heap_unittests", + label = "//third_party/blink/renderer/platform/heap:blink_heap_unittests", +) + +targets.console_test_launcher( + name = "blink_platform_unittests", + label = "//third_party/blink/renderer/platform:blink_platform_unittests", +) + +targets.generated_script( + name = "blink_python_tests", + label = "//:blink_python_tests", +) + +targets.script( + name = "blink_pytype", + label = "//third_party/blink/tools:blink_pytype", + script = "//third_party/blink/tools/run_pytype.py", +) + +targets.compile_target( + name = "blink_tests", + label = "//:blink_tests", +) + +targets.console_test_launcher( + name = "blink_unittests", + label = "//third_party/blink/renderer/controller:blink_unittests", +) + +targets.generated_script( + name = "blink_web_tests", + label = "//:blink_web_tests", + args = [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "blink_wpt_tests", + label = "//:blink_wpt_tests", + args = [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], +) + +targets.compile_target( + name = "boundary_interface_example_apk", + label = "//android_webview/support_library/boundary_interfaces:boundary_interface_example_apk", +) + +# TODO(b/246519185) - Py3 incompatible, decide if to keep test. +# targets.windowed_test_launcher( +# name = "browser_tests_apprtc", +# label = "//chrome/test:browser_tests_apprtc", +# executable = "browser_tests", +# ) + +targets.generated_script( + name = "devtools_web_tests", + label = "//:devtools_web_tests", + args = [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], +) + +targets.console_test_launcher( + name = "boringssl_crypto_tests", + label = "//third_party/boringssl:boringssl_crypto_tests", +) + +targets.console_test_launcher( + name = "boringssl_ssl_tests", + label = "//third_party/boringssl:boringssl_ssl_tests", +) + +targets.windowed_test_launcher( + name = "browser_tests", + label = "//chrome/test:browser_tests", +) + +# # TODO(b/246519185) - Py3 incompatible, decide if to keep test. +# #"browser_tests_apprtc": { +# # label = "//chrome/test:browser_tests_apprtc", +# # type = "windowed_test_launcher", +# # executable = "browser_tests", +# ) + +targets.generated_script( + name = "build_junit_tests", + label = "//build/android:build_junit_tests", +) + +targets.windowed_test_launcher( + name = "captured_sites_interactive_tests", + label = "//chrome/test:captured_sites_interactive_tests", + args = [ + "--disable-extensions", + ], +) + +targets.windowed_test_launcher( + name = "capture_unittests", + label = "//media/capture:capture_unittests", +) + +targets.console_test_launcher( + name = "cast_display_settings_unittests", + label = "//chromecast/ui/display_settings:cast_display_settings_unittests", +) + +targets.console_test_launcher( + name = "cast_runner_browsertests", + label = "//fuchsia_web/runners:cast_runner_browsertests", +) + +targets.console_test_launcher( + name = "cast_runner_integration_tests", + label = "//fuchsia_web/runners:cast_runner_integration_tests", +) + +targets.compile_target( + name = "cast_runner_pkg", + label = "//fuchsia_web/runners:cast_runner_pkg", +) + +targets.console_test_launcher( + name = "cast_runner_unittests", + label = "//fuchsia_web/runners:cast_runner_unittests", +) + +targets.console_test_launcher( + name = "cast_audio_backend_unittests", + label = "//chromecast/media/cma/backend:cast_audio_backend_unittests", +) + +targets.junit_test( + name = "cast_base_junit_tests", + label = "//chromecast/base:cast_base_junit_tests", +) + +targets.console_test_launcher( + name = "cast_base_unittests", + label = "//chromecast/base:cast_base_unittests", +) + +targets.console_test_launcher( + name = "cast_cast_core_unittests", + label = "//chromecast/cast_core:cast_cast_core_unittests", +) + +targets.console_test_launcher( + name = "cast_crash_unittests", + label = "//chromecast/crash:cast_crash_unittests", +) + +targets.console_test_launcher( + name = "cast_graphics_unittests", + label = "//chromecast/graphics:cast_graphics_unittests", +) + +targets.compile_target( + name = "cast_junit_test_lists", + label = "//chromecast:cast_junit_test_lists", +) + +targets.console_test_launcher( + name = "cast_media_unittests", + label = "//chromecast/media:cast_media_unittests", +) + +targets.compile_target( + name = "cast_shell", + label = "//chromecast:cast_shell", +) + +targets.compile_target( + name = "cast_shell_apk", + label = "//chromecast:cast_shell_apk", +) + +targets.console_test_launcher( + name = "cast_shell_browsertests", + label = "//chromecast:cast_shell_browsertests", +) + +targets.junit_test( + name = "cast_shell_junit_tests", + label = "//chromecast/browser/android:cast_shell_junit_tests", +) + +targets.console_test_launcher( + name = "cast_shell_unittests", + label = "//chromecast:cast_shell_unittests", +) + +targets.compile_target( + name = "cast_test_lists", + label = "//chromecast:cast_test_lists", +) + +targets.windowed_test_launcher( + name = "cast_unittests", + label = "//media/cast:cast_unittests", +) + +targets.windowed_test_launcher( + name = "cc_unittests", + label = "//cc:cc_unittests", +) + +targets.compile_target( + name = "chrome", + label = "//chrome:chrome", +) + +targets.generated_script( + name = "chrome_all_tast_tests", + label = "//chromeos:chrome_all_tast_tests", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.console_test_launcher( + name = "chrome_app_unittests", + label = "//chrome/test:chrome_app_unittests", +) + +targets.console_test_launcher( + name = "chrome_cleaner_unittests", + label = "//chrome/chrome_cleaner:chrome_cleaner_unittests", +) + +targets.console_test_launcher( + name = "chrome_elf_unittests", + label = "//chrome/chrome_elf:chrome_elf_unittests", +) + +targets.generated_script( + name = "chrome_java_test_pagecontroller_junit_tests", + label = "//chrome/test/android:chrome_java_test_pagecontroller_junit_tests", +) + +targets.console_test_launcher( + name = "chrome_java_test_pagecontroller_tests", + label = "//chrome/test/android:chrome_java_test_pagecontroller_tests", +) + +targets.console_test_launcher( + name = "chrome_java_test_wpr_tests", + label = "//chrome/test/android:chrome_java_test_wpr_tests", +) + +targets.generated_script( + name = "chrome_junit_tests", + label = "//chrome/android:chrome_junit_tests", +) + +targets.compile_target( + name = "chrome_nocompile_tests", + label = "//chrome/android:chrome_nocompile_tests", +) + +targets.compile_target( + name = "chrome_official_builder", + label = "//:chrome_official_builder", +) + +targets.compile_target( + name = "chrome_official_builder_no_unittests", + label = "//:chrome_official_builder_no_unittests", +) + +targets.compile_target( + name = "chrome_pkg", + label = "//chrome/app:chrome_pkg", +) + +targets.generated_script( + name = "chrome_private_code_test", + label = "//chrome:chrome_private_code_test", +) + +targets.compile_target( + name = "chrome_public_apk", + label = "//chrome/android:chrome_public_apk", +) + +targets.console_test_launcher( + name = "chrome_public_smoke_test", + label = "//chrome/android:chrome_public_smoke_test", +) + +# TODO(crbug.com/1238057): Rename to chrome_public_integration_test_apk +targets.console_test_launcher( + name = "chrome_public_test_apk", + label = "//chrome/android:chrome_public_test_apk", +) + +targets.console_test_launcher( + name = "chrome_public_test_vr_apk", + label = "//chrome/android:chrome_public_test_vr_apk", +) + +targets.console_test_launcher( + name = "chrome_public_unit_test_apk", + label = "//chrome/android:chrome_public_unit_test_apk", +) + +targets.generated_script( + name = "chrome_public_wpt", + label = "//chrome/android:chrome_public_wpt", +) + +targets.compile_target( + name = "chrome_sandbox", + label = "//sandbox/linux:chrome_sandbox", +) + +targets.generated_script( + name = "chrome_sizes", + label = "//chrome/test:chrome_sizes", +) + +targets.console_test_launcher( + name = "chrome_webapk_integration_tests", + label = "//chrome/test/android:chrome_webapk_integration_tests", +) + +targets.compile_target( + name = "chromedriver", + label = "//chrome/test/chromedriver:chromedriver_server", +) + +targets.compile_target( + name = "chromedriver_group", + label = "//:chromedriver_group", +) + +targets.script( + name = "chromedriver_py_tests", + label = "//chrome/test/chromedriver:chromedriver_py_tests", + script = "//testing/xvfb.py", + args = [ + "../../testing/scripts/run_chromedriver_tests.py", + "../../chrome/test/chromedriver/test/run_py_tests.py", + "--chromedriver=chromedriver", + "--log-path=${ISOLATED_OUTDIR}/chromedriver.log", + ], +) + +targets.generated_script( + name = "chrome_variations_tast_tests", + label = "//chromeos:chrome_variations_tast_tests", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.compile_target( + name = "chromedriver_webview_shell_apk", + label = "//chrome/test/chromedriver/test/webview_shell:chromedriver_webview_shell_apk", +) + +targets.generated_script( + name = "webdriver_wpt_tests", + label = "//:webdriver_wpt_tests", + args = [ + "../../chrome/test/chromedriver/test/run_webdriver_tests.py", + "-v", + "--chromedriver=chromedriver", + "--log-path=${ISOLATED_OUTDIR}/chromedriver.log", + "--output-dir=${ISOLATED_OUTDIR}", + "--test-path=../../third_party/blink/web_tests/external/wpt/webdriver/tests/", + ], +) + +targets.generated_script( + name = "wpt_tests_isolate", + label = "//:wpt_tests_isolate", +) + +targets.generated_script( + name = "wpt_tests_isolate_content_shell", + label = "//:wpt_tests_isolate_content_shell", +) + +targets.generated_script( + name = "wpt_tests_ios", + label = "//ios/chrome/test/wpt:wpt_tests_ios", +) + +targets.compile_target( + name = "chrome/browser/media/router", + label = "//chrome/browser/media/router:router", +) + +targets.compile_target( + name = "chrome/browser/media/router:openscreen_unittests", + label = "//chrome/browser/media/router:openscreen_unittests", +) + +targets.compile_target( + name = "chrome/browser/media/router:unittests", + label = "//chrome/browser/media/router:unittests", +) + +targets.compile_target( + name = "chrome/installer/linux", + label = "//chrome/installer/linux:linux", +) + +targets.compile_target( + name = "chrome/installer/mac", + label = "//chrome/installer/mac:mac", +) + +targets.generated_script( + name = "variations_smoke_tests", + label = "//chrome/test:variations_smoke_tests", +) + +targets.script( + name = "chromedriver_replay_unittests", + label = "//chrome/test/chromedriver:chromedriver_replay_unittests", + script = "//chrome/test/chromedriver/log_replay/client_replay_unittest.py", +) + +targets.windowed_test_launcher( + name = "chromedriver_unittests", + label = "//chrome/test/chromedriver:chromedriver_unittests", +) + +targets.console_test_launcher( + name = "chromeos_components_unittests", + label = "//chromeos/components:chromeos_components_unittests", +) + +targets.console_test_launcher( + name = "chromeos_unittests", + label = "//chromeos:chromeos_unittests", +) + +targets.compile_target( + name = "chromium_builder_asan", + label = "//:chromium_builder_asan", +) + +targets.compile_target( + name = "chromium_builder_perf", + label = "//:chromium_builder_perf", +) + +targets.compile_target( + name = "chromiumos_preflight", + label = "//:chromiumos_preflight", +) + +targets.console_test_launcher( + name = "color_unittests", + label = "//ui/color:color_unittests", +) + +targets.script( + name = "command_buffer_perftests", + label = "//gpu:command_buffer_perftests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "command_buffer_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], +) + +targets.compile_target( + name = "components/media_router/common/providers/cast/channel", + label = "//components/media_router/common/providers/cast/channel:cast_channel", +) + +targets.compile_target( + name = "components/media_router/common/providers/cast/channel:unit_tests", + label = "//components/media_router/common/providers/cast/channel:unit_tests", +) + +targets.compile_target( + name = "components/media_router/common/providers/cast/certificate", + label = "//components/media_router/common/providers/cast/certificate", +) + +targets.compile_target( + name = "components/media_router/common/providers/cast/certificate:unit_tests", + label = "//components/media_router/common/providers/cast/certificate:unit_tests", +) + +targets.compile_target( + name = "components/mirroring/browser", + label = "//components/mirroring/browser:browser", +) + +targets.compile_target( + name = "components/mirroring/service:mirroring_service", + label = "//components/mirroring/service:mirrroring_service", +) + +targets.compile_target( + name = "components/mirroring:mirroring_tests", + label = "//components/mirroring:mirroring_tests", +) + +targets.compile_target( + name = "components/mirroring:mirroring_unittests", + label = "//components/mirroring:mirroring_unittests", +) + +targets.compile_target( + name = "components/openscreen_platform", + label = "//components/openscreen_platform", +) + +targets.windowed_test_launcher( + name = "components_browsertests", + label = "//components:components_browsertests", +) + +targets.generated_script( + name = "components_junit_tests", + label = "//components:components_junit_tests", +) + +targets.script( + name = "components_perftests", + label = "//components:components_perftests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "--xvfb", + "--non-telemetry=true", + "components_perftests", + ], +) + +targets.windowed_test_launcher( + name = "components_unittests", + label = "//components:components_unittests", +) + +targets.windowed_test_launcher( + name = "compositor_unittests", + label = "//ui/compositor:compositor_unittests", +) + +targets.windowed_test_launcher( + name = "content_browsertests", + label = "//content/test:content_browsertests", +) + +targets.generated_script( + name = "content_junit_tests", + label = "//content/public/android:content_junit_tests", +) + +targets.console_test_launcher( + name = "content_nocompile_tests", + label = "//content/test:content_nocompile_tests", +) + +targets.script( + name = "content_shell_crash_test", + label = "//content/shell:content_shell_crash_test", + script = "//testing/scripts/content_shell_crash_test.py", +) + +targets.console_test_launcher( + name = "content_shell_test_apk", + label = "//content/shell/android:content_shell_test_apk", +) + +targets.windowed_test_launcher( + name = "content_unittests", + label = "//content/test:content_unittests", +) + +targets.compile_target( + name = "core_runtime_simple", + label = "//chromecast/cast_core:core_runtime_simple", +) + +targets.console_test_launcher( + name = "courgette_unittests", + label = "//courgette:courgette_unittests", +) + +targets.console_test_launcher( + name = "crashpad_tests", + label = "//third_party/crashpad/crashpad:crashpad_tests", +) + +targets.console_test_launcher( + name = "gnrt_unittests", + label = "//tools/crates/gnrt:gnrt_unittests", +) + +targets.compile_target( + name = "cronet_package", + label = "//components/cronet:cronet_package", +) + +targets.compile_target( + name = "cronet_perf_test_apk", + label = "//components/cronet/android:cronet_perf_test_apk", +) + +targets.console_test_launcher( + name = "cronet_sample_test_apk", + label = "//components/cronet/android:cronet_sample_test_apk", +) + +targets.generated_script( + name = "cronet_sizes", + label = "//components/cronet/android:cronet_sizes", +) + +targets.console_test_launcher( + name = "cronet_smoketests_missing_native_library_instrumentation_apk", + label = "//components/cronet/android:cronet_smoketests_missing_native_library_instrumentation_apk", +) + +targets.console_test_launcher( + name = "cronet_smoketests_platform_only_instrumentation_apk", + label = "//components/cronet/android:cronet_smoketests_platform_only_instrumentation_apk", +) + +targets.generated_script( + name = "cronet_test", + label = "//components/cronet/ios/test:cronet_test", +) + +targets.console_test_launcher( + name = "cronet_test_instrumentation_apk", + label = "//components/cronet/android:cronet_test_instrumentation_apk", +) + +targets.console_test_launcher( + name = "cronet_tests", + label = "//components/cronet:cronet_tests", +) + +targets.console_test_launcher( + name = "cronet_tests_android", + label = "//components/cronet/android:cronet_tests_android", +) + +targets.console_test_launcher( + name = "cronet_unittests", + label = "//components/cronet:cronet_unittests", +) + +targets.console_test_launcher( + name = "cronet_unittests_android", + label = "//components/cronet/android:cronet_unittests_android", +) + +targets.console_test_launcher( + name = "crypto_unittests", + label = "//crypto:crypto_unittests", +) + +targets.windowed_test_launcher( + name = "dawn_end2end_tests", + label = "//third_party/dawn/src/dawn/tests:dawn_end2end_tests", +) + +targets.script( + name = "dawn_perf_tests", + label = "//third_party/dawn/src/dawn/tests:dawn_perf_tests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "dawn_perf_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], +) + +targets.windowed_test_launcher( + name = "dbus_unittests", + label = "//dbus:dbus_unittests", +) + +targets.console_test_launcher( + name = "delayloads_unittests", + label = "//chrome/test:delayloads_unittests", +) + +targets.generated_script( + name = "device_junit_tests", + label = "//device:device_junit_tests", +) + +targets.console_test_launcher( + name = "device_unittests", + label = "//device:device_unittests", +) + +targets.generated_script( + name = "disk_usage_tast_test", + label = "//chromeos:disk_usage_tast_test", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.console_test_launcher( + name = "display_unittests", + label = "//ui/display:display_unittests", +) + +targets.compile_target( + name = "dump_syms", + label = "//third_party/breakpad:dump_syms", +) + +targets.windowed_test_launcher( + name = "elevation_service_unittests", + label = "//chrome/elevation_service:elevation_service_unittests", +) + +targets.compile_target( + name = "empty_main", + label = "//testing:empty_main", +) + +targets.windowed_test_launcher( + name = "events_unittests", + label = "//ui/events:events_unittests", +) + +targets.windowed_test_launcher( + name = "exo_unittests", + label = "//components/exo:exo_unittests", +) + +targets.windowed_test_launcher( + name = "extensions_browsertests", + label = "//extensions:extensions_browsertests", +) + +targets.windowed_test_launcher( + name = "extensions_unittests", + label = "//extensions:extensions_unittests", +) + +targets.console_test_launcher( + name = "filesystem_service_unittests", + label = "//components/services/filesystem:filesystem_service_unittests", +) + +targets.script( + name = "flatbuffers_unittests", + label = "//third_party/flatbuffers:flatbuffers_unittests", + script = "//testing/scripts/run_flatbuffers_unittests.py", +) + +targets.script( + name = "fuchsia_pytype", + label = "//testing:fuchsia_pytype", + script = "//build/fuchsia/test/run_pytype.py", +) + +targets.generated_script( + name = "fuchsia_sizes", + label = "//tools/fuchsia/size_tests:fuchsia_sizes", +) + +targets.console_test_launcher( + name = "gcm_unit_tests", + label = "//google_apis/gcm:gcm_unit_tests", +) + +targets.console_test_launcher( + name = "gcp_unittests", + label = "//chrome/credential_provider/test:gcp_unittests", +) + +targets.compile_target( + name = "test_ash_chrome_cipd_yaml", + label = "//chrome/test:test_ash_chrome_cipd_yaml", +) + +targets.console_test_launcher( + name = "gfx_unittests", + label = "//ui/gfx:gfx_unittests", +) + +targets.console_test_launcher( + name = "gin_unittests", + label = "//gin:gin_unittests", +) + +targets.windowed_test_launcher( + name = "gl_tests", + label = "//gpu:gl_tests", + args = [], +) + +targets.windowed_test_launcher( + name = "gl_unittests", + label = "//ui/gl:gl_unittests", +) + +targets.windowed_test_launcher( + name = "gl_unittests_ozone", + label = "//ui/gl:gl_unittests_ozone", + label_type = "group", + executable = "gl_unittests", +) + +targets.console_test_launcher( + name = "gles2_conform_test", + label = "//gpu/gles2_conform_support:gles2_conform_test", +) + +targets.compile_target( + name = "gn_all", + label = "//:gn_all", +) + +targets.script( + name = "gold_common_pytype", + label = "//build:gold_common_pytype", + script = "//build/skia_gold_common/run_pytype.py", +) + +targets.console_test_launcher( + name = "google_apis_unittests", + label = "//google_apis:google_apis_unittests", +) + +targets.script( + name = "gpu_perftests", + label = "//gpu:gpu_perftests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "gpu_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], +) + +targets.script( + name = "gpu_pytype", + label = "//content/test:gpu_pytype", + script = "//content/test/gpu/run_pytype.py", +) + +targets.windowed_test_launcher( + name = "gpu_unittests", + label = "//gpu:gpu_unittests", +) + +targets.script( + name = "grit_python_unittests", + label = "//tools/grit:grit_python_unittests", + script = "//testing/scripts/run_isolated_script_test.py", + args = [ + "../../tools/grit/grit/test_suite_all.py", + ], +) + +targets.console_test_launcher( + name = "gwp_asan_unittests", + label = "//components/gwp_asan:gwp_asan_unittests", +) + +targets.console_test_launcher( + name = "headless_browsertests", + label = "//headless:headless_browsertests", +) + +targets.console_test_launcher( + name = "headless_unittests", + label = "//headless:headless_unittests", +) + +targets.console_test_launcher( + name = "install_static_unittests", + label = "//chrome/install_static:install_static_unittests", +) + +targets.console_test_launcher( + name = "installer_util_unittests", + label = "//chrome/installer/util:installer_util_unittests", +) + +targets.windowed_test_launcher( + name = "interactive_ui_tests", + label = "//chrome/test:interactive_ui_tests", + args = [ + "--snapshot-output-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.compile_target( + name = "ios/chrome/app:chrome", + label = "//ios/chrome/app:chrome", +) + +targets.compile_target( + name = "ios/chrome/test:all_fuzzer_tests", + label = "//ios/chrome/test:all_fuzzer_tests", +) + +targets.compile_target( + name = "ios_chrome_clusterfuzz_asan_build", + label = "//ios/chrome/test/wpt:ios_chrome_clusterfuzz_asan_build", +) + +targets.generated_script( + name = "ios_chrome_unittests", + label = "//ios/chrome/test:ios_chrome_unittests", +) + +targets.generated_script( + name = "ios_chrome_bookmarks_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_integration_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_settings_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_signin_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_smoke_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_ui_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module", +) + +targets.generated_script( + name = "ios_chrome_web_eg2tests_module", + label = "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module", +) + +targets.generated_script( + name = "ios_crash_xcuitests_module", + label = "//third_party/crashpad/crashpad/test/ios:ios_crash_xcuitests_module", +) + +targets.generated_script( + name = "ios_components_unittests", + label = "//ios/components:ios_components_unittests", +) + +targets.generated_script( + name = "ios_net_unittests", + label = "//ios/net:ios_net_unittests", +) + +targets.generated_script( + name = "ios_remoting_unittests", + label = "//remoting/ios:ios_remoting_unittests", +) + +targets.generated_script( + name = "ios_showcase_eg2tests_module", + label = "//ios/showcase:ios_showcase_eg2tests_module", +) + +targets.generated_script( + name = "ios_swift_interop_xcuitests_module", + label = "//ios/chrome/test/swift_interop:ios_swift_interop_xcuitests_module", +) + +targets.generated_script( + name = "ios_testing_unittests", + label = "//ios/testing:ios_testing_unittests", +) + +targets.generated_script( + name = "ios_web_inttests", + label = "//ios/web:ios_web_inttests", +) + +targets.generated_script( + name = "ios_web_shell_eg2tests_module", + label = "//ios/web/shell/test:ios_web_shell_eg2tests_module", +) + +targets.generated_script( + name = "ios_web_unittests", + label = "//ios/web:ios_web_unittests", +) + +targets.generated_script( + name = "ios_web_view_inttests", + label = "//ios/web_view:ios_web_view_inttests", +) + +targets.generated_script( + name = "ios_web_view_unittests", + label = "//ios/web_view:ios_web_view_unittests", +) + +targets.console_test_launcher( + name = "ipc_tests", + label = "//ipc:ipc_tests", +) + +targets.generated_script( + name = "junit_unit_tests", + label = "//testing/android/junit:junit_unit_tests", +) + +targets.junit_test( + name = "keyboard_accessory_junit_tests", + label = "//chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests", +) + +targets.windowed_test_launcher( + name = "keyboard_unittests", + label = "//ash/keyboard/ui:keyboard_unittests", +) + +targets.generated_script( + name = "lacros_all_tast_tests", + label = "//chromeos/lacros:lacros_all_tast_tests", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "lacros_all_tast_tests_informational", + label = "//chromeos/lacros:lacros_all_tast_tests_informational", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.windowed_test_launcher( + name = "lacros_chrome_browsertests", + label = "//chrome/test:lacros_chrome_browsertests", +) + +targets.windowed_test_launcher( + name = "lacros_chrome_browsertests_run_in_series", + label = "//chrome/test:lacros_chrome_browsertests_run_in_series", + args = [ + "--test-launcher-jobs=1", + ], +) + +targets.console_test_launcher( + name = "lacros_chrome_unittests", + label = "//chrome/test:lacros_chrome_unittests", +) + +targets.generated_script( + name = "lacros_cq_tast_tests_eve", + label = "//chromeos/lacros:lacros_cq_tast_tests_eve", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "lacros_cq_tast_tests_jacuzzi", + label = "//chromeos/lacros:lacros_cq_tast_tests_jacuzzi", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "lacros_fyi_tast_tests", + label = "//chromeos/lacros:lacros_fyi_tast_tests", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "lacros_variations_tast_tests", + label = "//chromeos/lacros:lacros_variations_tast_tests", + args = [ + "--logs-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.console_test_launcher( + name = "latency_unittests", + label = "//ui/latency:latency_unittests", +) + +targets.console_test_launcher( + name = "libcups_unittests", + label = "//chrome/services/cups_proxy:libcups_unittests", +) + +targets.console_test_launcher( + name = "libjingle_xmpp_unittests", + label = "//third_party/libjingle_xmpp:libjingle_xmpp_unittests", +) + +targets.console_test_launcher( + name = "liburlpattern_unittests", + label = "//third_party/liburlpattern:liburlpattern_unittests", +) + +targets.compile_target( + name = "linux_symbols", + label = "//chrome:linux_symbols", +) + +targets.script( + name = "load_library_perf_tests", + label = "//chrome/test:load_library_perf_tests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "load_library_perf_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + ], +) + +targets.generated_script( + name = "mac_signing_tests", + label = "//chrome/installer/mac:mac_signing_tests", +) + +targets.generated_script( + name = "media_base_junit_tests", + label = "//media/base/android:media_base_junit_tests", +) + +targets.script( + name = "media_perftests", + label = "//media:media_perftests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "media_perftests", + "--non-telemetry=true", + "--single-process-tests", + "--test-launcher-retry-limit=0", + "--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::*unoptimized_aligned", + ], +) + +targets.script( + name = "media_router_e2e_tests", + label = "//chrome/test/media_router:media_router_e2e_tests", + script = "//chrome/test/media_router/internal/media_router_tests.py", + args = [ + "--test_binary", + "./interactive_ui_tests", + ], +) + +targets.windowed_test_launcher( + name = "media_unittests", + label = "//media:media_unittests", +) + +targets.windowed_test_launcher( + name = "message_center_unittests", + label = "//ui/message_center:message_center_unittests", +) + +targets.compile_target( + name = "microdump_stackwalk", + label = "//third_party/breakpad:microdump_stackwalk", +) + +targets.windowed_test_launcher( + name = "midi_unittests", + label = "//media/midi:midi_unittests", +) + +targets.compile_target( + name = "mini_installer", + label = "//chrome/installer/mini_installer:mini_installer", +) + +targets.script( + name = "mini_installer_tests", + label = "//chrome/test/mini_installer:mini_installer_tests", + script = "//testing/scripts/run_isolated_script_test.py", + args = [ + "../../chrome/test/mini_installer/run_mini_installer_tests.py", + "--output-dir=${ISOLATED_OUTDIR}", + ], +) + +targets.generated_script( + name = "module_installer_junit_tests", + label = "//components/module_installer/android:module_installer_junit_tests", +) + +targets.console_test_launcher( + name = "monochrome_public_smoke_test", + label = "//chrome/android:monochrome_public_smoke_test", +) + +targets.console_test_launcher( + name = "monochrome_public_bundle_smoke_test", + label = "//chrome/android:monochrome_public_bundle_smoke_test", +) + +targets.script( + name = "mojo_python_unittests", + label = "//mojo/public/tools:mojo_python_unittests", + script = "//testing/scripts/run_isolated_script_test.py", + args = [ + "../../mojo/public/tools/run_all_python_unittests.py", + ], +) + +targets.compile_target( + name = "mojo_rust", + # Since we can't build rust tests on Android now, add this for build + # coverage. + label = "//mojo/public/rust:mojo_rust", +) + +targets.console_test_launcher( + name = "mojo_rust_integration_unittests", + label = "//mojo/public/rust:mojo_rust_integration_unittests", +) + +targets.console_test_launcher( + name = "mojo_rust_unittests", + label = "//mojo/public/rust:mojo_rust_unittests", +) + +targets.console_test_launcher( + name = "mojo_test_apk", + label = "//mojo/public/java/system:mojo_test_apk", +) + +targets.console_test_launcher( + name = "mojo_unittests", + label = "//mojo:mojo_unittests", +) + +targets.script( + name = "monochrome_public_apk_checker", + label = "//chrome/android/monochrome:monochrome_public_apk_checker", + script = "//testing/scripts/run_isolated_script_test.py", + args = [ + "../../chrome/android/monochrome/scripts/monochrome_python_tests.py", + "--chrome-apk", + "apks/ChromePublic.apk", + "--chrome-pathmap", + "apks/ChromePublic.apk.pathmap.txt", + "--system-webview-apk", + "apks/SystemWebView.apk", + "--system-webview-pathmap", + "apks/SystemWebView.apk.pathmap.txt", + "--monochrome-apk", + "apks/MonochromePublic.apk", + "--monochrome-pathmap", + "apks/MonochromePublic.apk.pathmap.txt", + ], +) + +targets.console_test_launcher( + name = "monochrome_public_test_ar_apk", + label = "//chrome/android:monochrome_public_test_ar_apk", +) + +targets.compile_target( + name = "monochrome_static_initializers", + label = "//chrome/android:monochrome_static_initializers", +) + +targets.compile_target( + name = "nacl_helper", + label = "//components/nacl/loader:nacl_helper", + skip_usage_check = True, +) + +targets.compile_target( + name = "nacl_helper_bootstrap", + label = "//native_client/src/trusted/service_runtime/linux:bootstrap", + skip_usage_check = True, +) + +targets.console_test_launcher( + name = "nacl_loader_unittests", + label = "//components/nacl/loader:nacl_loader_unittests", +) + +targets.generated_script( + name = "build_rust_tests", + label = "//build/rust/tests:build_rust_tests", +) + +targets.windowed_test_launcher( + name = "native_theme_unittests", + label = "//ui/native_theme:native_theme_unittests", +) + +targets.generated_script( + name = "net_junit_tests", + label = "//net/android:net_junit_tests", +) + +targets.script( + name = "net_perftests", + label = "//net:net_perftests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "net_perftests", + "--non-telemetry=true", + ], +) + +targets.console_test_launcher( + name = "net_unittests", + label = "//net:net_unittests", +) + +targets.windowed_test_launcher( + name = "notification_helper_unittests", + label = "//chrome/notification_helper:notification_helper_unittests", +) + +targets.console_test_launcher( + name = "openscreen_unittests", + label = "//chrome/browser/media/router:openscreen_unittests", +) + +targets.console_test_launcher( + name = "ozone_gl_unittests", + label = "//ui/ozone/gl:ozone_gl_unittests", +) + +targets.console_test_launcher( + name = "ozone_unittests", + label = "//ui/ozone:ozone_unittests", +) + +targets.windowed_test_launcher( + name = "ozone_x11_unittests", + label = "//ui/ozone:ozone_x11_unittests", +) + +targets.generated_script( + name = "paint_preview_junit_tests", + label = "//components/paint_preview/player/android:paint_preview_junit_tests", +) + +targets.generated_script( + name = "password_check_junit_tests", + label = "//chrome/browser/password_check/android:password_check_junit_tests", +) + +targets.generated_script( + name = "password_manager_junit_tests", + label = "//chrome/browser/password_manager/android:password_manager_junit_tests", +) + +targets.compile_target( + name = "pdf_fuzzers", + label = "//pdf/pdfium/fuzzers:pdf_fuzzers", +) + +targets.console_test_launcher( + name = "pdf_unittests", + label = "//pdf:pdf_unittests", +) + +targets.compile_target( + name = "pdfium_test", + label = "//third_party/pdfium/samples:pdfium_test", +) + +targets.console_test_launcher( + name = "perfetto_unittests", + label = "//third_party/perfetto:perfetto_unittests", +) + +targets.script( + name = "performance_browser_tests", + label = "//chrome/test:performance_browser_tests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "browser_tests", + "--non-telemetry=true", + "--full-performance-run", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + "--test-launcher-print-test-stdio=always", + # Allow the full performance runs to take up to 60 seconds (rather than + # the default of 30 for normal CQ browser test runs). + "--ui-test-action-timeout=60000", + "--ui-test-action-max-timeout=60000", + "--test-launcher-timeout=60000", + "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*", + ], +) + +targets.generated_script( + name = "performance_test_suite", + label = "//chrome/test:performance_test_suite", +) + +targets.generated_script( + name = "performance_test_suite_android_clank_chrome", + label = "//chrome/test:performance_test_suite_android_clank_chrome", +) + +targets.generated_script( + name = "performance_test_suite_android_clank_monochrome_64_32_bundle", + label = "//chrome/test:performance_test_suite_android_clank_monochrome_64_32_bundle", +) + +targets.generated_script( + name = "performance_test_suite_android_clank_monochrome_bundle", + label = "//chrome/test:performance_test_suite_android_clank_monochrome_bundle", +) + +targets.generated_script( + name = "performance_test_suite_android_clank_trichrome_chrome_google_64_32_bundle", + label = "//chrome/test:performance_test_suite_android_clank_trichrome_chrome_google_64_32_bundle", +) + +targets.generated_script( + name = "performance_test_suite_android_clank_trichrome_bundle", + label = "//chrome/test:performance_test_suite_android_clank_trichrome_bundle", +) + +targets.generated_script( + name = "performance_test_suite_eve", + label = "//chrome/test:performance_test_suite_eve", +) + +targets.generated_script( + name = "performance_test_suite_octopus", + label = "//chrome/test:performance_test_suite_octopus", +) + +targets.script( + name = "performance_web_engine_test_suite", + label = "//content/test:performance_web_engine_test_suite", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "../../content/test/gpu/run_telemetry_benchmark_fuchsia.py", + "--per-test-logs-dir", + ], +) + +targets.script( + name = "performance_webview_test_suite", + label = "//chrome/test:performance_webview_test_suite", + script = "//third_party/catapult/devil/devil/android/tools/system_app.py", + args = [ + "remove", + "--package", + "com.android.webview", + "com.google.android.webview", + "-v", + "--", + "../../testing/scripts/run_performance_tests.py", + "../../tools/perf/run_benchmark", + ], +) + +targets.script( + name = "polymer_tools_python_unittests", + label = "//tools/polymer:polymer_tools_python_unittests", + script = "//testing/scripts/run_isolated_script_test.py", + args = [ + "../../tools/polymer/run_polymer_tools_tests.py", + ], +) + +targets.compile_target( + name = "postmortem-metadata", + label = "//v8:postmortem-metadata", +) + +targets.console_test_launcher( + name = "power_sampler_unittests", + label = "//tools/mac/power:power_sampler_unittests", +) + +targets.console_test_launcher( + name = "ppapi_unittests", + label = "//ppapi:ppapi_unittests", +) + +targets.compile_target( + name = "previous_version_mini_installer", + label = "//chrome/installer/mini_installer:previous_version_mini_installer", +) + +targets.console_test_launcher( + name = "printing_unittests", + label = "//printing:printing_unittests", +) + +targets.generated_script( + name = "private_code_failure_test", + label = "//build/private_code_test:private_code_failure_test", +) + +targets.console_test_launcher( + name = "profile_provider_unittest", + label = "//chrome/browser/metrics/perf:profile_provider_unittest", +) + +targets.compile_target( + name = "push_apps_to_background_apk", + label = "//tools/android/push_apps_to_background:push_apps_to_background_apk", +) + +targets.compile_target( + name = "remoting/client:client", + label = "//remoting/client:client", +) + +targets.compile_target( + name = "remoting/host:host", + label = "//remoting/host:host", +) + +targets.console_test_launcher( + name = "remoting_unittests", + label = "//remoting:remoting_unittests", +) + +targets.generated_script( + name = "resource_sizes_chromecast", + label = "//chromecast:resource_sizes_chromecast", +) + +targets.generated_script( + name = "resource_sizes_cronet_sample_apk", + label = "//components/cronet/android:resource_sizes_cronet_sample_apk", +) + +targets.generated_script( + name = "resource_sizes_lacros_chrome", + label = "//chromeos/lacros:resource_sizes_lacros_chrome", +) + +targets.generated_script( + name = "resource_sizes_monochrome_public_minimal_apks", + label = "//chrome/android:resource_sizes_monochrome_public_minimal_apks", +) + +targets.generated_script( + name = "resource_sizes_trichrome", + label = "//chrome/android:resource_sizes_trichrome", +) + +targets.generated_script( + name = "resource_sizes_system_webview_bundle", + label = "//android_webview:resource_sizes_system_webview_bundle", +) + +targets.compile_target( + name = "rust_build_tests", + label = "//build/rust/tests", +) + +targets.console_test_launcher( + name = "rust_gtest_interop_unittests", + label = "//testing/rust_gtest_interop:rust_gtest_interop_unittests", +) + +targets.console_test_launcher( + name = "sandbox_linux_unittests", + label = "//sandbox/linux:sandbox_linux_unittests", +) + +targets.console_test_launcher( + name = "sandbox_unittests", + label = "//sandbox:sandbox_unittests", +) + +targets.console_test_launcher( + name = "sbox_integration_tests", + label = "//sandbox/win:sbox_integration_tests", +) + +targets.console_test_launcher( + name = "sbox_unittests", + label = "//sandbox/win:sbox_unittests", +) + +targets.console_test_launcher( + name = "sbox_validation_tests", + label = "//sandbox/win:sbox_validation_tests", +) + +targets.generated_script( + name = "services_junit_tests", + label = "//services:services_junit_tests", +) + +targets.console_test_launcher( + name = "service_manager_unittests", + label = "//services/service_manager/tests:service_manager_unittests", +) + +targets.windowed_test_launcher( + name = "services_unittests", + label = "//services:services_unittests", +) + +targets.console_test_launcher( + name = "setup_unittests", + label = "//chrome/installer/setup:setup_unittests", +) + +targets.console_test_launcher( + name = "shell_encryption_unittests", + label = "//third_party/shell-encryption:shell_encryption_unittests", +) + +targets.console_test_launcher( + name = "shell_dialogs_unittests", + label = "//ui/shell_dialogs:shell_dialogs_unittests", + # These tests are more like dialog interactive ui tests. + args = [ + "--test-launcher-jobs=1", + ], +) + +targets.console_test_launcher( + name = "skia_unittests", + label = "//skia:skia_unittests", +) + +targets.windowed_test_launcher( + name = "snapshot_unittests", + label = "//ui/snapshot:snapshot_unittests", +) + +targets.console_test_launcher( + name = "sql_unittests", + label = "//sql:sql_unittests", +) + +targets.compile_target( + name = "strip_lacros_files", + label = "//chrome:strip_lacros_files", +) + +targets.console_test_launcher( + name = "storage_unittests", + label = "//storage:storage_unittests", +) + +targets.compile_target( + name = "symupload", + label = "//third_party/breakpad:symupload", +) + +targets.windowed_test_launcher( + name = "sync_integration_tests", + label = "//chrome/test:sync_integration_tests", +) + +targets.script( + name = "sync_performance_tests", + label = "//chrome/test:sync_performance_tests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "sync_performance_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], +) + +targets.compile_target( + name = "system_webview_apk", + label = "//android_webview:system_webview_apk", +) + +targets.compile_target( + name = "system_webview_shell_apk", + label = "//android_webview/tools/system_webview_shell:system_webview_shell_apk", +) + +targets.console_test_launcher( + name = "system_webview_shell_layout_test_apk", + label = "//android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk", +) + +targets.generated_script( + name = "system_webview_wpt", + label = "//android_webview/test:system_webview_wpt", +) + +targets.script( + name = "telemetry_gpu_integration_test", + label = "//chrome/test:telemetry_gpu_integration_test", + script = "//testing/scripts/run_gpu_integration_test_as_googletest.py", + args = [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], +) + +targets.script( + name = "telemetry_gpu_integration_test_android_chrome", + label = "//chrome/test:telemetry_gpu_integration_test_android_chrome", + script = "//testing/scripts/run_gpu_integration_test_as_googletest.py", + args = [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], +) + +targets.script( + name = "telemetry_gpu_integration_test_android_webview", + label = "//chrome/test:telemetry_gpu_integration_test_android_webview", + script = "//testing/scripts/run_gpu_integration_test_as_googletest.py", + args = [ + "../../content/test/gpu/run_gpu_integration_test.py", + ], +) + +targets.script( + name = "telemetry_gpu_integration_test_fuchsia", + label = "//chrome/test:telemetry_gpu_integration_test_fuchsia", + script = "//testing/scripts/run_gpu_integration_test_as_googletest.py", + args = [ + "../../content/test/gpu/run_gpu_integration_test_fuchsia.py", + "--logs-dir", + "${ISOLATED_OUTDIR}", + ], +) + +targets.compile_target( + name = "telemetry_gpu_integration_test_scripts_only", + label = "//chrome/test:telemetry_gpu_integration_test_scripts_only", +) + +targets.script( + name = "telemetry_gpu_unittests", + label = "//chrome/test:telemetry_gpu_unittests", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "../../content/test/gpu/run_unittests.py", + "-v", + ], +) + +# This isolate is used by +# https://www.chromium.org/developers/cluster-telemetry +targets.script( + name = "ct_telemetry_perf_tests_without_chrome", + label = "//chrome/test:ct_telemetry_perf_tests_without_chrome", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "../../tools/perf/run_benchmark", + ], +) + +targets.script( + name = "telemetry_perf_unittests", + label = "//chrome/test:telemetry_perf_unittests", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "../../tools/perf/run_tests", + "-v", + ], +) + +targets.script( + name = "telemetry_perf_unittests_android_chrome", + label = "//chrome/test:telemetry_perf_unittests_android_chrome", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "../../tools/perf/run_tests", + "-v", + ], +) + +targets.script( + name = "telemetry_perf_unittests_android_monochrome", + label = "//chrome/test:telemetry_perf_unittests_android_monochrome", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "../../tools/perf/run_tests", + "-v", + ], +) + +targets.script( + name = "telemetry_unittests", + label = "//chrome/test:telemetry_unittests", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "--xvfb", + "../../tools/perf/run_telemetry_tests", + "-v", + # TODO(nedn, eyaich): Remove this flag once crbug.com/549140 is fixed & + # Telemetry no longer downloads files in parallel. (crbug.com/661434#c24) + "--jobs=1", + "--chrome-root", + "../../", + ], +) + +targets.console_test_launcher( + name = "test_cpp_including_rust_unittests", + label = "//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests", +) + +targets.console_test_launcher( + name = "test_serde_json_lenient", + label = "//build/rust/tests/test_serde_json_lenient:test_serde_json_lenient", +) + +# TODO(crbug.com/1080749): Re-add this once the test is fixed and re-enabled. +# targets.script( +# name = "test_buildbucket_api_gpu_use_cases", +# label = "//content/test:test_buildbucket_api_gpu_use_cases", +# script = "//testing/scripts/test_buildbucket_api_gpu_use_cases.py", +# ) + +targets.generated_script( + name = "touch_to_fill_junit_tests", + label = "//chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests", +) + +targets.compile_target( + name = "trace_processor_shell", + label = "//third_party/perfetto/src/trace_processor:trace_processor_shell", +) + +targets.script( + name = "tracing_perftests", + label = "//components/tracing:tracing_perftests", + script = "//testing/scripts/run_performance_tests.py", + skip_usage_check = True, # Used by Pinpoint: crbug.com/1042778 + args = [ + "tracing_perftests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], +) + +targets.compile_target( + name = "traffic_annotation_auditor_dependencies", + label = "//:traffic_annotation_auditor_dependencies", +) + +targets.console_test_launcher( + name = "trichrome_chrome_bundle_smoke_test", + label = "//chrome/android:trichrome_chrome_bundle_smoke_test", +) + +targets.console_test_launcher( + name = "ui_android_unittests", + label = "//ui/android:ui_android_unittests", +) + +targets.windowed_test_launcher( + name = "ui_base_unittests", + label = "//ui/base:ui_base_unittests", +) + +targets.windowed_test_launcher( + name = "ui_chromeos_unittests", + label = "//ui/chromeos:ui_chromeos_unittests", +) + +targets.generated_script( + name = "ui_junit_tests", + label = "//ui/android:ui_junit_tests", +) + +targets.windowed_test_launcher( + name = "ui_touch_selection_unittests", + label = "//ui/touch_selection:ui_touch_selection_unittests", +) + +targets.script( + name = "testing_pytype", + label = "//testing:testing_pytype", + script = "//testing/run_pytype.py", +) + +targets.windowed_test_launcher( + name = "unit_tests", + label = "//chrome/test:unit_tests", +) + +# The test action timeouts for `updater_tests`, `updater_tests_system`, and +# `updater_tests_win_uac` are based on empirical observations of test +# runtimes, 2021-07. The launcher timeout was 90000 but then we increased +# the value to 180000 to work around an unfixable issue in the Windows +# COM runtime class activation crbug.com/1259178. +targets.console_test_launcher( + name = "updater_tests", + label = "//chrome/updater:updater_tests", + args = [ + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + ], +) + +targets.console_test_launcher( + name = "updater_tests_system", + label = "//chrome/updater:updater_tests_system", + args = [ + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + "--exclude-paths-from-win-defender", + ], +) + +targets.script( + name = "updater_tests_win_uac", + label = "//chrome/updater:updater_tests_win_uac", + script = "//testing/scripts/run_telemetry_as_googletest.py", + args = [ + "test_service/run_command_as_standard_user.py", + "--command=updater_tests.exe", + "--test-launcher-bot-mode", + "--cfi-diag=0", + "--gtest_shuffle", + "--test-launcher-timeout=180000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + ], +) + +targets.compile_target( + name = "chrome/updater:all", + label = "//chrome/updater:all", +) + +targets.generated_script( + name = "upload_trace_processor", + label = "//tools/perf/core/perfetto_binary_roller:upload_trace_processor", +) + +targets.console_test_launcher( + name = "url_unittests", + label = "//url:url_unittests", +) + +targets.console_test_launcher( + name = "usage_time_limit_unittests", + label = "//chrome/test:usage_time_limit_unittests", +) + +targets.console_test_launcher( + name = "vaapi_unittest", + label = "//media/gpu/vaapi:vaapi_unittest", +) + +targets.console_test_launcher( + name = "fake_libva_driver_unittest", + label = "//media/gpu/vaapi/test/fake_libva_driver:fake_libva_driver_unittest", +) + +targets.windowed_test_launcher( + name = "views_examples_unittests", + label = "//ui/views/examples:views_examples_unittests", +) + +targets.script( + name = "views_perftests", + label = "//ui/views:views_perftests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "--xvfb", + "--non-telemetry=true", + "views_perftests", + ], +) + +targets.windowed_test_launcher( + name = "views_unittests", + label = "//ui/views:views_unittests", +) + +targets.windowed_test_launcher( + name = "viz_unittests", + label = "//components/viz:viz_unittests", +) + +targets.console_test_launcher( + name = "vr_android_unittests", + label = "//chrome/browser/android/vr:vr_android_unittests", +) + +targets.script( + name = "vr_common_perftests", + label = "//chrome/browser/vr:vr_common_perftests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "vr_common_perftests", + "--non-telemetry=true", + "--adb-path", + "src/third_party/android_sdk/public/platform-tools/adb", + ], +) + +targets.console_test_launcher( + name = "vr_common_unittests", + label = "//chrome/browser/vr:vr_common_unittests", +) + +targets.script( + name = "vr_perf_tests", + label = "//tools/perf/contrib/vr_benchmarks:vr_perf_tests", + script = "//testing/scripts/run_performance_tests.py", + args = [ + "../../tools/perf/run_benchmark", + ], +) + +targets.script( + name = "vrcore_fps_test", + label = "//chrome/test/vr/perf:vrcore_fps_test", + script = "//chrome/test/vr/perf/vrcore_fps/run_vrcore_fps_test.py", + args = [ + "-v", + ], +) + +targets.windowed_test_launcher( + name = "vulkan_tests", + label = "//gpu/vulkan:vulkan_tests", +) + +targets.windowed_test_launcher( + name = "wayland_client_perftests", + label = "//components/exo/wayland:wayland_client_perftests", +) + +targets.windowed_test_launcher( + name = "wayland_client_tests", + label = "//components/exo/wayland:wayland_client_tests", +) + +targets.console_test_launcher( + name = "web_engine_browsertests", + label = "//fuchsia_web/webengine:web_engine_browsertests", +) + +targets.console_test_launcher( + name = "web_engine_integration_tests", + label = "//fuchsia_web/webengine:web_engine_integration_tests", +) + +targets.compile_target( + name = "web_engine_shell_pkg", + label = "//fuchsia_web/shell:web_engine_shell_pkg", +) + +targets.console_test_launcher( + name = "web_engine_unittests", + label = "//fuchsia_web/webengine:web_engine_unittests", +) + +targets.generated_script( + name = "webapk_client_junit_tests", + label = "//chrome/android/webapk/libs/client:webapk_client_junit_tests", +) + +targets.generated_script( + name = "webapk_shell_apk_h2o_junit_tests", + label = "//chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests", +) + +targets.generated_script( + name = "webapk_shell_apk_junit_tests", + label = "//chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests", +) + +targets.generated_script( + name = "webgpu_blink_web_tests", + label = "//:webgpu_blink_web_tests", + args = [ + "--results-directory", + "${ISOLATED_OUTDIR}", + ], +) + +targets.windowed_test_launcher( + name = "weblayer_browsertests", + label = "//weblayer/test:weblayer_browsertests", +) + +targets.script( + name = "webview_cts_tests", + label = "//android_webview/test:webview_cts_tests", + script = "//android_webview/tools/run_cts.py", + args = [ + "--skip-expected-failures", + "--use-webview-provider", + "apks/SystemWebView.apk", + "--apk-under-test", + "apks/SystemWebView.apk", + "--use-apk-under-test-flags-file", + "-v", + ], +) + +targets.script( + name = "webview_trichrome_cts_tests", + label = "//android_webview/test:webview_trichrome_cts_tests", + script = "//android_webview/tools/run_cts.py", + args = [ + "--skip-expected-failures", + "--additional-apk", + "apks/TrichromeLibrary.apk", + "--use-webview-provider", + "apks/TrichromeWebView.apk", + "--apk-under-test", + "apks/TrichromeWebView.apk", + "--use-apk-under-test-flags-file", + "-v", + ], +) + +targets.script( + name = "webview_trichrome_64_cts_tests", + label = "//android_webview/test:webview_trichrome_64_cts_tests", + script = "//android_webview/tools/run_cts.py", + args = [ + "--skip-expected-failures", + "--additional-apk", + "apks/TrichromeLibrary64.apk", + "--use-webview-provider", + "apks/TrichromeWebView64.apk", + "--apk-under-test", + "apks/TrichromeWebView64.apk", + "--use-apk-under-test-flags-file", + "-v", + ], +) + +targets.script( + name = "webview_64_cts_tests", + label = "//android_webview/test:webview_64_cts_tests", + script = "//android_webview/tools/run_cts.py", + args = [ + "--skip-expected-failures", + "--use-webview-provider", + "apks/SystemWebView64.apk", + "--apk-under-test", + "apks/SystemWebView64.apk", + "--use-apk-under-test-flags-file", + "-v", + ], +) + +targets.console_test_launcher( + name = "webengine_support_instrumentation_test_apk", + label = "//weblayer/browser/android/javatests:webengine_support_instrumentation_test_apk", +) + +targets.junit_test( + name = "weblayer_junit_tests", + label = "//weblayer/browser/java:weblayer_junit_tests", +) + +targets.console_test_launcher( + name = "webview_instrumentation_test_apk", + label = "//android_webview/test:webview_instrumentation_test_apk", +) + +targets.console_test_launcher( + name = "webview_ui_test_app_test_apk", + label = "//android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk", + args = [ + "--use-apk-under-test-flags-file", + ], +) + +targets.windowed_test_launcher( + name = "wm_unittests", + label = "//ui/wm:wm_unittests", +) + +targets.console_test_launcher( + name = "wtf_unittests", + label = "//third_party/blink/renderer/platform/wtf:wtf_unittests", +) + +targets.windowed_test_launcher( + name = "xr_browser_tests", + label = "//chrome/test:xr_browser_tests", + # We can't use the "script" type since we need to be run from the output + # directory (or at least given the path). Thus, we need to tell mb.py to not + # automatically append the .exe suffix on Windows. + executable = "run_xr_browser_tests.py", + executable_suffix = "", + args = [ + "--enable-gpu", + "--test-launcher-bot-mode", + "--test-launcher-jobs=1", + "--enable-pixel-output-in-tests", + ], +) + +targets.console_test_launcher( + name = "zlib_unittests", + label = "//third_party/zlib:zlib_unittests", + args = [ + "--test-launcher-timeout=400000", + ], +) + +targets.console_test_launcher( + name = "zucchini_unittests", + label = "//components/zucchini:zucchini_unittests", +)
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn index 81aa736..07f9803 100644 --- a/ios/chrome/app/BUILD.gn +++ b/ios/chrome/app/BUILD.gn
@@ -232,7 +232,7 @@ deps = [ "//base", "//ios/chrome/app/application_delegate:app_state_header", - "//ios/chrome/browser/ui/main:observing_scene_agent", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/ui/safe_mode", ] } @@ -325,6 +325,7 @@ "//ios/chrome/app/application_delegate:application_delegate_internal", "//ios/chrome/browser/browsing_data", "//ios/chrome/browser/geolocation", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/public/commands:commands", "//ios/chrome/browser/shared/public/features", @@ -335,7 +336,6 @@ "//ios/chrome/browser/ui/first_run:first_run_provider", "//ios/chrome/browser/ui/first_run:utils", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/ui/screen:screen_provider", ] }
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 96ea3975..033c254 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -2884,19 +2884,25 @@ =1 {for {COUNT} site or app} other {for {COUNT} sites and apps}} </message> - <message name="IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT" desc="Displays the number of compromised passwords present in the database."> + <message name="IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT" desc="Displays the number of compromised passwords present in the database."> {COUNT, plural, =0 {No compromised passwords} =1 {{COUNT} Compromised password} other {{COUNT} Compromised passwords}} </message> + <message name="IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT" desc="In sentence case: Displays the number of compromised passwords present in the database." meaning="[In sentence case]"> + {COUNT, plural, + =0 {No compromised passwords} + =1 {{COUNT} compromised password} + other {{COUNT} compromised passwords}} + </message> <message name="IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT" desc="Displays the number of reused passwords present in the database. User can only have 2 or more reused passwords, so this string will always be plural."> - <ph name="COUNT">$1<ex>2</ex></ph> Reused passwords + <ph name="COUNT">$1<ex>2</ex></ph> reused passwords </message> <message name="IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT" desc="Displays the number of weak passwords present in the database."> {COUNT, plural, - =1 {{COUNT} Weak password} - other {{COUNT} Weak passwords}} + =1 {{COUNT} weak password} + other {{COUNT} weak passwords}} </message> <message name="IDS_IOS_PASSWORD_CHECKUP_DISMISSED_COUNT" desc="Displays the number of compromised password warnings that have been dismissed."> {COUNT, plural, @@ -4409,7 +4415,7 @@ <message name="IDS_IOS_ACCOUNT_TABLE_ENTER_PASSPHRASE_MESSAGE" desc="The error message to show in the account table when there is a passphrase error. [iOS only]"> Sync is not working. To start sync enter your passphrase. </message> - <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]"> + <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_COMPROMISED_PASSWORDS_TITLE" desc="In Title Case: Title for the compromised passwords item in the Password Checkup Homepage. [Length: 16em] [iOS only]" meaning="[In Title Case]"> {count, plural, =0 {No Compromised Passwords} =1 {{count} Compromised Password} @@ -4429,7 +4435,7 @@ <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_TITLE" desc="Title for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [Length: 16em] [iOS only]"> Your Passwords are Unique </message> - <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_TITLE" desc="Title for the reused passwords item in the Password Checkup Homepage when there are reused passwords. User can only have 2 or more reused passwords, so this string will always be plural. [Length: 16em] [iOS only]"> + <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_REUSED_PASSWORDS_TITLE" desc="In Title Case: Title for the reused passwords item in the Password Checkup Homepage when there are reused passwords. User can only have 2 or more reused passwords, so this string will always be plural. [Length: 16em] [iOS only]" meaning="[In Title Case]"> <ph name="COUNT">$1<ex>2</ex></ph> Reused Passwords </message> <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_REUSED_PASSWORDS_SUBTITLE" desc="Subitle for the reused passwords item in the Password Checkup Homepage when there are no reused passwords. [iOS only]"> @@ -4441,7 +4447,7 @@ <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_NO_WEAK_PASSWORDS_TITLE" desc="Title for the weak passwords item in the Password Checkup Homepage when there are no weak passwords. [Length: 16em] [iOS only]"> Your Passwords look Strong </message> - <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_TITLE" desc="Title for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [Length: 16em] [iOS only]"> + <message name="IDS_IOS_PASSWORD_CHECKUP_HOMEPAGE_WEAK_PASSWORDS_TITLE" desc="In Title Case: Title for the weak passwords item in the Password Checkup Homepage when there are weak passwords. [Length: 16em] [iOS only]" meaning="[In Title Case]"> {count, plural, =1 {{count} Weak Password} other {{count} Weak Passwords}}
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT.png.sha1 new file mode 100644 index 0000000..a126dcec --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT.png.sha1
@@ -0,0 +1 @@ +2f36cdcb36d9d9f34898c7d817b334957dcee4fc \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT.png.sha1 index 6d3821c..b17cc15 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT.png.sha1
@@ -1 +1 @@ -e341794c0611382391f3b158decbdfac5c184d38 \ No newline at end of file +2f7946a8c40e4c74a580a726116357a70f9ce764 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT.png.sha1 index efdbc5a2..46eacf8 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_REUSED_COUNT.png.sha1
@@ -1 +1 @@ -0a6ad5a8f9098d70661752ac710e20d4a98cf9c6 \ No newline at end of file +30480f209de6271475bb55e4e64357e6facb9450 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT.png.sha1 index 9ab7a300..b78d6a9 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_CHECKUP_WEAK_COUNT.png.sha1
@@ -1 +1 @@ -8ced0a11ca368b5574c62d440169f5f3de78a357 \ No newline at end of file +b96c81d0f34ef2c3521b93bc43c68eddb98d7ae4 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 1ffeda6..eb6c7b4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Vertaal bladsy?</translation> <translation id="7781069478569868053">Nuwe oortjie-bladsy</translation> <translation id="7781829728241885113">Gister</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Ná 1 dag}other{Ná {COUNT} dae}}</translation> <translation id="778855399387580014">Begin 'n soektog in 'n nuwe Chrome-oortjie.</translation> <translation id="7791543448312431591">Voeg by</translation> <translation id="7807060072011926525">Verskaf deur Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index ce91f63..e3e9195 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">পৃষ্ঠাখন অনুবাদ কৰিবনে?</translation> <translation id="7781069478569868053">নতুন টেব পৃষ্ঠা</translation> <translation id="7781829728241885113">কালি</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{১ দিনৰ পাছত}one{{COUNT} দিনৰ পাছত}other{{COUNT} দিনৰ পাছত}}</translation> <translation id="778855399387580014">Chromeৰ নতুন টেবত সন্ধান আৰম্ভ কৰক।</translation> <translation id="7791543448312431591">যোগ কৰক</translation> <translation id="7807060072011926525">Googleএ প্ৰদান কৰিছে</translation> @@ -1088,6 +1089,7 @@ <translation id="8136856065410661948">Chrome আৰু Google Lensৰ পৰা আপোনাৰ Apple Calendarত অনুষ্ঠান সৃষ্টি কৰিবলৈ এইটো ব্যৱহাৰ কৰা হ’ব।</translation> <translation id="8156478151976189188">পাছৱৰ্ড ছিংক কৰাৰ সুবিধাটোৱে কাম কৰা নাই</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> টা একাউণ্ট</translation> +<translation id="8159358225423560600">এইমাত্ৰ</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />আপোনাৰ ডিভাইচ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">পৃষ্ঠা অনুবাদ কৰক</translation> @@ -1118,6 +1120,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> দিন ব্যৱহাৰ নকৰা টেবসমূহ</translation> <translation id="8407669440184693619">এই ছাইটটোৰ বাবে কোনো পাছৱৰ্ড বিচাৰি পোৱা নগ’ল</translation> <translation id="842017693807136194">ৰ জৰিয়তে ছাইন ইন কৰি থোৱা হৈছে</translation> +<translation id="8423121072346537366">এইমাত্ৰ</translation> <translation id="8425693829365242963">আপোনাৰ পাছৱৰ্ডসমূহ অদ্বিতীয়</translation> <translation id="8428045167754449968">নগৰ / চহৰ</translation> <translation id="8428213095426709021">ছেটিংসমূহ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 72581837..a0a4485 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Səhifə tərcümə edilsin?</translation> <translation id="7781069478569868053">Yeni Panel Səhifəsi</translation> <translation id="7781829728241885113">Dünən</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 gün sonra}other{{COUNT} gün sonra}}</translation> <translation id="778855399387580014">Yeni Chrome tabında axtarışa başlayın.</translation> <translation id="7791543448312431591">Əlavə etmək</translation> <translation id="7807060072011926525">Google tərəfindən təmin edilib</translation> @@ -1088,6 +1089,7 @@ <translation id="8136856065410661948">Bu, Chrome və Google Linzadan Apple Təqvimdə tədbirlər yaratmaq üçün istifadə olunacaq.</translation> <translation id="8156478151976189188">Parol Sinxronizasiyası İşləmir</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> hesabları</translation> +<translation id="8159358225423560600">indicə</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Cihazlarınız<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Səhifəni tərcümə edin</translation> @@ -1118,6 +1120,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> gün istifadə edilməmiş tablar</translation> <translation id="8407669440184693619">Bu sayt üçün parol tapılmadı</translation> <translation id="842017693807136194">Bununla Daxil Olunub</translation> +<translation id="8423121072346537366">İndicə</translation> <translation id="8425693829365242963">Parollar unikaldır</translation> <translation id="8428045167754449968">Şəhər / Kənd</translation> <translation id="8428213095426709021">Ayarlar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 37f95eb..471c8a69 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">Това ще даде възможност за създаване на събития в Apple Calendar чрез съдържание от Chrome и Google Обектив.</translation> <translation id="8156478151976189188">Синхронизирането на паролите не работи</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> профила</translation> +<translation id="8159358225423560600">току-що</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Вашите устройства<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Превод на страницата</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944">Разделите не са използвани от <ph name="THRESHOLD" /> дни</translation> <translation id="8407669440184693619">Няма намерени пароли за този сайт</translation> <translation id="842017693807136194">Влезли сте със:</translation> +<translation id="8423121072346537366">Току-що</translation> <translation id="8425693829365242963">Паролите ви са уникални</translation> <translation id="8428045167754449968">Град/селище</translation> <translation id="8428213095426709021">Настройки</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 367f141..911c125 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">এটি Chrome এবং Google Lens থেকে আপনার Apple ক্যালেন্ডারে ইভেন্ট তৈরি করতে ব্যবহার করা হবে।</translation> <translation id="8156478151976189188">'পাসওয়ার্ড সিঙ্ক' ফিচার কাজ করছে না</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" />টি অ্যাকাউন্ট</translation> +<translation id="8159358225423560600">এইমাত্র</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />আপনার ডিভাইস<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">পৃষ্ঠাটি অনুবাদ করুন</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> দিন ট্যাব ব্যবহার করা হয়নি</translation> <translation id="8407669440184693619">এই সাইটের জন্য কোনও পাসওয়ার্ড পাওয়া যায়নি</translation> <translation id="842017693807136194">এটি দিয়ে সাইন-ইন করেছেন</translation> +<translation id="8423121072346537366">এইমাত্র</translation> <translation id="8425693829365242963">আপনার পাসওয়ার্ড আগে ব্যবহার করা হয়নি</translation> <translation id="8428045167754449968">নগর / ছোট শহর</translation> <translation id="8428213095426709021">সেটিংস</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 4ddb3d1..afe85ad 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -178,7 +178,7 @@ <translation id="2218443599109088993">Umanji</translation> <translation id="2230173723195178503">Web lokacija je učitana</translation> <translation id="2239626343334228536">Brisanje podataka pregledanja...</translation> -<translation id="2242467532204595597">Chrome možete upotrebljavati svaki put kad dodirnete veze u porukama, dokumentima i drugim aplikacijama.</translation> +<translation id="2242467532204595597">Koristite Chrome svaki put kada dodirnete linkove u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="22508856139286506">Odbačena upozorenja (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Meni → Historija</translation> <translation id="2256933947031277845">Vaša organizacija vam dozvoljava da se prijavite samo s određenim računima.</translation> @@ -207,7 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} sačuvana adresa je dostupna iznad tastature.}one{{count} sačuvana adresa je dostupna iznad tastature.}few{{count} sačuvane adrese su dostupne iznad tastature.}other{{count} sačuvanih adresa je dostupno iznad tastature.}}</translation> <translation id="2421004566762153674">Blokiranje kolačića treće strane</translation> <translation id="2421044535038393232">Nastavi uređivanje</translation> -<translation id="2423077901494354337">Sada ćete iskoristiti sve prednosti Chromea na uređaju.</translation> +<translation id="2423077901494354337">Sada možete iskoristiti sve prednosti Chromea na uređaju.</translation> <translation id="2434405374328098816">Već ste sačuvali lozinku za korisnika "<ph name="USERNAME" />" na web lokaciji <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Prikaži lozinku</translation> <translation id="2451654228769116489">Zakači karticu</translation> @@ -804,7 +804,7 @@ <translation id="6346549652287021269">Pokrenuti novo preuzimanje?</translation> <translation id="6347953390226388422">{count,plural, =1{Ova adresa će se izbrisati s vašeg Google računa (<ph name="USER_EMAIL" />) i uređaja.}one{Ove adrese će se izbrisati s vašeg Google računa (<ph name="USER_EMAIL" />) i uređaja.}few{Ove adrese će se izbrisati s vašeg Google računa (<ph name="USER_EMAIL" />) i uređaja.}other{Ove adrese će se izbrisati s vašeg Google računa (<ph name="USER_EMAIL" />) i uređaja.}}</translation> <translation id="634878792104344809">Sinhronizirajte lozinke, historiju i drugo na svim svojim uređajima</translation> -<translation id="6348855835728304880">Pristupajte zaporkama u Chromeu i ostalom u drugim aplikacijama na ovom uređaju.</translation> +<translation id="6348855835728304880">Pristupite lozinkama u Chromeu i ostalom u drugim aplikacijama na ovom uređaju.</translation> <translation id="6355820205320395730">Slabe lozinke je lako pogoditi. Vodite računa da kreirate jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još sigurnosnih savjeta.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Prati <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Ne postoje anonimne kartice</translation> @@ -957,7 +957,7 @@ <translation id="7221173315674413369">Istražite nove funkcije i savjete u funkciji Šta je novo</translation> <translation id="7223102419539744003">Zatvori karticu</translation> <translation id="722454870747268814">Nova anonimna kartica</translation> -<translation id="723787869754590019">Upotrebljavajte Chrome za automatsko popunjavanje</translation> +<translation id="723787869754590019">Koristite Chrome za automatsko popunjavanje</translation> <translation id="7265758999917665941">Nikada za ovu web lokaciju</translation> <translation id="7272437679830969316">Nije moguće potvrditi identitet. Lozinka nije kopirana.</translation> <translation id="7291368939935408496">Pripremanje lozinki...</translation> @@ -1029,7 +1029,7 @@ <translation id="7781011649027948662">Prevesti stranicu?</translation> <translation id="7781069478569868053">Stranica na novoj kartici</translation> <translation id="7781829728241885113">Jučer</translation> -<translation id="7786246662347093005">{COUNT,plural, =1{Nakon jedan dan}one{Nakon {COUNT} dan}few{Nakon {COUNT} dana}other{Nakon {COUNT} dana}}</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Nakon 1 dana}one{Nakon {COUNT} dana}few{Nakon {COUNT} dana}other{Nakon {COUNT} dana}}</translation> <translation id="778855399387580014">Započni pretraživanje na novoj Chrome kartici.</translation> <translation id="7791543448312431591">Dodaj</translation> <translation id="7807060072011926525">Pruža Google</translation> @@ -1166,7 +1166,7 @@ <translation id="8717864919010420084">Kopiraj link</translation> <translation id="8721297211384281569">Meni alata</translation> <translation id="8725066075913043281">Pokušaj ponovo</translation> -<translation id="8727043961453758442">Iskoristite sve prednosti preglednika Chrome</translation> +<translation id="8727043961453758442">Iskoristite sve prednosti Chromea</translation> <translation id="8730621377337864115">Gotovo</translation> <translation id="8731388423028622182">Bili ste odjavljeni sa svog računa <ph name="USER_NAME" /> tokom vraćanja iPhonea na zadano. Dodirnite Nastavi u nastavku da se prijavite.</translation> <translation id="87371078663613140">Istražite opcije u traci menija</translation> @@ -1216,7 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Nema ugroženih lozinki}=1{{count} ugrožena lozinka}one{{count} ugrožena lozinka}few{{count} ugrožene lozinke}other{{count} ugroženih lozinki}}</translation> <translation id="8981454092730389528">Kontrole aktivnosti na Googleu</translation> <translation id="8985320356172329008">Prijavljeni ste na Google kao</translation> -<translation id="8986567980592931173">Prijavite se Google računom da biste sinkronizirali zaporke, povijest i ostalo.</translation> +<translation id="8986567980592931173">Prijavite se s Google računom da sinhronizirate lozinke, historiju i drugo.</translation> <translation id="8998289560386111590">Nije dostupno na vašem uređaju</translation> <translation id="9000089900434778519">Vaš pretraživač je <ph name="DSE_NAME" />. Ako je primjenjivo, pogledajte uputstva pretraživača da saznate kako izbrisati historiju pretraživanja.</translation> <translation id="9008201768610948239">Zanemari</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index 9d0f38b..7dbda05 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Vols traduir la pàgina?</translation> <translation id="7781069478569868053">Pàgina Pestanya nova</translation> <translation id="7781829728241885113">Ahir</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Al cap d'1 dia}other{Al cap de {COUNT} dies}}</translation> <translation id="778855399387580014">Inicia una cerca en una pestanya nova de Chrome.</translation> <translation id="7791543448312431591">Afegeix</translation> <translation id="7807060072011926525">Proporcionat per Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index efe4bb31..a7fdf06f0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Cyfieithu'r Dudalen?</translation> <translation id="7781069478569868053">Tudalen Tab Newydd</translation> <translation id="7781829728241885113">Ddoe</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Ar ôl 1 Diwrnod}zero{Ar ôl {COUNT} Diwrnod}two{Ar ôl {COUNT} Ddiwrnod}few{Ar ôl {COUNT} Diwrnod}many{Ar ôl {COUNT} Diwrnod}other{Ar ôl {COUNT} Diwrnod}}</translation> <translation id="778855399387580014">Dechrau chwiliad mewn tab Chrome newydd.</translation> <translation id="7791543448312431591">Ychwanegu</translation> <translation id="7807060072011926525">Darperir gan Google</translation> @@ -1088,6 +1089,7 @@ <translation id="8136856065410661948">Bydd hwn yn cael ei ddefnyddio i greu digwyddiadau yn eich Apple Calendar o Chrome a Google Lens.</translation> <translation id="8156478151976189188">Nid yw Cysoni Cyfrineiriau yn Gweithio</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> o gyfrifon</translation> +<translation id="8159358225423560600">newydd ddigwydd</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Eich dyfeisiau<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Cyfieithu'r Dudalen</translation> @@ -1118,6 +1120,7 @@ <translation id="8393889347136007944">Tabiau sydd heb eu defnyddio am <ph name="THRESHOLD" /> o ddiwrnodau</translation> <translation id="8407669440184693619">Nid ydym wedi dod o hyd i unrhyw gyfrineiriau ar gyfer y wefan hon</translation> <translation id="842017693807136194">Wedi Mewngofnodi Gyda</translation> +<translation id="8423121072346537366">Newydd Ddigwydd</translation> <translation id="8425693829365242963">Mae eich Cyfrineiriau yn Unigryw</translation> <translation id="8428045167754449968">Dinas / Tref</translation> <translation id="8428213095426709021">Gosodiadau</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index 0d9ccbc..52762e2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -525,7 +525,7 @@ <translation id="4592368184551360546">Tastatur</translation> <translation id="4606247758155004938">Din browser administreres af din organisation.</translation> <translation id="461440297010471931">Søgning via Google</translation> -<translation id="4619564267100705184">Bekræft din identitet</translation> +<translation id="4619564267100705184">Verificer din identitet</translation> <translation id="4619615317237390068">Faner fra andre enheder</translation> <translation id="4620246317052452550">Sider, du har læst</translation> <translation id="4620888520263267479">Vis forhåndsvisninger af links</translation> @@ -846,7 +846,7 @@ <translation id="650279896687777322">Få flere oplysninger...</translation> <translation id="6510072653668207258">Påmind mig senere</translation> <translation id="651505212789431520">Vil du annullere synkroniseringen? Du kan til enhver tid aktivere synkronisering i indstillingerne.</translation> -<translation id="6518133107902771759">Bekræft</translation> +<translation id="6518133107902771759">Verificer</translation> <translation id="6524918542306337007">Inkognitotilstand er ikke tilgængelig</translation> <translation id="6530992499366869131">Få en underretning, hvis adgangskoder afsløres i forbindelse med et brud på datasikkerheden</translation> <translation id="6537746030088321027">eksempel.dk</translation> @@ -965,7 +965,7 @@ <translation id="734758817008927353">Valgmuligheder for at gemme kort</translation> <translation id="7351537303876921605">Tryk på Opret link i genvejsmenuen</translation> <translation id="7352651011704765696">Noget gik galt</translation> -<translation id="7353432112255316844">Bekræft din identitet</translation> +<translation id="7353432112255316844">Verificer din identitet</translation> <translation id="7383797227493018512">Læseliste</translation> <translation id="7398893703713203428">Opret link</translation> <translation id="7400418766976504921">Webadresse</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 4824f87..71fd7ce 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -1089,6 +1089,7 @@ <translation id="8136856065410661948">Dadurch kannst du in deinem Apple-Kalender Termine anhand von Inhalten aus Chrome und Google Lens erstellen.</translation> <translation id="8156478151976189188">Die Passwortsynchronisierung funktioniert nicht</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> Konten</translation> +<translation id="8159358225423560600">gerade eben</translation> <translation id="8179976553408161302">Eingabetaste</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Meine Geräte<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Seite übersetzen</translation> @@ -1119,6 +1120,7 @@ <translation id="8393889347136007944">Tabs, die <ph name="THRESHOLD" /> Tage lang nicht verwendet wurden</translation> <translation id="8407669440184693619">Keine Passwörter für diese Website gefunden</translation> <translation id="842017693807136194">Angemeldet mit</translation> +<translation id="8423121072346537366">gerade eben</translation> <translation id="8425693829365242963">Deine Passwörter sind eindeutig</translation> <translation id="8428045167754449968">Stadt/Ort</translation> <translation id="8428213095426709021">Einstellungen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index fc2b61b..a6368456 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Σμίκρυνση</translation> <translation id="2230173723195178503">Η ιστοσελίδα φορτώθηκε</translation> <translation id="2239626343334228536">Διαγραφή δεδομένων περιήγησης…</translation> +<translation id="2242467532204595597">Χρησιμοποιήστε το Chrome κάθε φορά που πατάτε συνδέσμους σε μηνύματα, έγγραφα και άλλες εφαρμογές.</translation> <translation id="22508856139286506">Προειδοποιήσεις που παραβλέφθηκαν (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Μενού → Ιστορικό</translation> <translation id="2256933947031277845">Ο οργανισμός σας επιτρέπει να συνδέεστε μόνο με ορισμένους λογαριασμούς.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{Διατίθεται {count} αποθηκευμένη διεύθυνση πάνω από το πληκτρολόγιο.}other{Διατίθενται {count} αποθηκευμένες διευθύνσεις πάνω από το πληκτρολόγιο.}}</translation> <translation id="2421004566762153674">Αποκλεισμός cookie τρίτου μέρους</translation> <translation id="2421044535038393232">Συνέχιση επεξεργασίας</translation> +<translation id="2423077901494354337">Τώρα θα αξιοποιείτε πλήρως το Chrome στη συσκευή σας.</translation> <translation id="2434405374328098816">Έχετε ήδη αποθηκεύσει έναν κωδικό πρόσβασης για τον χρήστη "<ph name="USERNAME" />" στον ιστότοπο <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Εμφάνιση κωδικού πρόσβασης</translation> <translation id="2451654228769116489">Καρφίτσωμα καρτέλας</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Να ξεκινήσει νέα λήψη;</translation> <translation id="6347953390226388422">{count,plural, =1{Αυτή η διεύθυνση θα διαγραφεί από τον Λογαριασμό σας Google (<ph name="USER_EMAIL" />) και από αυτήν τη συσκευή.}other{Αυτές οι διευθύνσεις θα διαγραφούν από τον Λογαριασμό σας Google (<ph name="USER_EMAIL" />) και από αυτήν τη συσκευή.}}</translation> <translation id="634878792104344809">Συγχρονίστε τους κωδικούς πρόσβασης, το ιστορικό σας και άλλο περιεχόμενο σε όλες τις συσκευές σας</translation> +<translation id="6348855835728304880">Αποκτήστε πρόσβαση σε κωδικούς πρόσβασης και άλλα στοιχεία από το Chrome σε άλλες εφαρμογές αυτής της συσκευής.</translation> <translation id="6355820205320395730">Είναι εύκολο να μαντέψει κανείς τους ασθενείς κωδικούς πρόσβασης. Φροντίστε να δημιουργείτε ισχυρούς κωδικούς πρόσβασης. <ph name="BEGIN_LINK" />Δείτε περισσότερες συμβουλές ασφάλειας.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Παρακολούθηση <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Δεν υπάρχουν καρτέλες ανώνυμης περιήγησης</translation> @@ -955,6 +958,7 @@ <translation id="7221173315674413369">Εξερευνήστε νέες λειτουργίες και συμβουλές στην ενότητα Τι νέο υπάρχει</translation> <translation id="7223102419539744003">Κλείσιμο καρτέλας</translation> <translation id="722454870747268814">Νέα καρτέλα ανώνυμης περιήγησης</translation> +<translation id="723787869754590019">Χρήση του Chrome για αυτόματη συμπλήρωση</translation> <translation id="7265758999917665941">Ποτέ για αυτόν τον ιστότοπο</translation> <translation id="7272437679830969316">Δεν είναι δυνατή η επαλήθευση της ταυτότητας σας. Ο κωδικός πρόσβασης δεν αντιγράφηκε.</translation> <translation id="7291368939935408496">Προετοιμασία κωδικών πρόσβασης…</translation> @@ -1156,12 +1160,14 @@ <translation id="8663764600409216912">Χρησιμοποιείτε κωδικούς πρόσβασης που δεν μπορεί κάποιος να μαντέψει εύκολα</translation> <translation id="8668210798914567634">Αυτή η σελίδα αποθηκεύτηκε στη λίστα ανάγνωσης</translation> <translation id="8680787084697685621">Τα στοιχεία σύνδεσης λογαριασμού έχουν λήξει.</translation> +<translation id="868773710103052534">Όλα έτοιμα</translation> <translation id="8693663554456874301">{count,plural, =1{Κλείσιμο καρτέλας}other{Κλείσιμο καρτελών}}</translation> <translation id="8703536910991780768">Οι κωδικοί πρόσβασής σας φαίνονται ισχυροί</translation> <translation id="8706588385081740091">Κωδικοί πρόσβασης</translation> <translation id="8717864919010420084">Αντιγραφή συνδέσμου</translation> <translation id="8721297211384281569">Μενού εργαλείων</translation> <translation id="8725066075913043281">Προσπαθήστε ξανά</translation> +<translation id="8727043961453758442">Αξιοποιήστε πλήρως το Chrome</translation> <translation id="8730621377337864115">Ολοκληρώθηκε</translation> <translation id="8731388423028622182">Αποσυνδεθήκατε από τον λογαριασμό σας <ph name="USER_NAME" /> στο πλαίσιο της επαναφοράς του iPhone. Πατήστε συνέχεια παρακάτω για να συνδεθείτε.</translation> <translation id="87371078663613140">Εξερευνήστε τις επιλογές στη γραμμή μενού</translation> @@ -1211,6 +1217,7 @@ <translation id="8978059030508051916">{count,plural, =0{Δεν υπάρχουν παραβιασμένοι κωδικοί πρόσβασης}=1{{count} παραβιασμένος κωδικός πρόσβασης}other{{count} παραβιασμένοι κωδικοί πρόσβασης}}</translation> <translation id="8981454092730389528">Στοιχεία ελέγχου δραστηριότητας Google</translation> <translation id="8985320356172329008">Έχετε συνδεθεί στο Google ως</translation> +<translation id="8986567980592931173">Συνδεθείτε με τον Λογαριασμό σας Google για να συγχρονίσετε τους κωδικούς πρόσβασης, το ιστορικό σας και άλλα.</translation> <translation id="8998289560386111590">Δεν διατίθεται στη συσκευή σας</translation> <translation id="9000089900434778519">Χρησιμοποιείτε τη μηχανή αναζήτησης <ph name="DSE_NAME" />. Ανατρέξτε στις οδηγίες για διαγραφή του ιστορικού αναζήτησής σας, εφόσον υπάρχουν.</translation> <translation id="9008201768610948239">Παράβλεψη</translation>
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 a195bec..5d5730c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Zoom out</translation> <translation id="2230173723195178503">Web page loaded</translation> <translation id="2239626343334228536">Clearing browsing data…</translation> +<translation id="2242467532204595597">Use Chrome anytime that you tap links in messages, documents and other apps.</translation> <translation id="22508856139286506">Dismissed warnings (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Menu → History</translation> <translation id="2256933947031277845">Your organisation allows you to sign in only with certain accounts.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} saved address available above your keyboard.}other{{count} saved addresses available above your keyboard.}}</translation> <translation id="2421004566762153674">Blocking third-party cookies</translation> <translation id="2421044535038393232">Keep editing</translation> +<translation id="2423077901494354337">You'll now get the most out of Chrome on your device.</translation> <translation id="2434405374328098816">You already saved a password for '<ph name="USERNAME" />' at <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Show password</translation> <translation id="2451654228769116489">Pin tab</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Start new download?</translation> <translation id="6347953390226388422">{count,plural, =1{This address will be deleted from your Google Account (<ph name="USER_EMAIL" />) and from this device.}other{These addresses will be deleted from your Google Account (<ph name="USER_EMAIL" />) and from this device.}}</translation> <translation id="634878792104344809">Sync your passwords, history and more on all of your devices</translation> +<translation id="6348855835728304880">Access your Chrome passwords and more across other apps on this device.</translation> <translation id="6355820205320395730">Weak passwords are easy to guess. Make sure that you’re creating strong passwords. <ph name="BEGIN_LINK" />See more security tips.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Follow <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">No Incognito Tabs</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Explore new features and tips in 'What’s new'</translation> <translation id="7223102419539744003">Close tab</translation> <translation id="722454870747268814">New Incognito tab</translation> +<translation id="723787869754590019">Use Chrome for auto-fill</translation> <translation id="7265758999917665941">Never for this site</translation> <translation id="7272437679830969316">Can't verify your identity. Password not copied.</translation> <translation id="7291368939935408496">Preparing Passwords…</translation> @@ -1155,12 +1159,14 @@ <translation id="8663764600409216912">You’re using passwords that look hard to guess</translation> <translation id="8668210798914567634">This page has been saved to your Reading List.</translation> <translation id="8680787084697685621">Account sign-in details are out of date.</translation> +<translation id="868773710103052534">You're ready!</translation> <translation id="8693663554456874301">{count,plural, =1{Close tab}other{Close tabs}}</translation> <translation id="8703536910991780768">Your passwords look strong</translation> <translation id="8706588385081740091">Passwords</translation> <translation id="8717864919010420084">Copy link</translation> <translation id="8721297211384281569">Tools Menu</translation> <translation id="8725066075913043281">Try again</translation> +<translation id="8727043961453758442">Get the most out of Chrome</translation> <translation id="8730621377337864115">Done</translation> <translation id="8731388423028622182">You were signed out of your account <ph name="USER_NAME" /> as part of your iPhone reset. Tap continue below to sign in.</translation> <translation id="87371078663613140">Explore the options in the menu bar</translation> @@ -1210,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{No compromised passwords}=1{{count} compromised password}other{{count} compromised passwords}}</translation> <translation id="8981454092730389528">Google Activity Controls</translation> <translation id="8985320356172329008">Signed In to Google as</translation> +<translation id="8986567980592931173">Sign in with your Google Account to sync your passwords, history and more.</translation> <translation id="8998289560386111590">Not available on your device</translation> <translation id="9000089900434778519">Your search engine is <ph name="DSE_NAME" />. See their instructions for deleting your search history, if applicable.</translation> <translation id="9008201768610948239">Ignore</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 8a3e71e..e07ba2bd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">¿Quieres traducir esta página?</translation> <translation id="7781069478569868053">Página Nueva pestaña</translation> <translation id="7781829728241885113">Ayer</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Después de 1 día}other{Después de {COUNT} días}}</translation> <translation id="778855399387580014">Inicia una búsqueda en una nueva pestaña de Chrome.</translation> <translation id="7791543448312431591">Añadir</translation> <translation id="7807060072011926525">Proporcionado por Google</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Se usará para crear eventos en tu calendario de Apple a partir de contenido de Chrome y Google Lens.</translation> <translation id="8156478151976189188">Sincronización de contraseñas no funciona</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> cuentas</translation> +<translation id="8159358225423560600">ahora mismo</translation> <translation id="8179976553408161302">Intro</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Tus dispositivos<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Traducir página</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Pestañas que no se han usado en <ph name="THRESHOLD" /> días</translation> <translation id="8407669440184693619">No se han encontrado contraseñas para este sitio web</translation> <translation id="842017693807136194">Has iniciado sesión como</translation> +<translation id="8423121072346537366">ahora mismo</translation> <translation id="8425693829365242963">Tus contraseñas son únicas</translation> <translation id="8428045167754449968">Ciudad/Localidad</translation> <translation id="8428213095426709021">Configuración</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index 20465ff..e50e886d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Kas tõlkida leht?</translation> <translation id="7781069478569868053">Uus vaheleht</translation> <translation id="7781829728241885113">Eile</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 päeva pärast}other{{COUNT} päeva pärast}}</translation> <translation id="778855399387580014">Alustage otsingut uuel Chrome'i vahelehel.</translation> <translation id="7791543448312431591">Lisa</translation> <translation id="7807060072011926525">Pakub Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 70d14316..a225667 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">صفحه ترجمه شود؟</translation> <translation id="7781069478569868053">صفحه برگه جدید</translation> <translation id="7781829728241885113">دیروز</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{پساز یک روز}one{پساز {COUNT} روز}other{پساز {COUNT} روز}}</translation> <translation id="778855399387580014">جستجویی در برگه Chrome جدیدی شروع کنید.</translation> <translation id="7791543448312431591">افزودن</translation> <translation id="7807060072011926525">ارائه از Google</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">از این دسترسی برای ایجاد رویداد در Apple Calendar از Chrome و «لنز Google» استفاده میشود.</translation> <translation id="8156478151976189188">«همگامسازی گذرواژه» کار نمیکند</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> حساب</translation> +<translation id="8159358225423560600">همین حالا</translation> <translation id="8179976553408161302">ورود</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />دستگاههای شما<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">ترجمه صفحه</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">برگههایی که بهمدت <ph name="THRESHOLD" /> روز استفاده نشدهاند</translation> <translation id="8407669440184693619">هیچ گذرواژهای برای این سایت پیدا نشد</translation> <translation id="842017693807136194">ورود به سیستم با</translation> +<translation id="8423121072346537366">همین حالا</translation> <translation id="8425693829365242963">گذرواژههایتان تکراری نیست</translation> <translation id="8428045167754449968">شهر / شهرک</translation> <translation id="8428213095426709021">تنظیمات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 109e884..dafc9e80 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Käännetäänkö sivu?</translation> <translation id="7781069478569868053">Uusi välilehti -sivu</translation> <translation id="7781829728241885113">Eilen</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 päivän päästä}other{{COUNT} päivän päästä}}</translation> <translation id="778855399387580014">Aloita haku Chrome-välilehdellä.</translation> <translation id="7791543448312431591">Lisää</translation> <translation id="7807060072011926525">Googlen tarjoama</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Käytetään Apple-kalenterin tapahtumien luomiseen Chromesta ja Google Lensistä.</translation> <translation id="8156478151976189188">Salasanojen synkronointi ei toimi</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> tiliä</translation> +<translation id="8159358225423560600">äsken</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Omat laitteet<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Käännä sivu</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Välilehdet, joita ei ole käytetty <ph name="THRESHOLD" /> päivään</translation> <translation id="8407669440184693619">Tälle sivustolle ei löytynyt salasanoja</translation> <translation id="842017693807136194">Kirjauduttu palvelulla</translation> +<translation id="8423121072346537366">Äsken</translation> <translation id="8425693829365242963">Salasanasi ovat yksilöllisiä</translation> <translation id="8428045167754449968">Kaupunki</translation> <translation id="8428213095426709021">Asetukset</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 76a5f941..b8fba76 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Isalin ang Page?</translation> <translation id="7781069478569868053">Page ng Bagong Tab</translation> <translation id="7781829728241885113">Kahapon</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Pagkalipas ng 1 Araw}one{Pagkalipas ng {COUNT} Araw}other{Pagkalipas ng {COUNT} na Araw}}</translation> <translation id="778855399387580014">Start a search in a new Chrome tab.</translation> <translation id="7791543448312431591">Idagdag</translation> <translation id="7807060072011926525">Ibinibigay ng Google</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Gagamitin ito para gumawa ng mga event sa iyong Apple Calendar mula sa Chrome at Google Lens.</translation> <translation id="8156478151976189188">Hindi Gumagana ang Password Sync</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> (na) account</translation> +<translation id="8159358225423560600">ngayon lang</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Ang iyong mga device<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Isalin ang Page</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Mga tab na hindi ginamit sa loob ng <ph name="THRESHOLD" /> (na) araw</translation> <translation id="8407669440184693619">Walang nahanap na password para sa site na ito</translation> <translation id="842017693807136194">Naka-sign In Gamit ang</translation> +<translation id="8423121072346537366">Ngayon Lang</translation> <translation id="8425693829365242963">Natatangi ang Mga Password Mo</translation> <translation id="8428045167754449968">Lungsod / Bayan</translation> <translation id="8428213095426709021">Mga Setting</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 74f67ce..f687c7449 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Traduire la page ?</translation> <translation id="7781069478569868053">Page Nouvel onglet</translation> <translation id="7781829728241885113">Hier</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Après 1 jour}one{Après {COUNT} jour}other{Après {COUNT} jours}}</translation> <translation id="778855399387580014">Lancer une recherche dans un nouvel onglet Chrome.</translation> <translation id="7791543448312431591">Ajouter</translation> <translation id="7807060072011926525">Fourni par Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index 0fca88e..9bbbeb1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -1088,6 +1088,7 @@ <translation id="8136856065410661948">Usarase para crear eventos no teu calendario de Apple desde Chrome e Google Lens.</translation> <translation id="8156478151976189188">A sincronización de contrasinais non funciona</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> contas</translation> +<translation id="8159358225423560600">agora mesmo</translation> <translation id="8179976553408161302">Intro</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Os teus dispositivos<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Traducir páxina</translation> @@ -1118,6 +1119,7 @@ <translation id="8393889347136007944">Estas pestanas levan sen usarse <ph name="THRESHOLD" /> días</translation> <translation id="8407669440184693619">Non se atopou ningún contrasinal para este sitio</translation> <translation id="842017693807136194">Sesión iniciada con</translation> +<translation id="8423121072346537366">Agora mesmo</translation> <translation id="8425693829365242963">Non hai ningún contrasinal reutilizado</translation> <translation id="8428045167754449968">Cidade/localidade</translation> <translation id="8428213095426709021">Configuración</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 78b0f2a..ac207e5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">પેજનો અનુવાદ કરીએ?</translation> <translation id="7781069478569868053">નવું ટૅબ પેજ</translation> <translation id="7781829728241885113">ગઈ કાલે</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 દિવસ પછી}one{{COUNT} દિવસ પછી}other{{COUNT} દિવસ પછી}}</translation> <translation id="778855399387580014">નવા Chrome ટૅબમાં શોધ શરૂ કરો.</translation> <translation id="7791543448312431591">ઉમેરો</translation> <translation id="7807060072011926525">Google દ્વારા પ્રદાન કરાયેલું</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 779d03d..dfa3262 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">Chrome और Google Lens में मौजूद इवेंट को आपके Apple Calendar में जोड़ने के लिए, इसका इस्तेमाल किया जाएगा.</translation> <translation id="8156478151976189188">पासवर्ड को सिंक करने की सुविधा काम नहीं कर रही</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> खाते</translation> +<translation id="8159358225423560600">अभी-अभी</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />आपके डिवाइस<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">पेज का अनुवाद करें</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> दिनों से इस्तेमाल नहीं किए गए टैब</translation> <translation id="8407669440184693619">इस साइट के लिए कोई पासवर्ड नहीं मिला</translation> <translation id="842017693807136194">इससे प्रवेश किया गया है</translation> +<translation id="8423121072346537366">अभी-अभी</translation> <translation id="8425693829365242963">आपके पासवर्ड यूनीक हैं</translation> <translation id="8428045167754449968">शहर / कस्बा</translation> <translation id="8428213095426709021">सेटिंग</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index 49863cd..f339971 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -1089,6 +1089,7 @@ <translation id="8136856065410661948">Így tud majd Apple Naptár-eseményeket létrehozni a Chrome és a Google Lens használatával.</translation> <translation id="8156478151976189188">Nem működik a jelszavak szinkronizálása</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> fiók</translation> +<translation id="8159358225423560600">éppen most</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Saját eszközök<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Oldal lefordítása</translation> @@ -1119,6 +1120,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> napja nem használt lapok</translation> <translation id="8407669440184693619">Nem található jelszó a webhelyhez</translation> <translation id="842017693807136194">Bejelentkezve a következővel:</translation> +<translation id="8423121072346537366">Éppen most</translation> <translation id="8425693829365242963">Jelszavai egyediek</translation> <translation id="8428045167754449968">Város/helység</translation> <translation id="8428213095426709021">Beállítások</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index 545010f..7815fbe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -227,6 +227,7 @@ <translation id="2576499762020411840">Օգտագործել և պահել գաղտնաբառերը Google հաշվում</translation> <translation id="2578571896248130439">Կայքէջի ուղարկում</translation> <translation id="2584132361465095047">Ավելացնել հաշիվ</translation> +<translation id="2595587704210555261">{COUNT,plural, =1{Բացված ներդիրները, որոնք մեկ կամ ավելի օր չեն օգտագործվել, տեղափոխվում են «Ոչ ակտիվ ներդիրներ» բաժին, որպեսզի դուք կարողանաք հեշտությամբ կենտրոնանալ առավել հաճախ օգտագործվող ներդիրների վրա։ Այս պարամետրը ցանկացած ժամանակ կարող եք փոխել կարգավորումներում։}one{Բացված ներդիրները, որոնք {COUNT} կամ ավելի օր չեն օգտագործվել, տեղափոխվում են «Ոչ ակտիվ ներդիրներ» բաժին, որպեսզի դուք կարողանաք հեշտությամբ կենտրոնանալ առավել հաճախ օգտագործվող ներդիրների վրա։ Այս պարամետրը ցանկացած ժամանակ կարող եք փոխել կարգավորումներում։}other{Բացված ներդիրները, որոնք {COUNT} կամ ավելի օր չեն օգտագործվել, տեղափոխվում են «Ոչ ակտիվ ներդիրներ» բաժին, որպեսզի դուք կարողանաք հեշտությամբ կենտրոնանալ առավել հաճախ օգտագործվող ներդիրների վրա։ Այս պարամետրը ցանկացած ժամանակ կարող եք փոխել կարգավորումներում։}}</translation> <translation id="2600682495497606169">Ջնջել կայքի քուքիները</translation> <translation id="2609008503159898744">Փակե՞լ բոլոր ներդիրները</translation> <translation id="2625189173221582860">Գաղտնաբառը պատճենվեց</translation> @@ -575,6 +576,7 @@ <translation id="4844899002472726590">Դիտեք և փոփոխեք ձեզ հետաքրքրող թեմաները</translation> <translation id="4848999860252535517">Ջնջե՞լ <ph name="WEBSITE" /> հաշվի գաղտնաբառը</translation> <translation id="4854345657858711387">Սահմանեք անցակոդ</translation> +<translation id="4856498338299082007">Ձեր Google հաշվում</translation> <translation id="4858786880085262208">Հնարավորության դեպքում օգտագործել HTTPS հաղորդակարգը։ Ապահով կայքերը կարող են պարունակել ոչ անվտանգ ներկառուցված բովանդակություն։</translation> <translation id="4860895144060829044">Զանգեք</translation> <translation id="4872323082491632254">Ստուգել գաղտնաբառերը</translation> @@ -1086,6 +1088,7 @@ <translation id="8136856065410661948">Սա կօգտագործվի՝ ձեր Apple Calendar-ում Chrome-ից և Google Տեսապակուց միջոցառումներ ստեղծելու համար։</translation> <translation id="8156478151976189188">Գաղտնաբառերի համաժամացումը չի աշխատում</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> հաշիվ</translation> +<translation id="8159358225423560600">հենց նոր</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Ձեր սարքերը<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Թարգմանել էջը</translation> @@ -1094,6 +1097,7 @@ <translation id="821809831108207540">Ձեր Discover-ի ֆիդը և Chrome-ն անհատականացնելու համար մուտք գործեք և միացրեք համաժամացումը։</translation> <translation id="8225985093977202398">Քեշավորված պատկերներ և ֆայլեր</translation> <translation id="8237382152611443140">Բացեք գաղտնաբառերի ինքնալրացման կարգավորումները։</translation> +<translation id="8248969482078657578">«Ոչ ակտիվ ներդիրներ» բաժինը օգնում է կենտրոնանալ կարևորի վրա</translation> <translation id="8261506727792406068">Ջնջել</translation> <translation id="8264966119170358612">Google-ին չպատկանող սերվերներից տվյալների արտահոսքի հետևանքով ձեր որոշ պահված գաղտնաբառեր կոտրվել են։ <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation> <translation id="8265018477030547118">Միայն այս սարքում</translation> @@ -1115,6 +1119,7 @@ <translation id="8393889347136007944">Ներդիրները <ph name="THRESHOLD" /> օր չեն օգտագործվել</translation> <translation id="8407669440184693619">Այս կայքի համար գաղտնաբառեր չեն գտնվել</translation> <translation id="842017693807136194">Մուտք եք գործել որպես</translation> +<translation id="8423121072346537366">Հենց նոր</translation> <translation id="8425693829365242963">Ձեր գաղտնաբառերը չեն կրկնվում</translation> <translation id="8428045167754449968">Քաղաք</translation> <translation id="8428213095426709021">Կարգավորումներ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 118feba..79cedb10 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Terjemahkan Halaman?</translation> <translation id="7781069478569868053">Halaman Tab Baru</translation> <translation id="7781829728241885113">Kemarin</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Setelah 1 Hari}other{Setelah {COUNT} Hari}}</translation> <translation id="778855399387580014">Mulai penelusuran di tab Chrome baru.</translation> <translation id="7791543448312431591">Tambahkan</translation> <translation id="7807060072011926525">Disediakan oleh Google</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Ini akan digunakan untuk mengambil acara dari Chrome dan Google Lens lalu membuatnya di Apple Calendar.</translation> <translation id="8156478151976189188">Sinkronisasi Sandi Tidak Berfungsi</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> akun</translation> +<translation id="8159358225423560600">baru saja</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Perangkat Anda<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Terjemahkan Halaman</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Tab tidak digunakan selama <ph name="THRESHOLD" /> hari</translation> <translation id="8407669440184693619">Tidak ada sandi yang ditemukan untuk situs ini</translation> <translation id="842017693807136194">Login Dengan</translation> +<translation id="8423121072346537366">Baru Saja</translation> <translation id="8425693829365242963">Sandi Anda Unik</translation> <translation id="8428045167754449968">Kota</translation> <translation id="8428213095426709021">Setelan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 07a11020..a881e3a7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Þýða síðu?</translation> <translation id="7781069478569868053">Síða nýrra flipa</translation> <translation id="7781829728241885113">Í gær</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Eftir 1 dag}one{Eftir {COUNT} dag}other{Eftir {COUNT} daga}}</translation> <translation id="778855399387580014">Hefja leit í nýjum flipa í Chrome.</translation> <translation id="7791543448312431591">Bæta við</translation> <translation id="7807060072011926525">Frá Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index def7b9d..2e4cf617 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -1089,6 +1089,7 @@ <translation id="8136856065410661948">Verranno creati eventi nel tuo Calendario Apple da Chrome e Google Lens.</translation> <translation id="8156478151976189188">La sincronizzazione delle password non funziona</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> account</translation> +<translation id="8159358225423560600">un attimo fa</translation> <translation id="8179976553408161302">Invio</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />I tuoi dispositivi<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Traduci la pagina</translation> @@ -1119,6 +1120,7 @@ <translation id="8393889347136007944">Schede non utilizzate per <ph name="THRESHOLD" /> giorni</translation> <translation id="8407669440184693619">Non è stata trovata alcuna password per questo sito</translation> <translation id="842017693807136194">Accesso eseguito con</translation> +<translation id="8423121072346537366">Un attimo fa</translation> <translation id="8425693829365242963">Le tue password sono univoche</translation> <translation id="8428045167754449968">Città/località</translation> <translation id="8428213095426709021">Impostazioni</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 2eb658c..76cbc7c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">הנתונים מ-Chrome ומ-Google Lens ישמשו ליצירת אירועים ב-Apple Calendar.</translation> <translation id="8156478151976189188">סנכרון הסיסמאות לא פועל</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> חשבונות</translation> +<translation id="8159358225423560600">ממש עכשיו</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />המכשירים שלך<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">תרגום הדף</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944">כרטיסיות שלא היו בשימוש במשך <ph name="THRESHOLD" /> ימים</translation> <translation id="8407669440184693619">לא נמצאו סיסמאות בשביל האתר הזה</translation> <translation id="842017693807136194">מחובר באמצעות</translation> +<translation id="8423121072346537366">ממש עכשיו</translation> <translation id="8425693829365242963">הסיסמאות שלך ייחודיות</translation> <translation id="8428045167754449968">עיר / יישוב</translation> <translation id="8428213095426709021">הגדרות</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 558e4c1..88a0c38 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">Chrome や Google レンズから Apple カレンダーの予定を作成するために使用されます。</translation> <translation id="8156478151976189188">パスワード同期が機能していません</translation> <translation id="8157532349231307196">アカウント数: <ph name="NUMBER_OF_ACCOUNTS" /></translation> +<translation id="8159358225423560600">たった今</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />あなたのデバイス<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">ページを翻訳する</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> 日間使用されていません</translation> <translation id="8407669440184693619">このサイト用のパスワードが見つかりません</translation> <translation id="842017693807136194">ログインに使用した ID プロバイダ</translation> +<translation id="8423121072346537366">たった今</translation> <translation id="8425693829365242963">使い回されているパスワードはありません</translation> <translation id="8428045167754449968">市区町村</translation> <translation id="8428213095426709021">設定</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 5ad02cc..a22eac9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">გსურთ გვერდის თარგმნა?</translation> <translation id="7781069478569868053">ახალი ჩანართის გვერდი</translation> <translation id="7781829728241885113">გუშინ</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 დღის შემდეგ}other{{COUNT} დღის შემდეგ}}</translation> <translation id="778855399387580014">ძიების დაწყება Chrome-ის ახალ ჩანართში.</translation> <translation id="7791543448312431591">დამატება</translation> <translation id="7807060072011926525">უზრუნველყოფს Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 7ba65ba..1b34cc1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Кішірейту</translation> <translation id="2230173723195178503">Веббет жүктелді</translation> <translation id="2239626343334228536">Браузерді пайдалану деректері тазалануда...</translation> +<translation id="2242467532204595597">Хабарларда, құжаттарда және басқа қолданбаларда сілтемелерді түртіп, Chrome браузерін кез келген уақытта пайдаланыңыз.</translation> <translation id="22508856139286506">Жабылған ескертулер (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Мәзір → Тарих</translation> <translation id="2256933947031277845">Ұйымыңыз сізге белгілі бір аккаунттармен ғана кіруге рұқсат етеді.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{Пернетақтаның үстінде {count} сақталған мекенжай қолжетімді.}other{Пернетақтаның үстінде {count} сақталған мекенжай қолжетімді.}}</translation> <translation id="2421004566762153674">Үшінші тараптың cookie файлдарын бөгеу</translation> <translation id="2421044535038393232">Өзгерте беру</translation> +<translation id="2423077901494354337">Енді құрылғыңызда Chrome мүмкіндіктерін барынша пайдалана аласыз.</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> веб-сайтында <ph name="USERNAME" /> құпия сөзін сақтап қойғансыз.</translation> <translation id="2435457462613246316">Құпия сөзді көрсету</translation> <translation id="2451654228769116489">Қойындыны бекіту</translation> @@ -611,6 +613,7 @@ <translation id="5118764316110575523">Өшірулі</translation> <translation id="5119391094379141756">Chrome браузерін таңдаңыз.</translation> <translation id="5121618895923301719">Бұл өнімді бұрыннан бақылап жатырсыз. Бұл бет <ph name="BEGIN_LINK" />Мобильді құрылғының бетбелгілері<ph name="END_LINK" /> ішінде сақталады</translation> +<translation id="5126465625664020024">Аккаунтқа кіру және синхрондау</translation> <translation id="5132942445612118989">Құпия сөздеріңізді, әрекеттеріңіздің тарихын және басқа деректерді барлық құрылғыда синхрондау</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} оңай құпия сөз}other{{COUNT} оңай құпия сөз}}</translation> <translation id="5149188072385105201">Құпия сөз қосу…</translation> @@ -801,6 +804,7 @@ <translation id="6346549652287021269">Жаңа жүктеп алу процесі басталсын ба?</translation> <translation id="6347953390226388422">{count,plural, =1{Бұл мекенжай Google аккаунтынан (<ph name="USER_EMAIL" />) және осы құрылғыдан жойылады.}other{Бұл мекенжайлар Google аккаунтынан (<ph name="USER_EMAIL" />) және осы құрылғыдан жойылады.}}</translation> <translation id="634878792104344809">Барлық құрылғыларда құпия сөздерді, тарихты және т.б. синхрондау</translation> +<translation id="6348855835728304880">Осы құрылғыдағы басқа қолданбаларда Chrome құпия сөздеріңізді және т.б. пайдаланыңыз.</translation> <translation id="6355820205320395730">Құпия сөзіңіз оңай болса, оны табу оңай болады. Күрделі құпия сөз орнатыңыз. <ph name="BEGIN_LINK" />Қауіпсіздікке қатысты басқа кеңестерді де көріңіз.<ph name="END_LINK" /></translation> <translation id="6361848730467328243"><ph name="DOMAIN_NAME" /> доменіне жазылу</translation> <translation id="6362362396625799311">Инкогнито қойындылары жоқ</translation> @@ -953,6 +957,7 @@ <translation id="7221173315674413369">"Жаңалықтар" бөліміндегі жаңа мүмкіндіктермен және кеңестермен танысыңыз</translation> <translation id="7223102419539744003">Қойындыны жабу</translation> <translation id="722454870747268814">Жаңа инкогнито қойындысы</translation> +<translation id="723787869754590019">Автотолтыру үшін Chrome браузерін пайдалану</translation> <translation id="7265758999917665941">Бұл сайт үшін ешқашан</translation> <translation id="7272437679830969316">Жеке басыңыз расталмады. Құпия сөз көшірілмеді.</translation> <translation id="7291368939935408496">Құпия сөздер дайындалуда...</translation> @@ -1154,12 +1159,14 @@ <translation id="8663764600409216912">Сенімді құпия сөздерді пайдаланып жатырсыз</translation> <translation id="8668210798914567634">Бұл бет оқу тізіміне сақталды.</translation> <translation id="8680787084697685621">Аккаунттың кіру мәліметтері ескірген.</translation> +<translation id="868773710103052534">Барлығы дайын</translation> <translation id="8693663554456874301">{count,plural, =1{Қойындыны жабу}other{Қойындыларды жабу}}</translation> <translation id="8703536910991780768">Құпия сөздеріңіз сенімді</translation> <translation id="8706588385081740091">Құпия сөздер</translation> <translation id="8717864919010420084">Сілтемені көшіру</translation> <translation id="8721297211384281569">Құралдар мәзірі</translation> <translation id="8725066075913043281">Әрекетті қайталау</translation> +<translation id="8727043961453758442">Chrome мүмкіндіктерін барынша пайдалану</translation> <translation id="8730621377337864115">Дайын</translation> <translation id="8731388423028622182">iPhone бастапқы күйіне қайтарылған кезде, аккаунтыңыздан (<ph name="USER_NAME" />) шығарылдыңыз. Аккаунтқа кіру үшін төмендегі "Жалғастыру" түймесін түртіңіз.</translation> <translation id="87371078663613140">Мәзір жолағындағы опциялармен танысыңыз.</translation> @@ -1209,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Ұрланған құпия сөздер жоқ}=1{{count} ұрланған құпия сөз}other{{count} ұрланған құпия сөз}}</translation> <translation id="8981454092730389528">Google-дағы әрекеттерді басқару элементтері</translation> <translation id="8985320356172329008">Google жүйесіне кірген аккаунт:</translation> +<translation id="8986567980592931173">Құпия сөздерді, тарихты және т.б. синхрондау үшін Google аккаунтымен кіріңіз.</translation> <translation id="8998289560386111590">Құрылғыңызда қолжетімсіз.</translation> <translation id="9000089900434778519">Іздеу жүйесі — <ph name="DSE_NAME" />. Қажет болса, ондағы іздеу тарихын жою туралы нұсқауларды қараңыз.</translation> <translation id="9008201768610948239">Елемеу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index e006148c..f0ada76a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">បង្រួម</translation> <translation id="2230173723195178503">បានផ្ទុកគេហទំព័រ</translation> <translation id="2239626343334228536">កំពុងសម្អាតទិន្នន័យរុករក...</translation> +<translation id="2242467532204595597">ប្រើប្រាស់ Chrome រាល់ពេលដែលអ្នកចុចតំណនៅក្នុងសារ ឯកសារ និងកម្មវិធីផ្សេងទៀត។</translation> <translation id="22508856139286506">បានច្រានចោលសារប្រុងប្រយ័ត្ន (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">ម៉ឺនុយ → ប្រវត្តិ</translation> <translation id="2256933947031277845">ស្ថាប័នរបស់អ្នកអនុញ្ញាតឱ្យអ្នកចូលដោយប្រើគណនីជាក់លាក់តែប៉ុណ្ណោះ។</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{មានអាសយដ្ឋានដែលបានរក្សាទុក {count} នៅលើក្ដារចុចរបស់អ្នក។}other{មានអាសយដ្ឋានដែលបានរក្សាទុក {count} នៅលើក្ដារចុចរបស់អ្នក។}}</translation> <translation id="2421004566762153674">ទប់ស្កាត់ខូគីភាគីទីបី</translation> <translation id="2421044535038393232">បន្តកែ</translation> +<translation id="2423077901494354337">ឥឡូវនេះ អ្នកនឹងទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពី Chrome នៅលើឧបករណ៍របស់អ្នក។</translation> <translation id="2434405374328098816">អ្នកបានរក្សាទុកពាក្យសម្ងាត់សម្រាប់ "<ph name="USERNAME" />" នៅ <ph name="WEBSITE" /> រួចហើយ</translation> <translation id="2435457462613246316">បង្ហាញពាក្យសម្ងាត់</translation> <translation id="2451654228769116489">ខ្ទាស់ផ្ទាំង</translation> @@ -611,6 +613,7 @@ <translation id="5118764316110575523">បិទ</translation> <translation id="5119391094379141756">ជ្រើសរើស Chrome</translation> <translation id="5121618895923301719">អ្នកកំពុងតាមដានផលិតផលនេះស្រាប់ហើយ។ ទំព័រនេះត្រូវបានរក្សាទុកនៅក្នុង<ph name="BEGIN_LINK" />ចំណាំរបស់ឧបករណ៍ចល័ត<ph name="END_LINK" />។</translation> +<translation id="5126465625664020024">ចូលគណនី រួចធ្វើសមកាលកម្ម</translation> <translation id="5132942445612118989">ធ្វើសមកាលកម្មពាក្យសម្ងាត់ ប្រវត្តិ និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នក</translation> <translation id="5142890110117755815">{COUNT,plural, =1{ពាក្យសម្ងាត់ខ្សោយ {COUNT}}other{ពាក្យសម្ងាត់ខ្សោយ {COUNT}}}</translation> <translation id="5149188072385105201">បញ្ចូលពាក្យសម្ងាត់...</translation> @@ -801,6 +804,7 @@ <translation id="6346549652287021269">ចាប់ផ្ដើមការទាញយកថ្មី?</translation> <translation id="6347953390226388422">{count,plural, =1{អាសយដ្ឋាននេះនឹងត្រូវបានលុបពីគណនី Google (<ph name="USER_EMAIL" />) របស់អ្នក និងពីឧបករណ៍នេះ។}other{អាសយដ្ឋានទាំងនេះនឹងត្រូវបានលុបពីគណនី Google (<ph name="USER_EMAIL" />) របស់អ្នក និងពីឧបករណ៍នេះ។}}</translation> <translation id="634878792104344809">ធ្វើសមកាលកម្មពាក្យសម្ងាត់ ប្រវត្តិរបស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅលើឧបករណ៍ទាំងអស់របស់អ្នក</translation> +<translation id="6348855835728304880">ចូលប្រើប្រាស់ពាក្យសម្ងាត់ Chrome របស់អ្នក និងអ្វីៗជាច្រើនទៀតនៅលើកម្មវិធីផ្សេងទៀតនៅក្នុងឧបករណ៍នេះ។</translation> <translation id="6355820205320395730">ពាក្យសម្ងាត់ខ្សោយមានភាពងាយស្រួលក្នុងការទាយដឹង។ សូមប្រាកដថាអ្នកកំពុងបង្កើតពាក្យសម្ងាត់ខ្លាំង។ <ph name="BEGIN_LINK" />មើលគន្លឹះសុវត្ថិភាពច្រើនទៀត។<ph name="END_LINK" /></translation> <translation id="6361848730467328243">តាមដាន <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">គ្មានផ្ទាំងអនាមិកទេ</translation> @@ -953,6 +957,7 @@ <translation id="7221173315674413369">រុករកមុខងារ និងគន្លឹះថ្មីៗនៅក្នុង "អ្វីដែលថ្មី"</translation> <translation id="7223102419539744003">បិទផ្ទាំង</translation> <translation id="722454870747268814">ផ្ទាំងអនាមិកថ្មី</translation> +<translation id="723787869754590019">ប្រើប្រាស់ Chrome សម្រាប់ការបំពេញស្វ័យប្រវត្តិ</translation> <translation id="7265758999917665941">មិនចងចាំសម្រាប់គេហទំព័រនេះទេ</translation> <translation id="7272437679830969316">មិនអាចផ្ទៀងផ្ទាត់អត្តសញ្ញាណរបស់អ្នកបានទេ។ ពាក្យសម្ងាត់មិនបានចម្លង។</translation> <translation id="7291368939935408496">កំពុងរៀបចំពាក្យសម្ងាត់...</translation> @@ -1154,12 +1159,14 @@ <translation id="8663764600409216912">អ្នកកំពុងប្រើពាក្យសម្ងាត់ដែលមើលទៅពិបាកនឹងទាយដឹង</translation> <translation id="8668210798914567634">ទំព័រនេះត្រូវបានរក្សាទុកទៅបញ្ជីអានរបស់អ្នក។</translation> <translation id="8680787084697685621">ព័ត៌មានលំអិតក្នុងគណនីចូលហួសសម័យ។</translation> +<translation id="868773710103052534">រួចរាល់អស់ហើយ</translation> <translation id="8693663554456874301">{count,plural, =1{បិទផ្ទាំង}other{បិទផ្ទាំង}}</translation> <translation id="8703536910991780768">ពាក្យសម្ងាត់របស់អ្នកមើលទៅខ្លាំងហើយ</translation> <translation id="8706588385081740091">ពាក្យសម្ងាត់</translation> <translation id="8717864919010420084">ចម្លងតំណ</translation> <translation id="8721297211384281569">ម៉ឺនុយឧបករណ៍</translation> <translation id="8725066075913043281">ព្យាយាមម្តងទៀត</translation> +<translation id="8727043961453758442">ទទួលបានអត្ថប្រយោជន៍ច្រើនបំផុតពី Chrome</translation> <translation id="8730621377337864115">រួចរាល់</translation> <translation id="8731388423028622182">អ្នកបានចេញពីគណនីរបស់អ្នក <ph name="USER_NAME" /> ដែលជាផ្នែកមួយនៃការកំណត់ iPhone របស់អ្នកឡើងវិញ។ ចុច "បន្ត" ខាងក្រោម ដើម្បីចូល។</translation> <translation id="87371078663613140">រុករកជម្រើសនៅក្នុងរបារម៉ឺនុយ</translation> @@ -1209,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{គ្មានពាក្យសម្ងាត់ដែលរងការលុកលុយ}=1{ពាក្យសម្ងាត់ដែលរងការលុកលុយ {count}}other{ពាក្យសម្ងាត់ដែលរងការលុកលុយ {count}}}</translation> <translation id="8981454092730389528">ការគ្រប់គ្រងសកម្មភាព Google</translation> <translation id="8985320356172329008">បានចូល Google ជា</translation> +<translation id="8986567980592931173">ចូលដោយប្រើគណនី Google របស់អ្នក ដើម្បីធ្វើសមកាលកម្មពាក្យសម្ងាត់ ប្រវត្តិរបស់អ្នក និងអ្វីៗជាច្រើនទៀត។</translation> <translation id="8998289560386111590">មិនអាចប្រើនៅលើឧបករណ៍របស់អ្នកបានទេ</translation> <translation id="9000089900434778519">ម៉ាស៊ីនស្វែងរករបស់អ្នកគឺ <ph name="DSE_NAME" />។ មើលការណែនាំរបស់ម៉ាស៊ីនស្វែងរក ដើម្បីដឹងអំពីរបៀបលុបប្រវត្តិស្វែងរករបស់អ្នក ប្រសិនបើអាច។</translation> <translation id="9008201768610948239">មិនអើពើ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 228e4091..131681ff 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">ಪುಟವನ್ನು ಅನುವಾದಿಸಬೇಕೇ?</translation> <translation id="7781069478569868053">ಹೊಸ ಟ್ಯಾಬ್ ಪುಟ</translation> <translation id="7781829728241885113">ನಿನ್ನೆ</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 ದಿನದ ನಂತರ}one{{COUNT} ದಿನಗಳ ನಂತರ}other{{COUNT} ದಿನಗಳ ನಂತರ}}</translation> <translation id="778855399387580014">ಹೊಸ Chrome ಟ್ಯಾಬ್ನಲ್ಲಿ ಹುಡುಕಾಟವನ್ನು ಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="7791543448312431591">ಸೇರಿಸು</translation> <translation id="7807060072011926525">Google ಮೂಲಕ ಒದಗಿಸಲಾಗಿದೆ</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Chrome ಮತ್ತು Google Lens ಸಹಾಯದಿಂದ ನಿಮ್ಮ Apple Calendar ನಲ್ಲಿ ಈವೆಂಟ್ಗಳನ್ನು ರಚಿಸಲು ಇದನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation> <translation id="8156478151976189188">ಪಾಸ್ವರ್ಡ್ ಸಿಂಕ್ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತಿಲ್ಲ</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> ಖಾತೆಗಳು</translation> +<translation id="8159358225423560600">ಇದೀಗ</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />ನಿಮ್ಮ ಸಾಧನಗಳು<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">ಪುಟವನ್ನು ಅನುವಾದಿಸಿ</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">ಟ್ಯಾಬ್ಗಳನ್ನು <ph name="THRESHOLD" /> ದಿನಗಳವರೆಗೆ ಬಳಸಲಾಗಿಲ್ಲ</translation> <translation id="8407669440184693619">ಈ ಸೈಟ್ಗಾಗಿ ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ ಕಂಡುಬಂದಿಲ್ಲ</translation> <translation id="842017693807136194">ಇದರಿಂದ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ</translation> +<translation id="8423121072346537366">ಇದೀಗ</translation> <translation id="8425693829365242963">ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳು ಅನನ್ಯವಾಗಿವೆ</translation> <translation id="8428045167754449968">ನಗರ / ಪಟ್ಟಣ</translation> <translation id="8428213095426709021">ಸೆಟ್ಟಿಂಗ್ಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 4fda2c8..736ac2272 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">페이지를 번역하시겠습니까?</translation> <translation id="7781069478569868053">새 탭 페이지</translation> <translation id="7781829728241885113">어제</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1일 후}other{{COUNT}일 후}}</translation> <translation id="778855399387580014">새 Chrome 탭에서 검색을 시작합니다.</translation> <translation id="7791543448312431591">추가</translation> <translation id="7807060072011926525">Google 제공</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Chrome 및 Google 렌즈에서 Apple 캘린더 일정을 만들 때 사용됩니다.</translation> <translation id="8156478151976189188">비밀번호 동기화가 작동하지 않음</translation> <translation id="8157532349231307196">계정 <ph name="NUMBER_OF_ACCOUNTS" />개</translation> +<translation id="8159358225423560600">방금</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />내 기기<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">페이지 번역</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">탭을 <ph name="THRESHOLD" />일 동안 사용하지 않음</translation> <translation id="8407669440184693619">이 사이트의 비밀번호를 찾을 수 없음</translation> <translation id="842017693807136194">다음을 사용하여 로그인함</translation> +<translation id="8423121072346537366">방금</translation> <translation id="8425693829365242963">고유한 비밀번호</translation> <translation id="8428045167754449968">시/군/구</translation> <translation id="8428213095426709021">설정</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index d4cab35..662d5a7c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -1088,6 +1088,7 @@ <translation id="8136856065410661948">Бул Chrome жана Google Lens кызматындагы Apple Жылнаамасында иш-чараларды түзүү үчүн колдонулат.</translation> <translation id="8156478151976189188">Сырсөздү шайкештирүү иштеген жок</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> каттоо эсеби</translation> +<translation id="8159358225423560600">жаңы эле</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Түзмөктөрүңүз<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Баракты которуу</translation> @@ -1118,6 +1119,7 @@ <translation id="8393889347136007944">Өтмөктөр <ph name="THRESHOLD" /> күн колдонулган жок</translation> <translation id="8407669440184693619">Бул сайт үчүн бир да сырсөз табылган жок</translation> <translation id="842017693807136194">Төмөнкү дайындар менен кирүү:</translation> +<translation id="8423121072346537366">Жаңы эле</translation> <translation id="8425693829365242963">Сырсөздөрүңүз уникалдуу</translation> <translation id="8428045167754449968">Шаар/Шаарча</translation> <translation id="8428213095426709021">Параметрлер</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 2fe1b1d..e4c478b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -1029,6 +1029,7 @@ <translation id="7781011649027948662">ແປໜ້າບໍ?</translation> <translation id="7781069478569868053">ໜ້າແຖບໃໝ່</translation> <translation id="7781829728241885113">ມື້ວານນີ້</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{ຫຼັງຈາກ 1 ມື້}other{ຫຼັງຈາກ {COUNT} ມື້}}</translation> <translation id="778855399387580014">ເລີ່ມການຊອກຫາໃນແຖບ Chrome ໃໝ່.</translation> <translation id="7791543448312431591">ເພີ່ມ</translation> <translation id="7807060072011926525">ສະໜອງໃຫ້ໂດຍ Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index f49ed53c..f680b97 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Versti puslapį?</translation> <translation id="7781069478569868053">Naujo skirtuko puslapis</translation> <translation id="7781829728241885113">Vakar</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Po vienos dienos}one{Po {COUNT} dienos}few{Po {COUNT} dienų}many{Po {COUNT} dienos}other{Po {COUNT} dienų}}</translation> <translation id="778855399387580014">Pradėti paiešką naujame „Chrome“ skirtuke.</translation> <translation id="7791543448312431591">Pridėti</translation> <translation id="7807060072011926525">Pateikė „Google“</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Šie duomenys bus naudojami įvykiams programoje „Apple Calendar“ kurti naudojant „Chrome“ ir „Google Lens“.</translation> <translation id="8156478151976189188">Slaptažodžio sinchronizavimas neveikia</translation> <translation id="8157532349231307196">Paskyrų: <ph name="NUMBER_OF_ACCOUNTS" /></translation> +<translation id="8159358225423560600">ką tik</translation> <translation id="8179976553408161302">Įvesti</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Jūsų įrenginiai<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Versti puslapį</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Skirtukai nenaudojami <ph name="THRESHOLD" /> d.</translation> <translation id="8407669440184693619">Nerasta šios svetainės slaptažodžių</translation> <translation id="842017693807136194">Prisijungta naudojant</translation> +<translation id="8423121072346537366">Ką tik</translation> <translation id="8425693829365242963">Slaptažodžiai unikalūs</translation> <translation id="8428045167754449968">Didm. / miest.</translation> <translation id="8428213095426709021">Nustatymai</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 6891ebd..0f7ba0f6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">സൂം ഔട്ട് ചെയ്യുക</translation> <translation id="2230173723195178503">വെബ്പേജ് ലോഡ് ചെയ്തു</translation> <translation id="2239626343334228536">ബ്രൗസിംഗ് ഡാറ്റ മായ്ക്കുന്നു...</translation> +<translation id="2242467532204595597">സന്ദേശങ്ങൾ, ഡോക്യുമെന്റുകൾ, മറ്റ് ആപ്പുകൾ എന്നിവയിലെ ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യുമ്പോഴെല്ലാം Chrome ഉപയോഗിക്കുക.</translation> <translation id="22508856139286506">ഡിസ്മിസ് ചെയ്ത മുന്നറിയിപ്പുകൾ (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">മെനു → ചരിത്രം</translation> <translation id="2256933947031277845">ചില അക്കൗണ്ടുകൾ ഉപയോഗിച്ച് മാത്രമേ സൈൻ ഇൻ ചെയ്യാൻ നിങ്ങളുടെ സ്ഥാപനം അനുവദിക്കൂ.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{നിങ്ങളുടെ കീബോർഡിന് മുകളിൽ {count} സംരക്ഷിച്ച വിലാസം ലഭ്യമാണ്.}other{നിങ്ങളുടെ കീബോർഡിന് മുകളിൽ {count} സംരക്ഷിച്ച വിലാസങ്ങൾ ലഭ്യമാണ്.}}</translation> <translation id="2421004566762153674">മൂന്നാം കക്ഷി കുക്കികളെ ബ്ലോക്ക് ചെയ്യുന്നു</translation> <translation id="2421044535038393232">എഡിറ്റ് ചെയ്യുന്നത് തുടരുക</translation> +<translation id="2423077901494354337">നിങ്ങളുടെ ഉപകരണത്തിൽ Chrome പരമാവധി പ്രയോജനപ്പെടുത്തുക.</translation> <translation id="2434405374328098816">നിങ്ങൾ "<ph name="USERNAME" />" എന്നതിനുള്ള പാസ്വേഡ് <ph name="WEBSITE" /> എന്ന വെബ്സൈറ്റിൽ മുമ്പേ സംരക്ഷിച്ചു</translation> <translation id="2435457462613246316">പാസ്വേഡ് കാണിക്കുക</translation> <translation id="2451654228769116489">ടാബ് പിൻ ചെയ്യുക</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">പുതിയ ഡൗൺലോഡ് ആരംഭിക്കണോ?</translation> <translation id="6347953390226388422">{count,plural, =1{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ (<ph name="USER_EMAIL" />) നിന്നും ഈ ഉപകരണത്തിൽ നിന്നും ഈ വിലാസം ഇല്ലാതാക്കും.}other{നിങ്ങളുടെ Google അക്കൗണ്ടിൽ (<ph name="USER_EMAIL" />) നിന്നും ഈ ഉപകരണത്തിൽ നിന്നും ഈ വിലാസങ്ങൾ ഇല്ലാതാക്കും.}}</translation> <translation id="634878792104344809">നിങ്ങളുടെ പാസ്വേഡുകളും ചരിത്രവും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും സമന്വയിപ്പിക്കുക</translation> +<translation id="6348855835728304880">ഈ ഉപകരണത്തിലെ മറ്റ് ആപ്പുകളിലുടനീളം നിങ്ങളുടെ Chrome പാസ്വേഡുകളും മറ്റും ആക്സസ് ചെയ്യുക.</translation> <translation id="6355820205320395730">ദുർബലമായ പാസ്വേഡുകൾ ഊഹിക്കാൻ എളുപ്പമാണ്. നിങ്ങൾ സൃഷ്ടിക്കുന്നത് ശക്തമായ പാസ്വേഡുകളാണെന്ന് ഉറപ്പാക്കുക. <ph name="BEGIN_LINK" />കൂടുതൽ സുരക്ഷാ നുറുങ്ങുകൾ കാണുക.<ph name="END_LINK" /></translation> <translation id="6361848730467328243"><ph name="DOMAIN_NAME" /> പിന്തുടരുക</translation> <translation id="6362362396625799311">ആൾമാറാട്ട ടാബുകളൊന്നുമില്ല</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">പുതിയത് എന്തൊക്കെ എന്നതിൽ പുതിയ ഫീച്ചറുകളും നുറുങ്ങുകളും അടുത്തറിയുക</translation> <translation id="7223102419539744003">ടാബ് അടയ്ക്കുക</translation> <translation id="722454870747268814">പുതിയ ആൾമാറാട്ട ടാബ്</translation> +<translation id="723787869754590019">സ്വയമേവ പൂരിപ്പിക്കുന്നതിന് Chrome ഉപയോഗിക്കുക</translation> <translation id="7265758999917665941">ഈ സൈറ്റിൻ്റെ പാസ്വേഡ് ഓർക്കേണ്ടതില്ല</translation> <translation id="7272437679830969316">നിങ്ങളുടെ ഐഡന്റിറ്റി പരിശോധിച്ചുറപ്പിക്കാനാകില്ല. പാസ്വേഡ് പകർത്തിയില്ല.</translation> <translation id="7291368939935408496">പാസ്വേഡുകൾ തയ്യാറാക്കുന്നു...</translation> @@ -1155,12 +1159,14 @@ <translation id="8663764600409216912">ഊഹിക്കാൻ പ്രയാസമുണ്ടെന്ന് തോന്നുന്ന പാസ്വേഡുകളാണ് നിങ്ങൾ ഉപയോഗിക്കുന്നത്</translation> <translation id="8668210798914567634">ഈ പേജ് നിങ്ങളുടെ വായന ലിസ്റ്റിൽ സംരക്ഷിച്ചു</translation> <translation id="8680787084697685621">അക്കൗണ്ട് പ്രവേശന വിവരങ്ങള് കാലഹരണപ്പെട്ടതാണ്.</translation> +<translation id="868773710103052534">നിങ്ങൾ തയ്യാറാണ്</translation> <translation id="8693663554456874301">{count,plural, =1{ടാബ് അടയ്ക്കുക}other{ടാബുകള് അടയ്ക്കുക}}</translation> <translation id="8703536910991780768">നിങ്ങളുടെ പാസ്വേഡുകൾ ശക്തമാണെന്ന് തോന്നുന്നു</translation> <translation id="8706588385081740091">പാസ്വേഡുകൾ</translation> <translation id="8717864919010420084">ലിങ്ക് പകർത്തുക</translation> <translation id="8721297211384281569">ഉപകരണ മെനു</translation> <translation id="8725066075913043281">വീണ്ടും ശ്രമിക്കുക</translation> +<translation id="8727043961453758442">Chrome പരമാവധി പ്രയോജനപ്പെടുത്തുക</translation> <translation id="8730621377337864115">പൂർത്തിയാക്കി</translation> <translation id="8731388423028622182">iPhone റീസെറ്റ് ചെയ്യുന്നതിന്റെ ഭാഗമായി <ph name="USER_NAME" /> എന്ന അക്കൗണ്ടിൽ നിന്ന് നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്തു. സൈൻ ഇൻ ചെയ്യാൻ ചുവടെയുള്ള 'തുടരുക' ടാപ്പ് ചെയ്യുക.</translation> <translation id="87371078663613140">മെനു ബാറിലെ ഓപ്ഷനുകൾ അടുത്തറിയുക</translation> @@ -1210,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{അപഹരിക്കപ്പെട്ട പാസ്വേഡുകൾ ഒന്നുമില്ല}=1{അപഹരിക്കപ്പെട്ട {count} പാസ്വേഡ്}other{അപഹരിക്കപ്പെട്ട {count} പാസ്വേഡുകൾ}}</translation> <translation id="8981454092730389528">Google പ്രവർത്തന നിയന്ത്രണങ്ങൾ</translation> <translation id="8985320356172329008">ഇനിപ്പറയുന്ന പേരിൽ Google-ലേക്ക് സൈൻ ഇൻ ചെയ്തിരിക്കുന്നു</translation> +<translation id="8986567980592931173">നിങ്ങളുടെ പാസ്വേഡുകളും ചരിത്രവും മറ്റും സമന്വയിപ്പിക്കാൻ നിങ്ങളുടെ Google Account ഉപയോഗിച്ച് സൈൻ ഇൻ ചെയ്യുക.</translation> <translation id="8998289560386111590">നിങ്ങളുടെ ഉപകരണത്തിൽ ലഭ്യമല്ല</translation> <translation id="9000089900434778519"><ph name="DSE_NAME" /> ആണ് നിങ്ങളുടെ തിരയൽ യന്ത്രം. ബാധകമെങ്കിൽ, നിങ്ങളുടെ തിരയൽ ചരിത്രം ഇല്ലാതാക്കാനുള്ള അതിലെ നിർദ്ദേശങ്ങൾ കാണുക.</translation> <translation id="9008201768610948239">അവഗണിക്കുക</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index 5c4af2b..3c0065f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -1023,6 +1023,7 @@ <translation id="7781011649027948662">Хуудсыг орчуулах уу?</translation> <translation id="7781069478569868053">Цонх нээх хуудас</translation> <translation id="7781829728241885113">Өчигдөр</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 хоногийн дараа}other{{COUNT} хоногийн дараа}}</translation> <translation id="778855399387580014">Хайлтыг Chrome-н шинэ табад эхлүүлнэ үү.</translation> <translation id="7791543448312431591">Нэмэх</translation> <translation id="7807060072011926525">Google-с олгосон</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index ca121b69..3ac14f23 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -1026,6 +1026,7 @@ <translation id="7781011649027948662">पेजचे भाषांतर करायचे?</translation> <translation id="7781069478569868053">नवीन टॅब पृष्ठ</translation> <translation id="7781829728241885113">काल</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{एका दिवसानंतर}other{{COUNT} दिवसांनंतर}}</translation> <translation id="778855399387580014">एका नवीन Chrome टॅबमध्ये शोध सुरू करा.</translation> <translation id="7791543448312431591">जोडा</translation> <translation id="7807060072011926525">Google द्वारे पुरवलेली</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 001c2d3a..fbf9b0d4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Terjemahkan Halaman?</translation> <translation id="7781069478569868053">Halaman Tab Baharu</translation> <translation id="7781829728241885113">Semalam</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Selepas 1 Hari}other{Selepas {COUNT} Hari}}</translation> <translation id="778855399387580014">Mulakan carian dalam tab Chrome baharu.</translation> <translation id="7791543448312431591">Tambah</translation> <translation id="7807060072011926525">Disediakan oleh Google</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Ini akan digunakan untuk membuat acara dalam Apple Calendar anda daripada Chrome dan Google Lens.</translation> <translation id="8156478151976189188">Penyegerakan Kata Laluan Tidak Berfungsi</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> akaun</translation> +<translation id="8159358225423560600">sebentar tadi</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Peranti anda<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Terjemah Halaman</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Tab tidak digunakan selama <ph name="THRESHOLD" /> hari</translation> <translation id="8407669440184693619">Tiada kata laluan ditemui untuk tapak ini</translation> <translation id="842017693807136194">Dilog Masuk dengan</translation> +<translation id="8423121072346537366">Sebentar Tadi</translation> <translation id="8425693829365242963">Kata Laluan Anda adalah Unik</translation> <translation id="8428045167754449968">Bandar / Pekan</translation> <translation id="8428213095426709021">Tetapan</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index ff51765b..576700d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">ဇူးမ်ဖြုတ်ရန်</translation> <translation id="2230173723195178503">ဝဘ်စာမျက်နှာကို ဖွင့်ပြီးပါပြီ</translation> <translation id="2239626343334228536">ဖွင့်ကြည့်ထားသည့်မှတ်တမ်းဒေတာများ ဖယ်ရှားနေသည်…</translation> +<translation id="2242467532204595597">မက်ဆေ့ဂျ်၊ မှတ်တမ်းနှင့် အခြားအက်ပ်တို့ရှိ လင့်ခ်များကို နှိပ်သည့်အခါတိုင်း Chrome ကို အသုံးပြုနိုင်သည်။</translation> <translation id="22508856139286506">ပယ်ထားသော သတိပေးချက် (<ph name="COUNT" />) ခု</translation> <translation id="2251686759395008410">မီနူး → မှတ်တမ်း</translation> <translation id="2256933947031277845">အကောင့်အချို့ဖြင့်သာ လက်မှတ်ထိုးဝင်ရန် သင့်အဖွဲ့အစည်းက ခွင့်ပြုထားသည်။</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{သိမ်းထားသော လိပ်စာ {count} ခု သင့်ကီးဘုတ်ပေါ်တွင် ရနိုင်သည်။}other{သိမ်းထားသော လိပ်စာ {count} ခု သင့်ကီးဘုတ်ပေါ်တွင် ရနိုင်သည်။}}</translation> <translation id="2421004566762153674">ပြင်ပအဖွဲ့အစည်း၏ ကွတ်ကီးများကို ပိတ်ထားသည်</translation> <translation id="2421044535038393232">ဆက်လက်တည်းဖြတ်ရန်</translation> +<translation id="2423077901494354337">သင့်စက်ရှိ Chrome ကို အကောင်းဆုံးအသုံးချနိုင်ပါမည်။</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> တွင် “<ph name="USERNAME" />” အတွက် စကားဝှက်ကို သိမ်းပြီးဖြစ်သည်</translation> <translation id="2435457462613246316">စကားဝှက်ကို ပြပါ</translation> <translation id="2451654228769116489">တဘ် ပင်ထိုးရန်</translation> @@ -611,6 +613,7 @@ <translation id="5118764316110575523">ပိတ်ထားသည်</translation> <translation id="5119391094379141756">Chrome ကိုရွေးပါ</translation> <translation id="5121618895923301719">ဤထုတ်ကုန်ကို စောင့်ကြည့်ထားပြီးပြီ။ ဤစာမျက်နှာကို <ph name="BEGIN_LINK" />မိုဘိုင်းလိပ်စာများ<ph name="END_LINK" /> တွင် သိမ်းထားသည်။</translation> +<translation id="5126465625664020024">လက်မှတ်ထိုးဝင်ပြီး စင့်ခ်လုပ်ခြင်း</translation> <translation id="5132942445612118989">စက်ပစ္စည်းအားလုံးတွင် သင်၏ စကားဝှက်၊ မှတ်တမ်းနှင့် အခြားအရာများ စင့်ခ်လုပ်ပါ</translation> <translation id="5142890110117755815">{COUNT,plural, =1{အားနည်းသည့် စကားဝှက် {COUNT} ခု}other{အားနည်းသည့် စကားဝှက် {COUNT} ခု}}</translation> <translation id="5149188072385105201">စကားဝှက်ထည့်ရန်...</translation> @@ -800,6 +803,7 @@ <translation id="6346549652287021269">ဒေါင်းလုဒ်အသစ် စလုပ်လိုပါသလား။</translation> <translation id="6347953390226388422">{count,plural, =1{ဤလိပ်စာကို သင့် Google Account (<ph name="USER_EMAIL" />) နှင့် ယခုစက်မှ ဖျက်ပါမည်။}other{ဤလိပ်စာများကို သင့် Google Account (<ph name="USER_EMAIL" />) နှင့် ယခုစက်မှ ဖျက်ပါမည်။}}</translation> <translation id="634878792104344809">သင့်စက်ပစ္စည်းများအားလုံးတွင် သင်၏ စကားဝှက်၊ မှတ်တမ်းစသည်တို့ကို စင့်ခ်လုပ်ပါ</translation> +<translation id="6348855835728304880">သင်၏ Chrome စကားဝှက် စသည်တို့ကို ဤစက်ပေါ်ရှိ အခြားအက်ပ်များတွင် သုံးနိုင်သည်။</translation> <translation id="6355820205320395730">အားနည်းသည့် စကားဝှက်များကို အလွယ်တကူ ခန့်မှန်းနိုင်သည်။ လုံခြုံမှုမြင့်သည့် စကားဝှက်များကို သတ်မှတ်ပါ။ <ph name="BEGIN_LINK" />နောက်ထပ် လုံခြုံရေးအကြံပြုချက်များ ကြည့်ရန်။<ph name="END_LINK" /></translation> <translation id="6361848730467328243"><ph name="DOMAIN_NAME" /> ကို လိုက်ကြည့်ခြင်း</translation> <translation id="6362362396625799311">ရုပ်ဖျက်တဘ်များ မရှိပါ</translation> @@ -952,6 +956,7 @@ <translation id="7221173315674413369">ဝန်ဆောင်မှုအသစ်များနှင့် အကြံပြုချက်များကို ‘အသစ်ပါဝင်မှုများ’ တွင် စူးစမ်းလေ့လာနိုင်သည်</translation> <translation id="7223102419539744003">တဘ် ပိတ်ရန်</translation> <translation id="722454870747268814">ရုပ်ဖျက်တဘ်အသစ်</translation> +<translation id="723787869754590019">အော်တိုဖြည့်ရန် Chrome အသုံးပြုခြင်း</translation> <translation id="7265758999917665941">ဤဝဘ်ဆိုက်အတွက် လုံးဝမလုပ်ရန်</translation> <translation id="7272437679830969316">သင်မည်သူမည်ဝါဖြစ်ကြောင်း အတည်ပြု၍ မရနိုင်ပါ။ စကားဝှက်ကို မိတ္ထူကူးမထားပါ။</translation> <translation id="7291368939935408496">စကားဝှက်များကို အသင့်ပြင်နေသည်...</translation> @@ -1040,7 +1045,7 @@ <translation id="7884694604461143138">ရှာဖွေမှတ်တမ်း (<ph name="COUNT" /> ခု တွေ့သည်)</translation> <translation id="7887198238286927132">သင်၏ ကိုယ်ရေးအချက်အလက်ကို ကာကွယ်ရန် Chrome သည် ဤအကွက်တွင် အော်တိုဖြည့်မည် မဟုတ်ပါ။</translation> <translation id="7911190106180361398">သင့်အဖွဲ့အစည်းက အားလုံးကိုစင့်ခ်လုပ်ရန် ခွင့်မပြုပါ။</translation> -<translation id="7920949005883349320">ကိုယ်ရေးအချက်အလက်လုံခြုံမှုနှင့် လုံခြုံရေး</translation> +<translation id="7920949005883349320">ကိုယ်ရေးဒေတာနှင့် လုံခြုံရေး</translation> <translation id="7930998711684428189">ဒေတာပေါက်ကြားမှုတွင် စကားဝှက်များ ဖော်ထုတ်ခံရသည့်အခါ သင့်ကို သတိပေးသည်။</translation> <translation id="7938254975914653459">FaceTime</translation> <translation id="7939128259257418052">စကားဝှက်များကို တင်ပို့ခြင်း…</translation> @@ -1153,12 +1158,14 @@ <translation id="8663764600409216912">ခန့်မှန်းရခက်ပုံရသည့် စကားဝှက်များကို သင်သုံးနေပါသည်</translation> <translation id="8668210798914567634">ဤစာမျက်နှာကို သင်၏ဖတ်ရန်စာရင်းတွင် သိမ်းဆည်းလိုက်ပါပြီ။</translation> <translation id="8680787084697685621">အကောင့် ဝင်ရောက်မှု အသေးစိတ်များ အသစ်မဖြစ်တော့ပါ။</translation> +<translation id="868773710103052534">အသင့်ဖြစ်နေပါပြီ</translation> <translation id="8693663554456874301">{count,plural, =1{တဘ် ပိတ်ရန်}other{တဘ်များ ပိတ်ရန်}}</translation> <translation id="8703536910991780768">သင့်စကားဝှက်များက လုံခြုံမှုမြင့်ပုံရသည်</translation> <translation id="8706588385081740091">စကားဝှက်များ</translation> <translation id="8717864919010420084">လင့်ခ်မိတ္တူကူးရန်</translation> <translation id="8721297211384281569">ကိရိယာမီနျူး</translation> <translation id="8725066075913043281">ထပ် စမ်းကြည့်ရန်</translation> +<translation id="8727043961453758442">Chrome ကို အကောင်းဆုံးအသုံးချခြင်း</translation> <translation id="8730621377337864115">ပြီးပါပြီ</translation> <translation id="8731388423028622182">သင့် iPhone ပြင်ဆင်သတ်မှတ်မှု၏ လုပ်ဆောင်ချက်တစ်ခုအနေဖြင့် သင့်အကောင့် <ph name="USER_NAME" /> မှ ထွက်သွားသည်။ လက်မှတ်ထိုးဝင်ရန် အောက်ရှိရှေ့ဆက်ရန်ကို တို့ပါ။</translation> <translation id="87371078663613140">မီနူးဘားရှိ ရွေးချယ်စရာများကို လေ့လာပါ</translation> @@ -1208,6 +1215,7 @@ <translation id="8978059030508051916">{count,plural, =0{ကျိုးပေါက်ထားသည့် စကားဝှက်များ မရှိပါ}=1{ကျိုးပေါက်ထားသည့် စကားဝှက် {count} ခု}other{ကျိုးပေါက်ထားသည့် စကားဝှက် {count} ခု}}</translation> <translation id="8981454092730389528">Google လုပ်ဆောင်ချက်များ ထိန်းချုပ်ရန်</translation> <translation id="8985320356172329008">အဖြစ် Google သို့လက်မှတ်ထိုးဝင်ထားသည်</translation> +<translation id="8986567980592931173">သင့်စကားဝှက်၊ မှတ်တမ်း စသည်တို့ကိုစင့်ခ်လုပ်ရန် သင်၏ Google Account ဖြင့် လက်မှတ်ထိုးဝင်ပါ။</translation> <translation id="8998289560386111590">သင့်စက်တွင် မရနိုင်ပါ</translation> <translation id="9000089900434778519">သင်၏ရှာဖွေရေး အင်ဂျင်သည် <ph name="DSE_NAME" /> ဖြစ်သည်။ သက်ဆိုင်မှုရှိပါက သင်၏ရှာဖွေမှတ်တမ်းကို ဖျက်ရန်အတွက် ၎င်း၏ ညွှန်ကြားချက်များကို ကြည့်ပါ။</translation> <translation id="9008201768610948239">လျစ်လျူရှုရန်</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index bce759b..0c90281 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">यो पृष्ठ अनुवाद गर्ने हो?</translation> <translation id="7781069478569868053">नयाँ ट्याब पृष्ठ</translation> <translation id="7781829728241885113">हिजो</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{१ दिनपछि}other{{COUNT} दिनपछि}}</translation> <translation id="778855399387580014">Chrome को नयाँ ट्याबमा खोज सुरु गर्नुहोस्।</translation> <translation id="7791543448312431591">थप्नुहोस्</translation> <translation id="7807060072011926525">Google ले प्रदान गरेको</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index d71e9275..f13167a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Uitzoomen</translation> <translation id="2230173723195178503">Webpagina geladen</translation> <translation id="2239626343334228536">Browsegegevens wissen…</translation> +<translation id="2242467532204595597">Gebruik Chrome als je op links in berichten, documenten en andere apps tikt.</translation> <translation id="22508856139286506">Gesloten waarschuwingen (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Menu → Geschiedenis</translation> <translation id="2256933947031277845">Je organisatie vereist dat je alleen met bepaalde accounts inlogt.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} opgeslagen adres beschikbaar boven je toetsenbord.}other{{count} opgeslagen adressen beschikbaar boven je toetsenbord.}}</translation> <translation id="2421004566762153674">Cookies van derden blokkeren</translation> <translation id="2421044535038393232">Doorgaan met bewerken</translation> +<translation id="2423077901494354337">Je kunt nu optimaal gebruikmaken van Chrome op je apparaat.</translation> <translation id="2434405374328098816">Je hebt al een wachtwoord voor <ph name="USERNAME" /> opgeslagen op <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Wachtwoord bekijken</translation> <translation id="2451654228769116489">Tabblad vastzetten</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Nieuwe download starten?</translation> <translation id="6347953390226388422">{count,plural, =1{Dit adres wordt verwijderd uit je Google-account (<ph name="USER_EMAIL" />) en van dit apparaat.}other{Deze adressen worden verwijderd uit je Google-account (<ph name="USER_EMAIL" />) en van dit apparaat.}}</translation> <translation id="634878792104344809">Je wachtwoorden, geschiedenis en meer synchroniseren op al je apparaten</translation> +<translation id="6348855835728304880">Krijg toegang tot je Chrome-wachtwoorden en meer in andere apps op dit apparaat.</translation> <translation id="6355820205320395730">Zwakke wachtwoorden zijn makkelijk te raden. Zorg dat je sterke wachtwoorden maakt. <ph name="BEGIN_LINK" />Meer beveiligingstips bekijken<ph name="END_LINK" /></translation> <translation id="6361848730467328243"><ph name="DOMAIN_NAME" /> volgen</translation> <translation id="6362362396625799311">Geen incognitotabbladen</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Ontdek nieuwe functies en tips in Wat is er nieuw</translation> <translation id="7223102419539744003">Tabblad sluiten</translation> <translation id="722454870747268814">Nieuw incognitotabblad</translation> +<translation id="723787869754590019">Chrome gebruiken voor automatisch invullen</translation> <translation id="7265758999917665941">Nooit voor deze site</translation> <translation id="7272437679830969316">Kan je identiteit niet verifiëren. Wachtwoord niet gekopieerd.</translation> <translation id="7291368939935408496">Wachtwoorden voorbereiden...</translation> @@ -1025,6 +1029,7 @@ <translation id="7781011649027948662">Pagina vertalen?</translation> <translation id="7781069478569868053">Pagina 'Nieuw tabblad'</translation> <translation id="7781829728241885113">Gisteren</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Na 1 dag}other{Na {COUNT} dagen}}</translation> <translation id="778855399387580014">Start een zoekopdracht op een nieuw Chrome-tabblad.</translation> <translation id="7791543448312431591">Toevoegen</translation> <translation id="7807060072011926525">Geleverd door Google</translation> @@ -1089,6 +1094,7 @@ <translation id="8136856065410661948">Hiermee worden afspraken gemaakt in je Apple-agenda vanuit Chrome en Google Lens.</translation> <translation id="8156478151976189188">Password Sync werkt niet</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> accounts</translation> +<translation id="8159358225423560600">zojuist</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Je apparaten<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Pagina vertalen</translation> @@ -1119,6 +1125,7 @@ <translation id="8393889347136007944">Tabbladen die <ph name="THRESHOLD" /> dagen niet zijn gebruikt</translation> <translation id="8407669440184693619">Geen wachtwoorden gevonden voor deze site</translation> <translation id="842017693807136194">Ingelogd met</translation> +<translation id="8423121072346537366">Zojuist</translation> <translation id="8425693829365242963">Je wachtwoorden zijn uniek</translation> <translation id="8428045167754449968">Stad/plaats</translation> <translation id="8428213095426709021">Instellingen</translation> @@ -1152,12 +1159,14 @@ <translation id="8663764600409216912">Je gebruikt wachtwoorden die moeilijk te raden zijn</translation> <translation id="8668210798914567634">Deze pagina is opgeslagen in je leeslijst.</translation> <translation id="8680787084697685621">De inloggegevens voor het account zijn verouderd.</translation> +<translation id="868773710103052534">Je bent helemaal klaar</translation> <translation id="8693663554456874301">{count,plural, =1{Tabblad sluiten}other{Tabbladen sluiten}}</translation> <translation id="8703536910991780768">Je wachtwoorden lijken sterk</translation> <translation id="8706588385081740091">Wachtwoorden</translation> <translation id="8717864919010420084">Link kopiëren</translation> <translation id="8721297211384281569">Menu Extra</translation> <translation id="8725066075913043281">Opnieuw proberen</translation> +<translation id="8727043961453758442">Haal het maximale uit Chrome</translation> <translation id="8730621377337864115">Klaar</translation> <translation id="8731388423028622182">Je bent uitgelogd van je account <ph name="USER_NAME" /> omdat je iPhone wordt gereset. Tik hieronder op Doorgaan om in te loggen.</translation> <translation id="87371078663613140">Bekijk de opties in de menubalk</translation> @@ -1207,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Geen gehackte wachtwoorden}=1{{count} gehackt wachtwoord}other{{count} gehackte wachtwoorden}}</translation> <translation id="8981454092730389528">Google-activiteitsopties</translation> <translation id="8985320356172329008">Ingelogd bij Google als</translation> +<translation id="8986567980592931173">Log in met je Google-account om onder andere je wachtwoorden en geschiedenis te synchroniseren.</translation> <translation id="8998289560386111590">Niet beschikbaar op je apparaat</translation> <translation id="9000089900434778519">Je zoekmachine is <ph name="DSE_NAME" />. Bekijk de instructies van je zoekmachine voor het verwijderen van je zoekgeschiedenis (indien van toepassing).</translation> <translation id="9008201768610948239">Negeren</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index e625834d..79c53eb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Zoom ut</translation> <translation id="2230173723195178503">Nettsiden er lastet inn</translation> <translation id="2239626343334228536">Sletter nettlesingsdata …</translation> +<translation id="2242467532204595597">Bruk Chrome hver gang du trykker på linker i meldinger, dokumenter og andre apper.</translation> <translation id="22508856139286506">Avviste varsler (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Meny → Logg</translation> <translation id="2256933947031277845">Organisasjonen din lar deg kun logge på med visse kontoer.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} lagret adresse er tilgjengelig over tastaturet.}other{{count} lagrede adresser er tilgjengelige over tastaturet.}}</translation> <translation id="2421004566762153674">Blokkerer informasjonskapsler fra tredjeparter</translation> <translation id="2421044535038393232">Fortsett redigeringen</translation> +<translation id="2423077901494354337">Nå får du mest mulig ut av Chrome på enheten din.</translation> <translation id="2434405374328098816">Du har allerede lagret et passord for «<ph name="USERNAME" />» på <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Vis passord</translation> <translation id="2451654228769116489">Fest fanen</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Vil du starte en ny nedlasting?</translation> <translation id="6347953390226388422">{count,plural, =1{Denne adressen slettes fra Google-kontoen din (<ph name="USER_EMAIL" />) og denne enheten.}other{Disse adressene slettes fra Google-kontoen din (<ph name="USER_EMAIL" />) og denne enheten.}}</translation> <translation id="634878792104344809">Synkroniser blant annet passord og logg på alle enhetene dine</translation> +<translation id="6348855835728304880">Få tilgang til Chrome-passord med mer i andre apper på denne enheten.</translation> <translation id="6355820205320395730">Svake passord er enkle å gjette. Sørg for at du lager sterke passord. <ph name="BEGIN_LINK" />Se flere sikkerhetstips.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Følg <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Ingen inkognitofaner</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Utforsk nye funksjoner og tips i Nyheter</translation> <translation id="7223102419539744003">Lukk fane</translation> <translation id="722454870747268814">Ny inkognitofane</translation> +<translation id="723787869754590019">Bruk Chrome for autofyll</translation> <translation id="7265758999917665941">Aldri for dette nettstedet</translation> <translation id="7272437679830969316">Kan ikke bekrefte identiteten din. Passordet er ikke kopiert.</translation> <translation id="7291368939935408496">Klargjør passordene …</translation> @@ -1155,12 +1159,14 @@ <translation id="8663764600409216912">Du bruker passord som virker vanskelige å gjette</translation> <translation id="8668210798914567634">Denne siden er lagret i leselisten din.</translation> <translation id="8680787084697685621">Kontoens påloggingsdetaljer er utdaterte.</translation> +<translation id="868773710103052534">Alt er klart!</translation> <translation id="8693663554456874301">{count,plural, =1{Lukk fanen}other{Lukk fanene}}</translation> <translation id="8703536910991780768">Passordene dine ser sterke ut</translation> <translation id="8706588385081740091">Passord</translation> <translation id="8717864919010420084">Kopiér linken</translation> <translation id="8721297211384281569">Verktøy-menyen</translation> <translation id="8725066075913043281">Prøv på nytt</translation> +<translation id="8727043961453758442">Få mest mulig ut av Chrome</translation> <translation id="8730621377337864115">Ferdig</translation> <translation id="8731388423028622182">Du ble logget av kontoen din, <ph name="USER_NAME" />, som en del av tilbakestillingen av iPhone. Trykk på Fortsett under for å logge på.</translation> <translation id="87371078663613140">Utforsk alternativene på menylinjen</translation> @@ -1210,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Ingen passord er utsatt for sikkerhetsbrudd}=1{{count} passord er utsatt for sikkerhetsbrudd}other{{count} passord er utsatt for sikkerhetsbrudd}}</translation> <translation id="8981454092730389528">Google Aktivitetslagring</translation> <translation id="8985320356172329008">Logget på Google som</translation> +<translation id="8986567980592931173">Logg på med Google-kontoen din for å synkronisere passordene dine, loggen din med mer.</translation> <translation id="8998289560386111590">Ikke tilgjengelig på enheten din</translation> <translation id="9000089900434778519">Søkemotoren din er <ph name="DSE_NAME" />. Se eventuelt instruksjonene deres om hvordan du sletter søkeloggen din.</translation> <translation id="9008201768610948239">Ignorer</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 9e77eff319..a9f59a0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">ਕੀ ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕਰਨਾ ਹੈ?</translation> <translation id="7781069478569868053">ਨਵਾਂ ਟੈਬ ਪੰਨਾ</translation> <translation id="7781829728241885113">ਕੱਲ੍ਹ</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 ਦਿਨ ਬਾਅਦ}one{{COUNT} ਦਿਨ ਬਾਅਦ}other{{COUNT} ਦਿਨਾਂ ਬਾਅਦ}}</translation> <translation id="778855399387580014">ਇੱਕ ਨਵੀਂ Chrome ਟੈਬ ਵਿੱਚ ਕੋਈ ਖੋਜ ਸ਼ੁਰੂ ਕਰੋ।</translation> <translation id="7791543448312431591">ਜੋੜੋ</translation> <translation id="7807060072011926525">Google ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਈ ਗਈ</translation> @@ -1088,6 +1089,7 @@ <translation id="8136856065410661948">ਇਸਦੀ ਵਰਤੋਂ Chrome ਅਤੇ Google Lens ਤੋਂ ਤੁਹਾਡੇ Apple Calendar ਵਿੱਚ ਇਵੈਂਟ ਬਣਾਉਣ ਲਈ ਕੀਤੀ ਜਾਵੇਗੀ।</translation> <translation id="8156478151976189188">ਪਾਸਵਰਡ ਸਿੰਕ ਕੰਮ ਨਹੀਂ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> ਖਾਤੇ</translation> +<translation id="8159358225423560600">ਹੁਣੇ ਹੀ</translation> <translation id="8179976553408161302">ਦਰਜ ਕਰੋ</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />ਤੁਹਾਡੇ ਡੀਵਾਈਸ<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">ਪੰਨੇ ਦਾ ਅਨੁਵਾਦ ਕਰੋ</translation> @@ -1118,6 +1120,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> ਦਿਨਾਂ ਤੋਂ ਨਹੀਂ ਵਰਤੀਆਂ ਗਈਆਂ ਟੈਬਾਂ</translation> <translation id="8407669440184693619">ਇਸ ਸਾਈਟ ਲਈ ਕੋਈ ਪਾਸਵਰਡ ਨਹੀਂ ਲੱਭਿਆ</translation> <translation id="842017693807136194">ਇਸ ਨਾਲ ਸਾਈਨ ਇਨ ਕੀਤਾ ਗਿਆ</translation> +<translation id="8423121072346537366">ਹੁਣੇ ਹੀ</translation> <translation id="8425693829365242963">ਤੁਹਾਡੇ ਪਾਸਵਰਡ ਵਿਲੱਖਣ ਹਨ</translation> <translation id="8428045167754449968">ਸ਼ਹਿਰ / ਕਸਬਾ</translation> <translation id="8428213095426709021">ਸੈਟਿੰਗਾਂ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index fd9ac9a..65da30a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Pomniejsz</translation> <translation id="2230173723195178503">Wczytano stronę internetową</translation> <translation id="2239626343334228536">Czyszczę dane przeglądania…</translation> +<translation id="2242467532204595597">Używaj Chrome, zawsze gdy klikasz linki w wiadomościach, dokumentach i w innych aplikacjach.</translation> <translation id="22508856139286506">Zamknięte ostrzeżenia (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Menu → Historia</translation> <translation id="2256933947031277845">Twoja organizacja pozwala logować się tylko na określone konta.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} zapisany adres dostępny nad klawiaturą.}few{{count} zapisane adresy dostępne nad klawiaturą.}many{{count} zapisanych adresów dostępnych nad klawiaturą.}other{{count} zapisanego adresu dostępnego nad klawiaturą.}}</translation> <translation id="2421004566762153674">Blokowanie plików cookie innych firm</translation> <translation id="2421044535038393232">Edytuj dalej</translation> +<translation id="2423077901494354337">Teraz możesz w pełni korzystać z możliwości Chrome na swoim urządzeniu.</translation> <translation id="2434405374328098816">Masz już zapisane hasło do strony <ph name="WEBSITE" /> powiązane z nazwą użytkownika „<ph name="USERNAME" />”</translation> <translation id="2435457462613246316">Pokaż hasło</translation> <translation id="2451654228769116489">Przypnij kartę</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Rozpocząć nowe pobieranie?</translation> <translation id="6347953390226388422">{count,plural, =1{Ten adres zostanie usunięty z Twojego konta Google (<ph name="USER_EMAIL" />) i z tego urządzenia.}few{Te adresy zostaną usunięte z Twojego konta Google (<ph name="USER_EMAIL" />) i z tego urządzenia.}many{Te adresy zostaną usunięte z Twojego konta Google (<ph name="USER_EMAIL" />) i z tego urządzenia.}other{Te adresy zostaną usunięte z Twojego konta Google (<ph name="USER_EMAIL" />) i z tego urządzenia.}}</translation> <translation id="634878792104344809">Synchronizuj hasła, historię i inne dane na wszystkich Twoich urządzeniach</translation> +<translation id="6348855835728304880">Korzystaj z haseł w Chrome i innych ustawień w innych aplikacjach na tym urządzeniu.</translation> <translation id="6355820205320395730">Słabe hasła są łatwe do odgadnięcia. Pamiętaj, aby używać tylko silnych haseł. <ph name="BEGIN_LINK" />Więcej wskazówek dotyczących bezpieczeństwa<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Obserwuj: <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Brak kart incognito</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Poznaj nowe funkcje i wskazówki przedstawione na stronie Nowe funkcje</translation> <translation id="7223102419539744003">Zamknij kartę</translation> <translation id="722454870747268814">Nowa karta incognito</translation> +<translation id="723787869754590019">Używaj autouzupełniania w Chrome</translation> <translation id="7265758999917665941">Nigdy dla tej witryny</translation> <translation id="7272437679830969316">Nie można zweryfikować Twojej tożsamości. Hasło nie zostało skopiowane.</translation> <translation id="7291368939935408496">Przygotowuję hasła…</translation> @@ -1025,6 +1029,7 @@ <translation id="7781011649027948662">Przetłumaczyć stronę?</translation> <translation id="7781069478569868053">Strona Nowa karta</translation> <translation id="7781829728241885113">Wczoraj</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Po 1 dniu}few{Po {COUNT} dniach}many{Po {COUNT} dniach}other{Po {COUNT} dnia}}</translation> <translation id="778855399387580014">Rozpocznij wyszukiwanie na nowej karcie Chrome.</translation> <translation id="7791543448312431591">Dodaj</translation> <translation id="7807060072011926525">Udostępniany przez Google</translation> @@ -1089,6 +1094,7 @@ <translation id="8136856065410661948">Będziemy z tego korzystać, aby tworzyć wydarzenia z Chrome i Obiektywu Google w kalendarzu Apple.</translation> <translation id="8156478151976189188">Funkcja Password Sync nie działa</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> kont(a)</translation> +<translation id="8159358225423560600">przed chwilą</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Twoje urządzenia<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Przetłumacz stronę</translation> @@ -1119,6 +1125,7 @@ <translation id="8393889347136007944">Karty nie były używane przez <ph name="THRESHOLD" /> dni</translation> <translation id="8407669440184693619">Nie znaleziono haseł do tej strony</translation> <translation id="842017693807136194">Zalogowano za pomocą:</translation> +<translation id="8423121072346537366">Przed chwilą</translation> <translation id="8425693829365242963">Twoje hasła są unikalne</translation> <translation id="8428045167754449968">Miejscowość</translation> <translation id="8428213095426709021">Ustawienia</translation> @@ -1152,12 +1159,14 @@ <translation id="8663764600409216912">Używasz haseł, które są trudne do odgadnięcia</translation> <translation id="8668210798914567634">Ta strona została zapisana na Twojej liście Do przeczytania.</translation> <translation id="8680787084697685621">Dane logowania na konto są nieaktualne.</translation> +<translation id="868773710103052534">Wszystko gotowe</translation> <translation id="8693663554456874301">{count,plural, =1{Zamknij kartę}few{Zamknij karty}many{Zamknij karty}other{Zamknij karty}}</translation> <translation id="8703536910991780768">Twoje hasła wyglądają na silne</translation> <translation id="8706588385081740091">Hasła</translation> <translation id="8717864919010420084">Skopiuj link</translation> <translation id="8721297211384281569">Menu Narzędzia</translation> <translation id="8725066075913043281">Spróbuj ponownie</translation> +<translation id="8727043961453758442">W pełni wykorzystuj potencjał Chrome</translation> <translation id="8730621377337864115">Gotowe</translation> <translation id="8731388423028622182">W ramach resetowania iPhone'a nastąpiło wylogowanie z konta <ph name="USER_NAME" />. Aby się zalogować, poniżej kliknij Dalej.</translation> <translation id="87371078663613140">Zapoznaj się z opcjami na pasku menu</translation> @@ -1207,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Brak przejętych haseł}=1{{count} przejęte hasło}few{{count} przejęte hasła}many{{count} przejętych haseł}other{{count} przejętego hasła}}</translation> <translation id="8981454092730389528">Zarządzanie aktywnością w Google</translation> <translation id="8985320356172329008">Jesteś zalogowany w Google jako</translation> +<translation id="8986567980592931173">Zaloguj się na konto Google, aby synchronizować swoje hasła, historię i inne dane.</translation> <translation id="8998289560386111590">Niedostępne na Twoim urządzeniu</translation> <translation id="9000089900434778519">Twoja wyszukiwarka to <ph name="DSE_NAME" />. Zapoznaj się z jej instrukcjami, jeśli chcesz usunąć historię wyszukiwania.</translation> <translation id="9008201768610948239">Ignoruj</translation>
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 e5f0d5e..6979fab 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Diminuir zoom</translation> <translation id="2230173723195178503">Página da Web carregada</translation> <translation id="2239626343334228536">Limpando dados de navegação…</translation> +<translation id="2242467532204595597">Use o Chrome sempre que tocar em links em mensagens, documentos e outros apps.</translation> <translation id="22508856139286506">Avisos dispensados (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Menu → Histórico</translation> <translation id="2256933947031277845">Sua organização permite que você faça login apenas com determinadas contas.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} endereço salvo disponível acima do teclado.}one{{count} endereço salvo disponível acima do teclado.}other{{count} endereços salvos disponíveis acima do teclado.}}</translation> <translation id="2421004566762153674">Bloqueando cookies de terceiros</translation> <translation id="2421044535038393232">Continuar editando</translation> +<translation id="2423077901494354337">Você já pode aproveitar tudo o que o Chrome tem a oferecer no seu dispositivo.</translation> <translation id="2434405374328098816">Você já salvou uma senha para "<ph name="USERNAME" />" em <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Mostrar senha</translation> <translation id="2451654228769116489">Fixar guia</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Iniciar novo download?</translation> <translation id="6347953390226388422">{count,plural, =1{Esse endereço será excluído da sua Conta do Google (<ph name="USER_EMAIL" />) e deste dispositivo.}one{Esse endereço será excluído da sua Conta do Google (<ph name="USER_EMAIL" />) e deste dispositivo.}other{Esses endereços serão excluídos da sua Conta do Google (<ph name="USER_EMAIL" />) e deste dispositivo.}}</translation> <translation id="634878792104344809">Sincronize senhas, histórico e muito mais em todos os seus dispositivos</translation> +<translation id="6348855835728304880">Acesse suas senhas do Chrome e muito mais em outros apps neste dispositivo.</translation> <translation id="6355820205320395730">Senhas fracas são fáceis de adivinhar. Você precisa criar senhas fortes. <ph name="BEGIN_LINK" />Confira mais dicas de segurança<ph name="END_LINK" />.</translation> <translation id="6361848730467328243">Seguir <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Não há guias anônimas</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Conheça os novos recursos e dicas em "Novidades"</translation> <translation id="7223102419539744003">Fechar guia</translation> <translation id="722454870747268814">Nova guia anônima</translation> +<translation id="723787869754590019">Usar o preenchimento automático do Chrome</translation> <translation id="7265758999917665941">Nunca para este site</translation> <translation id="7272437679830969316">Não é possível verificar sua identidade. Senha não copiada.</translation> <translation id="7291368939935408496">Preparando senhas…</translation> @@ -1155,12 +1159,14 @@ <translation id="8663764600409216912">Você está usando senhas difíceis de adivinhar</translation> <translation id="8668210798914567634">Esta página foi salva na sua lista de leitura.</translation> <translation id="8680787084697685621">Os detalhes de login da conta estão desatualizados.</translation> +<translation id="868773710103052534">Tudo pronto</translation> <translation id="8693663554456874301">{count,plural, =1{Fechar guia}one{Fechar guia}other{Fechar guias}}</translation> <translation id="8703536910991780768">Suas senhas parecem fortes</translation> <translation id="8706588385081740091">Senhas</translation> <translation id="8717864919010420084">Copiar link</translation> <translation id="8721297211384281569">Menu Ferramentas</translation> <translation id="8725066075913043281">Tentar novamente</translation> +<translation id="8727043961453758442">Aproveite o Chrome ao máximo</translation> <translation id="8730621377337864115">Concluído</translation> <translation id="8731388423028622182">Sua conta <ph name="USER_NAME" /> foi desconectada como parte da redefinição do iPhone. Toque em "Continuar" abaixo para fazer login.</translation> <translation id="87371078663613140">Explore as opções na barra de menus</translation> @@ -1210,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Nenhuma senha comprometida}=1{{count} senha comprometida}one{{count} senha comprometida}other{{count} senhas comprometidas}}</translation> <translation id="8981454092730389528">Controles de atividades do Google</translation> <translation id="8985320356172329008">Conectado(a) ao Google como</translation> +<translation id="8986567980592931173">Faça login com sua Conta do Google para sincronizar senhas, histórico e muito mais.</translation> <translation id="8998289560386111590">Indisponível no seu dispositivo</translation> <translation id="9000089900434778519">Seu mecanismo de pesquisa é o <ph name="DSE_NAME" />. Veja as instruções para excluir o histórico de pesquisa, se aplicável.</translation> <translation id="9008201768610948239">Ignorar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index b17900f..6d23eb3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -1029,6 +1029,7 @@ <translation id="7781011649027948662">Pretende traduzir a página?</translation> <translation id="7781069478569868053">Página Novo separador</translation> <translation id="7781829728241885113">Ontem</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Após 1 dia}other{Após {COUNT} dias}}</translation> <translation id="778855399387580014">Inicie uma pesquisa no novo separador do Chrome.</translation> <translation id="7791543448312431591">Adicionar</translation> <translation id="7807060072011926525">Disponibilizados pela Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index 8dd6b8b..b230aaf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Traduci pagina?</translation> <translation id="7781069478569868053">Pagina Filă nouă</translation> <translation id="7781829728241885113">Ieri</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{După o zi}few{După {COUNT} zile}other{După {COUNT} de zile}}</translation> <translation id="778855399387580014">Începe o căutare într-o filă Chrome nouă.</translation> <translation id="7791543448312431591">Adaugă</translation> <translation id="7807060072011926525">Oferit de Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index bbcff9b..c3149ea3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Уменьшить</translation> <translation id="2230173723195178503">Веб-страница загружена</translation> <translation id="2239626343334228536">Удаление данных о работе в браузере…</translation> +<translation id="2242467532204595597">Открывайте ссылки в сообщениях, документах и других приложениях с помощью Chrome.</translation> <translation id="22508856139286506">Закрытые предупреждения (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Меню → История</translation> <translation id="2256933947031277845">Согласно правилам, установленным организацией, выполнить вход можно только с одобренным аккаунтом.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} сохраненный адрес показан над клавиатурой.}one{{count} сохраненный адрес показан над клавиатурой.}few{{count} сохраненных адреса показаны над клавиатурой.}many{{count} сохраненных адресов показаны над клавиатурой.}other{{count} сохраненного адреса показаны над клавиатурой.}}</translation> <translation id="2421004566762153674">Блокировать сторонние файлы cookie</translation> <translation id="2421044535038393232">Продолжить редактирование</translation> +<translation id="2423077901494354337">Теперь вы сможете использовать все возможности Chrome.</translation> <translation id="2434405374328098816">Пароль пользователя <ph name="USERNAME" /> для сайта <ph name="WEBSITE" /> уже сохранен.</translation> <translation id="2435457462613246316">Показать пароль</translation> <translation id="2451654228769116489">Закрепить вкладку</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Скачать новый файл?</translation> <translation id="6347953390226388422">{count,plural, =1{Адрес будет удален с этого устройства и из вашего аккаунта Google (<ph name="USER_EMAIL" />)}one{Адреса будут удалены с этого устройства и из вашего аккаунта Google (<ph name="USER_EMAIL" />)}few{Адреса будут удалены с этого устройства и из вашего аккаунта Google (<ph name="USER_EMAIL" />)}many{Адреса будут удалены с этого устройства и из вашего аккаунта Google (<ph name="USER_EMAIL" />)}other{Адреса будут удалены с этого устройства и из вашего аккаунта Google (<ph name="USER_EMAIL" />)}}</translation> <translation id="634878792104344809">Синхронизируйте пароли, историю и другие данные на всех ваших устройствах.</translation> +<translation id="6348855835728304880">Получайте доступ к паролям и другим данным Chrome в приложениях на этом устройстве.</translation> <translation id="6355820205320395730">Простые пароли легко подобрать. Старайтесь придумывать надежные пароли. <ph name="BEGIN_LINK" />Получить больше советов по безопасности.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Подписаться на <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Нет открытых вкладок инкогнито</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Прочитайте новости и рекомендации на вкладке "Что нового"</translation> <translation id="7223102419539744003">Закрыть вкладку</translation> <translation id="722454870747268814">Новая вкладка инкогнито</translation> +<translation id="723787869754590019">Используйте Chrome для автозаполнения</translation> <translation id="7265758999917665941">Никогда для этого сайта</translation> <translation id="7272437679830969316">Не удалось пройти проверку. Пароль не скопирован.</translation> <translation id="7291368939935408496">Подготовка паролей…</translation> @@ -1025,6 +1029,7 @@ <translation id="7781011649027948662">Перевести страницу?</translation> <translation id="7781069478569868053">Страница быстрого доступа</translation> <translation id="7781829728241885113">Вчера</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Через 1 день}one{Через {COUNT} день}few{Через {COUNT} дня}many{Через {COUNT} дней}other{Через {COUNT} дня}}</translation> <translation id="778855399387580014">Запускайте поиск в новой вкладке Chrome.</translation> <translation id="7791543448312431591">Добавить</translation> <translation id="7807060072011926525">Данные от Google</translation> @@ -1154,12 +1159,14 @@ <translation id="8663764600409216912">Вы используете надежные пароли.</translation> <translation id="8668210798914567634">Страница сохранена в список для чтения.</translation> <translation id="8680787084697685621">Данные для входа в аккаунт устарели.</translation> +<translation id="868773710103052534">Готово!</translation> <translation id="8693663554456874301">{count,plural, =1{Закрыть вкладку}one{Закрыть вкладки}few{Закрыть вкладки}many{Закрыть вкладки}other{Закрыть вкладки}}</translation> <translation id="8703536910991780768">Нет простых паролей</translation> <translation id="8706588385081740091">Пароли</translation> <translation id="8717864919010420084">Копировать ссылку</translation> <translation id="8721297211384281569">Меню "Инструменты"</translation> <translation id="8725066075913043281">Повторить попытку</translation> +<translation id="8727043961453758442">Максимально эффективная работа с Chrome</translation> <translation id="8730621377337864115">Готово</translation> <translation id="8731388423028622182">В результате сброса настроек iPhone произошел выход из аккаунта <ph name="USER_NAME" />. Нажмите "Продолжить" ниже, чтобы войти в него.</translation> <translation id="87371078663613140">Изучите параметры в строке меню.</translation> @@ -1209,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Нет раскрытых паролей}=1{{count} раскрытый пароль}one{{count} раскрытый пароль}few{{count} раскрытых пароля}many{{count} раскрытых паролей}other{{count} раскрытого пароля}}</translation> <translation id="8981454092730389528">Отслеживание действий в Google</translation> <translation id="8985320356172329008">Вы вошли в аккаунт</translation> +<translation id="8986567980592931173">Чтобы синхронизировать пароли, историю и другие данные, достаточно войти в аккаунт Google.</translation> <translation id="8998289560386111590">Недоступно на вашем устройстве</translation> <translation id="9000089900434778519">Вы используете "<ph name="DSE_NAME" />". Изучите инструкции по удалению истории поиска в справочных материалах указанной поисковой системы.</translation> <translation id="9008201768610948239">Пропустить</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index c46b36b..d9ad3e9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">පිටුව පරිවර්තන කරන්නද?</translation> <translation id="7781069478569868053">නව පටිති පිටුව</translation> <translation id="7781829728241885113">ඊයේ</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 දිනකට පසු}one{දින {COUNT}කට පසු}other{දින {COUNT}කට පසු}}</translation> <translation id="778855399387580014">නව Chrome පටිත්තක් තුළ සෙවීම ආරම්භ කරන්න.</translation> <translation id="7791543448312431591">එක් කරන්න</translation> <translation id="7807060072011926525">Google විසින් සපයනු ලැබේ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 3dd35b1..56b9ed9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Oddialiť</translation> <translation id="2230173723195178503">Načítala sa webová stránka</translation> <translation id="2239626343334228536">Vymazávajú sa dáta prehliadania…</translation> +<translation id="2242467532204595597">Chrome môžete používať vždy, keď klepnete na odkazy v správach, dokumentoch a ďalších aplikáciách.</translation> <translation id="22508856139286506">Zavreté upozornenia (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Ponuka → História</translation> <translation id="2256933947031277845">Vaša organizácia vám povoľuje prihlásiť sa iba určitými účtami.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{Nad klávesnicou je k dispozícii {count} uložená adresa.}few{Nad klávesnicou sú k dispozícii {count} uložené adresy.}many{{count} saved addresses available above your keyboard.}other{Nad klávesnicou je k dispozícii {count} uložených adries.}}</translation> <translation id="2421004566762153674">Blokovanie súborov cookie tretích strán</translation> <translation id="2421044535038393232">Ďalej upravovať</translation> +<translation id="2423077901494354337">Teraz budete môcť využívať Chrome vo svojom zariadení naplno.</translation> <translation id="2434405374328098816">Heslo pre používateľské meno <ph name="USERNAME" /> ste už uložili na <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Zobraziť heslo</translation> <translation id="2451654228769116489">Pripnúť kartu</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Spustiť nové sťahovanie?</translation> <translation id="6347953390226388422">{count,plural, =1{Táto adresa bude odstránená z vášho účtu Google (<ph name="USER_EMAIL" />) aj tohto zariadenia.}few{Tieto adresy budú odstránené z vášho účtu (<ph name="USER_EMAIL" />) aj tohto zariadenia.}many{These addresses will be deleted from your Google Account (<ph name="USER_EMAIL" />) and from this device.}other{Tieto adresy budú odstránené z vášho účtu (<ph name="USER_EMAIL" />) aj tohto zariadenia.}}</translation> <translation id="634878792104344809">Synchronizujte si heslá, históriu a ďalší obsah vo všetkých zariadeniach</translation> +<translation id="6348855835728304880">Získavajte prístup heslám a ďalším údajom Chromu v iných aplikáciách v tomto zariadení.</translation> <translation id="6355820205320395730">Slabé heslá sa dajú ľahko uhádnuť. Vytvárajte si silné heslá. <ph name="BEGIN_LINK" />Ďalšie tipy na zabezpečenie<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Sledovať <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Žiadne karty inkognito</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Preskúmajte nové funkcie a tipy v sekcii Novinky</translation> <translation id="7223102419539744003">Zavretie karty</translation> <translation id="722454870747268814">Nová karta inkognito</translation> +<translation id="723787869754590019">Používajte Chrome na automatické dopĺňanie</translation> <translation id="7265758999917665941">Nikdy pre tento web</translation> <translation id="7272437679830969316">Vašu totožnosť nie je možné overiť. Heslo sa neskopírovalo.</translation> <translation id="7291368939935408496">Pripravujú sa heslá...</translation> @@ -1089,6 +1093,7 @@ <translation id="8136856065410661948">Táto možnosť sa použije na vytváranie udalostí vo vašom Kalendári Apple v Chrome a pomocou funkcie Google Lens.</translation> <translation id="8156478151976189188">Synchronizácia hesiel nefunguje</translation> <translation id="8157532349231307196">Počet účtov: <ph name="NUMBER_OF_ACCOUNTS" /></translation> +<translation id="8159358225423560600">práve teraz</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Vaše zariadenia<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Preložiť stránku</translation> @@ -1119,6 +1124,7 @@ <translation id="8393889347136007944">Karty, ktoré neboli použité tento počet dní: <ph name="THRESHOLD" /></translation> <translation id="8407669440184693619">Nenašli sa žiadne heslá tohto webu</translation> <translation id="842017693807136194">Prihlásenie pomocou</translation> +<translation id="8423121072346537366">Práve teraz</translation> <translation id="8425693829365242963">Vaše heslá sú jedinečné</translation> <translation id="8428045167754449968">Mesto</translation> <translation id="8428213095426709021">Nastavenia</translation> @@ -1152,12 +1158,14 @@ <translation id="8663764600409216912">Používate heslá, ktoré sa dajú iba ťažko uhádnuť</translation> <translation id="8668210798914567634">Táto stránka bola uložená do čitateľského zoznamu.</translation> <translation id="8680787084697685621">Informácie o prihlásení do účtu sú neaktuálne.</translation> +<translation id="868773710103052534">Všetko je nastavené</translation> <translation id="8693663554456874301">{count,plural, =1{Zavrieť kartu}few{Zavrieť karty}many{Close Tabs}other{Zavrieť karty}}</translation> <translation id="8703536910991780768">Zdá sa, že vaše heslá sú silné</translation> <translation id="8706588385081740091">Heslá</translation> <translation id="8717864919010420084">Kopírovať odkaz</translation> <translation id="8721297211384281569">Ponuka Nástroje</translation> <translation id="8725066075913043281">Skúsiť znova</translation> +<translation id="8727043961453758442">Využivajte Chrome naplno</translation> <translation id="8730621377337864115">Hotovo</translation> <translation id="8731388423028622182">V rámci resetovania iPhonu vás systém odhlásili z účtu <ph name="USER_NAME" />. Ak sa chcete prihlásiť, klepnite na Pokračovať nižšie.</translation> <translation id="87371078663613140">Preskúmajte možnosti na paneli s ponukami</translation> @@ -1207,6 +1215,7 @@ <translation id="8978059030508051916">{count,plural, =0{Žiadne odhalené heslá}=1{{count} odhalené heslo}few{{count} odhalené heslá}many{{count} Compromised Passwords}other{{count} odhalených hesiel}}</translation> <translation id="8981454092730389528">Riadenie aktivity Google</translation> <translation id="8985320356172329008">Prihlásený účet Google</translation> +<translation id="8986567980592931173">Ak chcete synchronizovať heslá, históriu a ďalší obsah, prihláste sa účtom Google.</translation> <translation id="8998289560386111590">V zariadení nie je k dispozícii</translation> <translation id="9000089900434778519">Používate vyhľadávač <ph name="DSE_NAME" />. Prečítajte si jeho pokyny, ako odstrániť históriu vyhľadávania (ak je to možné).</translation> <translation id="9008201768610948239">Ignorovať</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 63227996..358724db 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Želite prevod te strani?</translation> <translation id="7781069478569868053">Nov zavihek s povezavami</translation> <translation id="7781829728241885113">Včeraj</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Po 1 dnevu}one{Po {COUNT} dnevu}two{Po {COUNT} dnevih}few{Po {COUNT} dnevih}other{Po {COUNT} dnevih}}</translation> <translation id="778855399387580014">Začnite iskanje na novem Chromovem zavihku.</translation> <translation id="7791543448312431591">Dodaj</translation> <translation id="7807060072011926525">Zagotavlja Google</translation>
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 6830ea72..3ad1e8a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Umanjite</translation> <translation id="2230173723195178503">Veb-stranica je učitana</translation> <translation id="2239626343334228536">Brišu se podaci pregledanja...</translation> +<translation id="2242467532204595597">Koristite Chrome svaki put kada dodirnete linkove u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="22508856139286506">Odbačena upozorenja (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Meni → Istorija</translation> <translation id="2256933947031277845">Organizacija vam dozvoljava da se prijavite samo pomoću određenih naloga.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} sačuvana adresa je dostupna iznad tastature.}one{{count} sačuvana adresa je dostupna iznad tastature.}few{{count} sačuvane adrese su dostupne iznad tastature.}other{{count} sačuvanih adresa je dostupno iznad tastature.}}</translation> <translation id="2421004566762153674">Blokira kolačiće treće strane</translation> <translation id="2421044535038393232">Nastavi izmene</translation> +<translation id="2423077901494354337">Sada ćete iskoristiti sve prednosti Chrome-a na uređaju.</translation> <translation id="2434405374328098816">Već ste sačuvali lozinku za „<ph name="USERNAME" />“ na <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Prikaži lozinku</translation> <translation id="2451654228769116489">Zakači karticu</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Želite li da započnete novo preuzimanje?</translation> <translation id="6347953390226388422">{count,plural, =1{Ova adresa će biti izbrisana sa Google naloga (<ph name="USER_EMAIL" />) i sa ovog uređaja.}one{Ove adrese će biti izbrisane sa Google naloga (<ph name="USER_EMAIL" />) i sa ovog uređaja.}few{Ove adrese će biti izbrisane sa Google naloga (<ph name="USER_EMAIL" />) i sa ovog uređaja.}other{Ove adrese će biti izbrisane sa Google naloga (<ph name="USER_EMAIL" />) i sa ovog uređaja.}}</translation> <translation id="634878792104344809">Sinhronizujte, lozinke, istoriju i drugo na svim uređajima</translation> +<translation id="6348855835728304880">Pristupajte Chrome lozinkama i ostalim funkcijama u drugim aplikacijama na ovom uređaju.</translation> <translation id="6355820205320395730">Slabe lozinke lako mogu da se pogode. Obavezno napravite jake lozinke. <ph name="BEGIN_LINK" />Pogledajte još saveta za bezbednost.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Pratite <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Nema kartica bez arhiviranja</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Istražite nove funkcije i savete u odeljku Šta je novo</translation> <translation id="7223102419539744003">Zatvori karticu</translation> <translation id="722454870747268814">Nova kartica bez arhiviranja</translation> +<translation id="723787869754590019">Koristite Chrome za automatsko popunjavanje</translation> <translation id="7265758999917665941">Nikada za ovaj sajt</translation> <translation id="7272437679830969316">Verifikacija identiteta nije uspela. Lozinka nije kopirana.</translation> <translation id="7291368939935408496">Pripremaju se lozinke...</translation> @@ -1025,6 +1029,7 @@ <translation id="7781011649027948662">Želite da prevedete stranicu?</translation> <translation id="7781069478569868053">Stranica nove kartice</translation> <translation id="7781829728241885113">Juče</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Posle 1 dana}one{Posle {COUNT} dana}few{Posle {COUNT} dana}other{Posle {COUNT} dana}}</translation> <translation id="778855399387580014">Započnite pretragu na novoj Chrome kartici.</translation> <translation id="7791543448312431591">Dodaj</translation> <translation id="7807060072011926525">Pruža Google</translation> @@ -1154,12 +1159,14 @@ <translation id="8663764600409216912">Koristite lozinke koje teško mogu da se pogode</translation> <translation id="8668210798914567634">Ova stranica je sačuvana na Listi za čitanje.</translation> <translation id="8680787084697685621">Detalji za prijavljivanje na nalog su zastareli.</translation> +<translation id="868773710103052534">Spremni ste</translation> <translation id="8693663554456874301">{count,plural, =1{Zatvori karticu}one{Zatvori kartice}few{Zatvori kartice}other{Zatvori kartice}}</translation> <translation id="8703536910991780768">Izgleda da su lozinke jake</translation> <translation id="8706588385081740091">Lozinke</translation> <translation id="8717864919010420084">Kopiraj link</translation> <translation id="8721297211384281569">Meni Alatke</translation> <translation id="8725066075913043281">Probajte ponovo</translation> +<translation id="8727043961453758442">Iskoristite sve prednosti Chrome-a</translation> <translation id="8730621377337864115">Gotovo</translation> <translation id="8731388423028622182">Odjavljeni ste sa naloga <ph name="USER_NAME" /> u sklopu resetovanja iPhone-a. Dodirnite Nastavi u nastavku da biste se prijavili.</translation> <translation id="87371078663613140">Istražite opcije na traci menija</translation> @@ -1209,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Nema ugroženih lozinki}=1{{count} ugrožena lozinka}one{{count} ugrožena lozinka}few{{count} ugrožene lozinke}other{{count} ugroženih lozinki}}</translation> <translation id="8981454092730389528">Google kontrole aktivnosti</translation> <translation id="8985320356172329008">Prijavljeni ste na Google kao</translation> +<translation id="8986567980592931173">Prijavite se pomoću Google naloga da biste sinhronizovali lozinke, istoriju i drugo.</translation> <translation id="8998289560386111590">Nije dostupno na vašem uređaju</translation> <translation id="9000089900434778519">Vaš pretraživač je <ph name="DSE_NAME" />. Pogledajte uputstva tog pretraživača za brisanje istorije pretrage ako je to primenjivo.</translation> <translation id="9008201768610948239">Ignoriši</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index 3b29cb6..6c03cfe3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Умањите</translation> <translation id="2230173723195178503">Веб-страница је учитана</translation> <translation id="2239626343334228536">Бришу се подаци прегледања...</translation> +<translation id="2242467532204595597">Користите Chrome сваки пут када додирнете линкове у порукама, документима и другим апликацијама.</translation> <translation id="22508856139286506">Одбачена упозорења (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Мени → Историја</translation> <translation id="2256933947031277845">Организација вам дозвољава да се пријавите само помоћу одређених налога.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} сачувана адреса је доступна изнад тастатуре.}one{{count} сачувана адреса је доступна изнад тастатуре.}few{{count} сачуване адресе су доступне изнад тастатуре.}other{{count} сачуваних адреса је доступно изнад тастатуре.}}</translation> <translation id="2421004566762153674">Блокира колачиће треће стране</translation> <translation id="2421044535038393232">Настави изменe</translation> +<translation id="2423077901494354337">Сада ћете искористити све предности Chrome-а на уређају.</translation> <translation id="2434405374328098816">Већ сте сачували лозинку за „<ph name="USERNAME" />“ на <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Прикажи лозинку</translation> <translation id="2451654228769116489">Закачи картицу</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Желите ли да започнете ново преузимање?</translation> <translation id="6347953390226388422">{count,plural, =1{Ова адреса ће бити избрисана са Google налога (<ph name="USER_EMAIL" />) и са овог уређаја.}one{Ове адресе ће бити избрисане са Google налога (<ph name="USER_EMAIL" />) и са овог уређаја.}few{Ове адресе ће бити избрисане са Google налога (<ph name="USER_EMAIL" />) и са овог уређаја.}other{Ове адресе ће бити избрисане са Google налога (<ph name="USER_EMAIL" />) и са овог уређаја.}}</translation> <translation id="634878792104344809">Синхронизујте, лозинке, историју и друго на свим уређајима</translation> +<translation id="6348855835728304880">Приступајте Chrome лозинкама и осталим функцијама у другим апликацијама на овом уређају.</translation> <translation id="6355820205320395730">Слабе лозинке лако могу да се погоде. Обавезно направите јаке лозинке. <ph name="BEGIN_LINK" />Погледајте још савета за безбедност.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Пратите <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Нема картица без архивирања</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Истражите нове функције и савете у одељку Шта је ново</translation> <translation id="7223102419539744003">Затвори картицу</translation> <translation id="722454870747268814">Нова картица без архивирањa</translation> +<translation id="723787869754590019">Користите Chrome за аутоматско попуњавање</translation> <translation id="7265758999917665941">Никада за овај сајт</translation> <translation id="7272437679830969316">Верификација идентитета није успела. Лозинка није копирана.</translation> <translation id="7291368939935408496">Припремају се лозинке...</translation> @@ -1025,6 +1029,7 @@ <translation id="7781011649027948662">Желите да преведете страницу?</translation> <translation id="7781069478569868053">Страница нове картице</translation> <translation id="7781829728241885113">Јуче</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{После 1 дана}one{После {COUNT} дана}few{После {COUNT} дана}other{После {COUNT} дана}}</translation> <translation id="778855399387580014">Започните претрагу на новој Chrome картици.</translation> <translation id="7791543448312431591">Додај</translation> <translation id="7807060072011926525">Пружа Google</translation> @@ -1154,12 +1159,14 @@ <translation id="8663764600409216912">Користите лозинке које тешко могу да се погоде</translation> <translation id="8668210798914567634">Ова страница је сачувана на Листи за читање.</translation> <translation id="8680787084697685621">Детаљи за пријављивање на налог су застарели.</translation> +<translation id="868773710103052534">Спремни сте</translation> <translation id="8693663554456874301">{count,plural, =1{Затвори картицу}one{Затвори картице}few{Затвори картице}other{Затвори картице}}</translation> <translation id="8703536910991780768">Изгледа да су лозинке јаке</translation> <translation id="8706588385081740091">Лозинке</translation> <translation id="8717864919010420084">Копирај линк</translation> <translation id="8721297211384281569">Мени Алатке</translation> <translation id="8725066075913043281">Пробајте поново</translation> +<translation id="8727043961453758442">Искористите све предности Chrome-а</translation> <translation id="8730621377337864115">Готово</translation> <translation id="8731388423028622182">Одјављени сте са налога <ph name="USER_NAME" /> у склопу ресетовања iPhone-а. Додирните Настави у наставку да бисте се пријавили.</translation> <translation id="87371078663613140">Истражите опције на траци менија</translation> @@ -1209,6 +1216,7 @@ <translation id="8978059030508051916">{count,plural, =0{Нема угрожених лозинки}=1{{count} угрожена лозинка}one{{count} угрожена лозинка}few{{count} угрожене лозинке}other{{count} угрожених лозинки}}</translation> <translation id="8981454092730389528">Google контроле активности</translation> <translation id="8985320356172329008">Пријављени сте на Google као</translation> +<translation id="8986567980592931173">Пријавите се помоћу Google налога да бисте синхронизовали лозинке, историју и друго.</translation> <translation id="8998289560386111590">Није доступно на вашем уређају</translation> <translation id="9000089900434778519">Ваш претраживач је <ph name="DSE_NAME" />. Погледајте упутства тог претраживача за брисање историје претраге ако је то примењиво.</translation> <translation id="9008201768610948239">Игнориши</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 4aa942e..b773091 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">Ungependa Kutafsiri Ukurasa?</translation> <translation id="7781069478569868053">Ukurasa wa Kichupo Kipya</translation> <translation id="7781829728241885113">Jana</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{Baada ya Siku 1}other{Baada ya Siku {COUNT}}}</translation> <translation id="778855399387580014">Anza kutafuta ukitumia kichupo kipya cha Chrome.</translation> <translation id="7791543448312431591">Ongeza</translation> <translation id="7807060072011926525">Imetolewa na Google</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 051123e..8a5e97d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">பக்கத்தை மொழிபெயர்க்கவா?</translation> <translation id="7781069478569868053">புதிய தாவல் பக்கம்</translation> <translation id="7781829728241885113">நேற்று</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 நாளுக்குப் பிறகு}other{{COUNT} நாட்களுக்குப் பிறகு}}</translation> <translation id="778855399387580014">புதிய Chrome தாவலில் தேடலைத் தொடங்கும்.</translation> <translation id="7791543448312431591">சேர்</translation> <translation id="7807060072011926525">Google வழங்கியது</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Chrome, Google Lens ஆகியவற்றில் இருந்து உங்கள் Apple Calendarரில் நிகழ்வுகளை உருவாக்க இது பயன்படுத்தப்படும்.</translation> <translation id="8156478151976189188">கடவுச்சொல்லை ஒத்திசைக்க முடியவில்லை</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> கணக்குகள்</translation> +<translation id="8159358225423560600">சற்றுமுன்</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />உங்கள் சாதனங்கள்<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">பக்கத்தை மொழிபெயர்</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> நாட்களாகப் பயன்படுத்தப்படாத பக்கங்கள்</translation> <translation id="8407669440184693619">இந்தத் தளத்திற்கான கடவுச்சொற்கள் எதுவும் இல்லை</translation> <translation id="842017693807136194">இதன் மூலம் உள்நுழைந்துள்ளீர்கள்:</translation> +<translation id="8423121072346537366">சற்றுமுன்</translation> <translation id="8425693829365242963">உங்கள் கடவுச்சொற்கள் தனித்துவமானவை</translation> <translation id="8428045167754449968">மாநகரம் / நகரம்</translation> <translation id="8428213095426709021">அமைப்புகள்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index 4bc4b36..98eebc4e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -1090,6 +1090,7 @@ <translation id="8136856065410661948">Chrome, Google Lens నుండి మీ Apple క్యాలెండర్లో ఈవెంట్లను క్రియేట్ చేయడానికి ఇది ఉపయోగించబడుతుంది.</translation> <translation id="8156478151976189188">పాస్వర్డ్ సింక్ పనిచేయడం లేదు</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> ఖాతాలు</translation> +<translation id="8159358225423560600">ఇప్పుడే</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />మీ పరికరాలు<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">పేజీని అనువదించు</translation> @@ -1120,6 +1121,7 @@ <translation id="8393889347136007944">ట్యాబ్లు <ph name="THRESHOLD" /> రోజుల పాటు ఉపయోగించబడలేదు</translation> <translation id="8407669440184693619">ఈ సైట్ కోసం పాస్వర్డ్లు కనుగొనబడలేదు</translation> <translation id="842017693807136194">దీనితో సైన్ ఇన్ చేయబడింది</translation> +<translation id="8423121072346537366">ఇప్పుడే</translation> <translation id="8425693829365242963">మీ పాస్వర్డ్లు భిన్నంగా ఉన్నాయి</translation> <translation id="8428045167754449968">నగరం / పట్టణం</translation> <translation id="8428213095426709021">సెట్టింగ్లు</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index a3cf3e8b..335d87a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -1025,6 +1025,7 @@ <translation id="7781011649027948662">Sayfa Çevrilsin mi?</translation> <translation id="7781069478569868053">Yeni Sekme Sayfası</translation> <translation id="7781829728241885113">Dün</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 Gün Sonra}other{{COUNT} Gün Sonra}}</translation> <translation id="778855399387580014">Yeni bir Chrome sekmesinde arama başlatır.</translation> <translation id="7791543448312431591">Ekle</translation> <translation id="7807060072011926525">Google tarafından sağlanır</translation> @@ -1089,6 +1090,7 @@ <translation id="8136856065410661948">Bu bilgiler, Chrome ve Google Lens'ten alınan etkinlikleri Apple Takvim'de oluşturmak için kullanılır.</translation> <translation id="8156478151976189188">Şifre Senkronizasyonu Çalışmıyor</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> hesap</translation> +<translation id="8159358225423560600">az önce</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Cihazlarınız<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Sayfayı Çevir</translation> @@ -1119,6 +1121,7 @@ <translation id="8393889347136007944">Sekmeler <ph name="THRESHOLD" /> gün boyunca kullanılmıyor</translation> <translation id="8407669440184693619">Bu site için şifre bulunamadı</translation> <translation id="842017693807136194">Şununla Oturum Açıldı:</translation> +<translation id="8423121072346537366">Az Önce</translation> <translation id="8425693829365242963">Şifreleriniz benzersiz</translation> <translation id="8428045167754449968">İl / İlçe</translation> <translation id="8428213095426709021">Ayarlar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 3fac43f..c2850308 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -1089,6 +1089,7 @@ <translation id="8136856065410661948">Ці дані використовуватимуться, щоб створювати події в Календарі Apple на основі даних у Chrome і Google Об’єктиві.</translation> <translation id="8156478151976189188">Синхронізація паролів не працює</translation> <translation id="8157532349231307196">Облікових записів: <ph name="NUMBER_OF_ACCOUNTS" /></translation> +<translation id="8159358225423560600">щойно</translation> <translation id="8179976553408161302">Enter</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />Ваші пристрої<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">Перекласти сторінку</translation> @@ -1119,6 +1120,7 @@ <translation id="8393889347136007944">Вкладки, які не використовуються протягом <ph name="THRESHOLD" /> дн.</translation> <translation id="8407669440184693619">Немає паролів для цього сайту</translation> <translation id="842017693807136194">Ви ввійшли як</translation> +<translation id="8423121072346537366">Щойно</translation> <translation id="8425693829365242963">Ваші паролі унікальні</translation> <translation id="8428045167754449968">Місто</translation> <translation id="8428213095426709021">Налаштування</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index d0a4ae1..0b72ed1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -1024,6 +1024,7 @@ <translation id="7781011649027948662">صفحہ کا ترجمہ کریں؟</translation> <translation id="7781069478569868053">نئے ٹیب کا صفحہ</translation> <translation id="7781829728241885113">گزشتہ کل</translation> +<translation id="7786246662347093005">{COUNT,plural, =1{1 دن کے بعد}other{{COUNT} دن کے بعد}}</translation> <translation id="778855399387580014">نئے Chrome ٹیب میں تلاش شروع کریں۔</translation> <translation id="7791543448312431591">شامل کریں</translation> <translation id="7807060072011926525">Google کے ذریعے فراہم کردہ</translation> @@ -1088,6 +1089,7 @@ <translation id="8136856065410661948">اس کا استعمال Chrome اور Google لینز سے آپ کے Apple کیلنڈر میں ایونٹس تخلیق کرنے کے لیے کیا جائے گا۔</translation> <translation id="8156478151976189188">پاس ورڈ کی مطابقت پذیری کام نہیں کر رہی ہے</translation> <translation id="8157532349231307196"><ph name="NUMBER_OF_ACCOUNTS" /> اکاؤنٹس</translation> +<translation id="8159358225423560600">ابھی ابھی</translation> <translation id="8179976553408161302">انٹر</translation> <translation id="8193953846147532858"><ph name="BEGIN_LINK" />آپ کے آلات<ph name="END_LINK" /> · <ph name="EMAIL" /></translation> <translation id="8197543752516192074">صفحہ کا ترجمہ کریں</translation> @@ -1118,6 +1120,7 @@ <translation id="8393889347136007944"><ph name="THRESHOLD" /> دن تک ٹیبز کا استعمال نہیں کیا گیا</translation> <translation id="8407669440184693619">اس سائٹ کے لیے کوئی پاس ورڈ نہیں ملا</translation> <translation id="842017693807136194">سائن ان کردہ بذریعہ</translation> +<translation id="8423121072346537366">ابھی ابھی</translation> <translation id="8425693829365242963">آپ کے پاس ورڈز منفرد ہیں</translation> <translation id="8428045167754449968">شہر / قصبہ</translation> <translation id="8428213095426709021">ترتیبات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 4ff41882..a2cf7f197 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Uzoqlashtirish</translation> <translation id="2230173723195178503">Veb-sahifa yuklandi</translation> <translation id="2239626343334228536">Brauzer tarixini tozalash...</translation> +<translation id="2242467532204595597">Xabarlar, hujjatlar va boshqa ilovalardagi havolalarni bosganda Chrome ochiladi.</translation> <translation id="22508856139286506">Yopilgan ogohlantirishlar (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Menyu → Tarix</translation> <translation id="2256933947031277845">Tashkilotingiz faqat ayrim hisoblardan kirishga ruxsat beradi.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{{count} ta saqlangan manzil klaviatura ustida chiqadi.}other{{count} ta saqlangan manzil klaviatura ustida chiqadi.}}</translation> <translation id="2421004566762153674">Tashqi cookie fayllarni bloklash</translation> <translation id="2421044535038393232">Tahrirlashda davom etish</translation> +<translation id="2423077901494354337">Endi qurilmangizda Chromedan unumli foydalanasiz.</translation> <translation id="2434405374328098816"><ph name="WEBSITE" /> saytidagi <ph name="USERNAME" /> paroli allaqachon saqlangan</translation> <translation id="2435457462613246316">Parolni ko‘rsatish</translation> <translation id="2451654228769116489">Varaqni mahkamlash</translation> @@ -611,6 +613,7 @@ <translation id="5118764316110575523">Oʻchiq</translation> <translation id="5119391094379141756">Chrome brauzerini tanlang</translation> <translation id="5121618895923301719">Siz bu mahsulotni kuzatyapsiz. Bu sahifa <ph name="BEGIN_LINK" />Mobil bukmarklarga<ph name="END_LINK" /> saqlandi.</translation> +<translation id="5126465625664020024">Kiring va sinxronlang</translation> <translation id="5132942445612118989">Parollar, tarix va boshqa sozlamalaringizni barcha qurilmalaringizda sinxronlang</translation> <translation id="5142890110117755815">{COUNT,plural, =1{{COUNT} ta kuchsiz parol aniqlandi}other{{COUNT} ta kuchsiz parol aniqlandi}}</translation> <translation id="5149188072385105201">Parol kiritish...</translation> @@ -801,6 +804,7 @@ <translation id="6346549652287021269">Yangi yuklab olish jarayoni boshlansinmi?</translation> <translation id="6347953390226388422">{count,plural, =1{Google hisobingiz (<ph name="USER_EMAIL" />) va bu qurilmadan quyidagi manzil oʻchirib tashlanadi.}other{Google hisobingiz (<ph name="USER_EMAIL" />) va bu qurilmadan quyidagi manzillar oʻchirib tashlanadi.}}</translation> <translation id="634878792104344809">Tarix va parollaringizni barcha qurilmalaringizda sinxronlang</translation> +<translation id="6348855835728304880">Bu qurilmadagi boshqa ilovalarda Chrome parollaringiz va boshqalarga kiring.</translation> <translation id="6355820205320395730">Kuchsiz parollar oson topiladi. Kuchli parol yarating. <ph name="BEGIN_LINK" />Xavfsizlikka oid boshqa maslahatlar bilan tanishing.<ph name="END_LINK" /></translation> <translation id="6361848730467328243"><ph name="DOMAIN_NAME" /> saytini kuzatish</translation> <translation id="6362362396625799311">Hech qanday inkognito sahifa yo‘q</translation> @@ -953,6 +957,7 @@ <translation id="7221173315674413369">Nima yangiliklar ruknida yangi funksiyalar va maslahatlar bilan tanishing</translation> <translation id="7223102419539744003">Varaqni yopish</translation> <translation id="722454870747268814">Yangi Inkognito varaq</translation> +<translation id="723787869754590019">Avtomatik kiritish uchun Chrome ishlatish</translation> <translation id="7265758999917665941">Bu saytda hech qachon</translation> <translation id="7272437679830969316">Shaxsingiz tasdiqlanmadi. Paroldan nusxa olinmadi.</translation> <translation id="7291368939935408496">Parollar tayyorlanmoqda...</translation> @@ -1151,12 +1156,14 @@ <translation id="8663764600409216912">Parollaringiz ishonchli darajada</translation> <translation id="8668210798914567634">Bu sahifa mutolaa ro‘yxatingizga saqlandi.</translation> <translation id="8680787084697685621">Hisob haqidagi ma’lumotlar eskirgan.</translation> +<translation id="868773710103052534">Hammasi tayyor</translation> <translation id="8693663554456874301">{count,plural, =1{Varaqni yopish}other{Varaqlarni yopish}}</translation> <translation id="8703536910991780768">Parollaringiz ishonchli darajada</translation> <translation id="8706588385081740091">Parollar</translation> <translation id="8717864919010420084">Havolani nusxalash</translation> <translation id="8721297211384281569">“Vositalar” menyusi</translation> <translation id="8725066075913043281">Qayta urinib ko‘ring</translation> +<translation id="8727043961453758442">Chromedan unumli foydalaning</translation> <translation id="8730621377337864115">Tayyor</translation> <translation id="8731388423028622182">iPhone qurilmasini tiklash mobaynida <ph name="USER_NAME" /> hisobingizdan chiqarildingiz. Hisobga kirish uchun quyida davom etish ustiga bosing.</translation> <translation id="87371078663613140">Menyu paneli bandlari bilan tanishing</translation> @@ -1206,6 +1213,7 @@ <translation id="8978059030508051916">{count,plural, =0{Hech qaysi parolingiz oshkor etilmagan}=1{{count} ta parol oshkor etilgan}other{{count} ta parol oshkor etilgan}}</translation> <translation id="8981454092730389528">Google hisobidagi harakatlarni kuzatish</translation> <translation id="8985320356172329008">Siz bu hisobdan kirgansiz</translation> +<translation id="8986567980592931173">Parollar, tarix va boshqalarni sinxronlash uchun Google hisobingizga kiring.</translation> <translation id="8998289560386111590">Qurilmangizda ishlamaydi.</translation> <translation id="9000089900434778519">Qidiruv tizimingiz: <ph name="DSE_NAME" />. Imkon boʻlsa, qidiruv tarixini qanday tozalash haqidagi koʻrsatmalarni oching.</translation> <translation id="9008201768610948239">Tashlab ketish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index 646eb59..0d0fdcd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -178,6 +178,7 @@ <translation id="2218443599109088993">Thu nhỏ</translation> <translation id="2230173723195178503">Đã tải trang web</translation> <translation id="2239626343334228536">Đang xóa dữ liệu duyệt web...</translation> +<translation id="2242467532204595597">Dùng Chrome bất cứ lúc nào bạn nhấn vào đường liên kết trong thư/tin nhắn, tài liệu và các ứng dụng khác.</translation> <translation id="22508856139286506">Cảnh báo đã đóng (<ph name="COUNT" />)</translation> <translation id="2251686759395008410">Trình đơn → Nhật ký</translation> <translation id="2256933947031277845">Tổ chức của bạn chỉ cho phép bạn đăng nhập bằng một số tài khoản nhất định.</translation> @@ -206,6 +207,7 @@ <translation id="2411749908844615428">{count,plural, =1{Có {count} địa chỉ đã lưu xuất hiện phía trên bàn phím.}other{Có {count} địa chỉ đã lưu xuất hiện phía trên bàn phím.}}</translation> <translation id="2421004566762153674">Chặn cookie của bên thứ ba</translation> <translation id="2421044535038393232">Tiếp tục chỉnh sửa</translation> +<translation id="2423077901494354337">Giờ đây, bạn có thể khai thác tối đa Chrome trên thiết bị của mình.</translation> <translation id="2434405374328098816">Bạn đã lưu mật khẩu cho "<ph name="USERNAME" />" tại <ph name="WEBSITE" /></translation> <translation id="2435457462613246316">Hiện mật khẩu</translation> <translation id="2451654228769116489">Ghim thẻ</translation> @@ -802,6 +804,7 @@ <translation id="6346549652287021269">Bắt đầu lượt tải xuống mới?</translation> <translation id="6347953390226388422">{count,plural, =1{Địa chỉ này sẽ bị xoá khỏi Tài khoản Google của bạn (<ph name="USER_EMAIL" />) và khỏi thiết bị này.}other{Các địa chỉ này sẽ bị xoá khỏi Tài khoản Google của bạn (<ph name="USER_EMAIL" />) và khỏi thiết bị này.}}</translation> <translation id="634878792104344809">Đồng bộ hóa mật khẩu, danh sách trang web đã truy cập và nhiều nội dung khác trên mọi thiết bị của bạn</translation> +<translation id="6348855835728304880">Dùng mật khẩu và các dữ liệu khác mà bạn lưu trên Chrome trong các ứng dụng khác trên thiết bị này.</translation> <translation id="6355820205320395730">Mật khẩu yếu thường dễ đoán. Hãy nhớ tạo mật khẩu mạnh. <ph name="BEGIN_LINK" />Xem các mẹo bảo mật khác.<ph name="END_LINK" /></translation> <translation id="6361848730467328243">Theo dõi <ph name="DOMAIN_NAME" /></translation> <translation id="6362362396625799311">Không có thẻ ẩn danh nào</translation> @@ -954,6 +957,7 @@ <translation id="7221173315674413369">Khám phá các mẹo và tính năng mới trong phần Tính năng mới</translation> <translation id="7223102419539744003">Đóng thẻ</translation> <translation id="722454870747268814">Thẻ ẩn danh mới</translation> +<translation id="723787869754590019">Dùng Chrome để tự động điền</translation> <translation id="7265758999917665941">Không bao giờ đối với trang web này</translation> <translation id="7272437679830969316">Không thể xác minh danh tính của bạn. Chưa sao chép mật khẩu.</translation> <translation id="7291368939935408496">Đang chuẩn bị mật khẩu...</translation> @@ -1152,12 +1156,14 @@ <translation id="8663764600409216912">Bạn đang sử dụng các mật khẩu khá khó đoán</translation> <translation id="8668210798914567634">Trang này đã được lưu vào danh sách đọc của bạn.</translation> <translation id="8680787084697685621">Chi tiết đăng nhập tài khoản đã lỗi thời.</translation> +<translation id="868773710103052534">Quy trình thiết lập đã hoàn tất</translation> <translation id="8693663554456874301">{count,plural, =1{Đóng thẻ}other{Đóng các thẻ}}</translation> <translation id="8703536910991780768">Mật khẩu của bạn có vẻ mạnh</translation> <translation id="8706588385081740091">Mật khẩu</translation> <translation id="8717864919010420084">Sao chép đường liên kết</translation> <translation id="8721297211384281569">Menu công cụ</translation> <translation id="8725066075913043281">Thử lại</translation> +<translation id="8727043961453758442">Khai thác tối đa Chrome</translation> <translation id="8730621377337864115">Xong</translation> <translation id="8731388423028622182">Bạn đã bị đăng xuất khỏi tài khoản <ph name="USER_NAME" /> trong quá trình đặt lại iPhone. Nhấn vào Tiếp tục bên dưới để đăng nhập.</translation> <translation id="87371078663613140">Khám phá các tuỳ chọn trong thanh trình đơn</translation> @@ -1207,6 +1213,7 @@ <translation id="8978059030508051916">{count,plural, =0{Không có mật khẩu nào bị lộ}=1{{count} mật khẩu bị lộ}other{{count} mật khẩu bị lộ}}</translation> <translation id="8981454092730389528">Kiểm soát hoạt động trên Google</translation> <translation id="8985320356172329008">Đã đăng nhập vào Google bằng</translation> +<translation id="8986567980592931173">Đăng nhập bằng Tài khoản Google để đồng bộ hoá mật khẩu, nhật ký hoạt động và nhiều nội dung khác.</translation> <translation id="8998289560386111590">Không hoạt động trên thiết bị của bạn</translation> <translation id="9000089900434778519">Bạn đang dùng công cụ tìm kiếm <ph name="DSE_NAME" />. Để xóa nhật ký tìm kiếm, hãy xem hướng dẫn (nếu có) của công cụ tìm kiếm đó.</translation> <translation id="9008201768610948239">Bỏ qua</translation>
diff --git a/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.h b/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.h index 833e51a..45aeae3 100644 --- a/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.h +++ b/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.h
@@ -40,7 +40,8 @@ IOSChromeScopedTestingLocalState local_state_; std::unique_ptr<Browser> browser_; std::unique_ptr<TestChromeBrowserState> chrome_browser_state_; - bookmarks::BookmarkModel* bookmark_model_; + // Bookmark model for the profile storage. + bookmarks::BookmarkModel* profile_bookmark_model_; bookmarks::ManagedBookmarkService* managed_bookmark_service_; };
diff --git a/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.mm b/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.mm index 404bc16..8569096 100644 --- a/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.mm +++ b/ios/chrome/browser/bookmarks/bookmark_ios_unit_test_support.mm
@@ -43,10 +43,10 @@ chrome_browser_state_.get(), std::make_unique<FakeAuthenticationServiceDelegate>()); - bookmark_model_ = + profile_bookmark_model_ = ios::LocalOrSyncableBookmarkModelFactory::GetForBrowserState( chrome_browser_state_.get()); - bookmarks::test::WaitForBookmarkModelToLoad(bookmark_model_); + bookmarks::test::WaitForBookmarkModelToLoad(profile_bookmark_model_); browser_ = std::make_unique<TestBrowser>(chrome_browser_state_.get()); } @@ -55,20 +55,21 @@ NSString* title) { std::u16string c_title = base::SysNSStringToUTF16(title); GURL url(base::SysNSStringToUTF16(@"http://example.com/bookmark") + c_title); - return bookmark_model_->AddURL(parent, parent->children().size(), c_title, - url); + return profile_bookmark_model_->AddURL(parent, parent->children().size(), + c_title, url); } const BookmarkNode* BookmarkIOSUnitTestSupport::AddFolder( const BookmarkNode* parent, NSString* title) { std::u16string c_title = base::SysNSStringToUTF16(title); - return bookmark_model_->AddFolder(parent, parent->children().size(), c_title); + return profile_bookmark_model_->AddFolder(parent, parent->children().size(), + c_title); } void BookmarkIOSUnitTestSupport::ChangeTitle(NSString* title, const BookmarkNode* node) { std::u16string c_title = base::SysNSStringToUTF16(title); - bookmark_model_->SetTitle(node, c_title, - bookmarks::metrics::BookmarkEditSource::kUser); + profile_bookmark_model_->SetTitle( + node, c_title, bookmarks::metrics::BookmarkEditSource::kUser); }
diff --git a/ios/chrome/browser/bookmarks/bookmark_model_bridge_observer_unittest.mm b/ios/chrome/browser/bookmarks/bookmark_model_bridge_observer_unittest.mm index 5812c12..df4fe51 100644 --- a/ios/chrome/browser/bookmarks/bookmark_model_bridge_observer_unittest.mm +++ b/ios/chrome/browser/bookmarks/bookmark_model_bridge_observer_unittest.mm
@@ -113,16 +113,16 @@ TEST_F(BookmarkModelBridgeObserverTest, NotifyBookmarkNodeChildrenChangedDespiteSelfDestruction) { @autoreleasepool { - const BookmarkNode* mobile_node = bookmark_model_->mobile_node(); + const BookmarkNode* mobile_node = profile_bookmark_model_->mobile_node(); const BookmarkNode* folder = AddFolder(mobile_node, @"title"); TestBookmarkModelBridgeOwner* owner = [[TestBookmarkModelBridgeOwner alloc] - initWithModel:bookmark_model_ + initWithModel:profile_bookmark_model_ observer:[[TestBookmarkModelBridgeObserver alloc] init]]; // Deleting the folder should not cause a crash. - bookmark_model_->Remove(folder, - bookmarks::metrics::BookmarkEditSource::kOther); + profile_bookmark_model_->Remove( + folder, bookmarks::metrics::BookmarkEditSource::kOther); EXPECT_TRUE([owner bookmarkNodeDeletedCalled]); }
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state.h b/ios/chrome/browser/browser_state/chrome_browser_state.h index a60ba0452..0c3ae85 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state.h
@@ -8,7 +8,6 @@ #include <map> #include <string> -#include "base/compiler_specific.h" #include "base/functional/callback_forward.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm index 87814e4..3cfb63f 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm +++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
@@ -11,7 +11,6 @@ #import "base/check_op.h" #import "base/command_line.h" -#import "base/compiler_specific.h" #import "base/containers/contains.h" #import "base/debug/alias.h" #import "base/functional/bind.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_manager.h b/ios/chrome/browser/browser_state/chrome_browser_state_manager.h index 7197e4f..8ce3ceb 100644 --- a/ios/chrome/browser/browser_state/chrome_browser_state_manager.h +++ b/ios/chrome/browser/browser_state/chrome_browser_state_manager.h
@@ -7,8 +7,6 @@ #include <vector> -#include "base/compiler_specific.h" - namespace base { class FilePath; }
diff --git a/ios/chrome/browser/feature_engagement/BUILD.gn b/ios/chrome/browser/feature_engagement/BUILD.gn index e10fe90..389a1d2 100644 --- a/ios/chrome/browser/feature_engagement/BUILD.gn +++ b/ios/chrome/browser/feature_engagement/BUILD.gn
@@ -44,6 +44,7 @@ "//ios/chrome/browser/shared/ui/table_view:constants", "//ios/chrome/browser/tabs:features", "//ios/chrome/browser/ui/popup_menu:constants", + "//ios/chrome/test:eg_test_support+eg2", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//net:test_support",
diff --git a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm index b50e1ca..a302cb55 100644 --- a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm +++ b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" +#import "ios/chrome/test/scoped_eg_synchronization_disabler.h" #import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" #import "net/base/mac/url_conversions.h" @@ -221,18 +222,25 @@ // app starts up. [[self class] testForStartup]; - [self enableDemoModeForFeature:"IPH_BottomToolbarTip"]; + // Scope for the synchronization disabled. + { + ScopedSynchronizationDisabler syncDisabler; - // Verify that the Bottom toolbar Tip appeared. - ConditionBlock condition = ^{ - NSError* error = nil; - [[EarlGrey selectElementWithMatcher:BottomToolbarTipBubble()] - assertWithMatcher:grey_sufficientlyVisible() - error:&error]; - return error == nil; - }; - GREYAssert(WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, condition), - @"Waiting for the Bottom Toolbar tip to appear"); + [self enableDemoModeForFeature:"IPH_BottomToolbarTip"]; + + // Verify that the Bottom toolbar Tip appeared. + ConditionBlock condition = ^{ + NSError* error = nil; + [[EarlGrey selectElementWithMatcher:BottomToolbarTipBubble()] + assertWithMatcher:grey_sufficientlyVisible() + error:&error]; + return error == nil; + }; + // The app relaunch (to enable a feature flag) may take a while, therefore + // the timeout is extended to 15 seconds. + GREYAssert(WaitUntilConditionOrTimeout(base::Seconds(15), condition), + @"Waiting for the Bottom Toolbar tip to appear"); + } // End of the sync disabler scope. } // Verifies that the bottom toolbar tip is not displayed when the phone is not
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index f18d84f1..63e46891 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1547,6 +1547,9 @@ flag_descriptions::kOnlyAccessClipboardAsyncName, flag_descriptions::kOnlyAccessClipboardAsyncDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kOnlyAccessClipboardAsync)}, + {"omnibox-tail-suggest", flag_descriptions::kOmniboxTailSuggestName, + flag_descriptions::kOmniboxTailSuggestDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kOmniboxTailSuggest)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index f65d13f4..62a386a 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -783,6 +783,11 @@ "Enables reporting the serialized Searchbox Stats proto param in search " "destination URLs originated from the Omnibox."; +const char kOmniboxTailSuggestName[] = "Omnibox Tail suggestions"; +const char kOmniboxTailSuggestDescription[] = + "Enables tail search suggestions. Search suggestions only matching the end " + "of users input text."; + const char kOmniboxZeroSuggestInMemoryCachingName[] = "Omnibox Zero Prefix Suggestion in-memory caching"; const char kOmniboxZeroSuggestInMemoryCachingDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 843350048..740ae629 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -681,6 +681,10 @@ extern const char kOmniboxReportSearchboxStatsName[]; extern const char kOmniboxReportSearchboxStatsDescription[]; +// Title and description for tail suggestions in the omnibox. +extern const char kOmniboxTailSuggestName[]; +extern const char kOmniboxTailSuggestDescription[]; + // Title and description for the flag to change the max number of autocomplete // matches in the omnibox popup. extern const char kOmniboxUIMaxAutocompleteMatchesName[];
diff --git a/ios/chrome/browser/main/BUILD.gn b/ios/chrome/browser/main/BUILD.gn index 2956dc6..d4a7d657 100644 --- a/ios/chrome/browser/main/BUILD.gn +++ b/ios/chrome/browser/main/BUILD.gn
@@ -71,6 +71,7 @@ "//ios/chrome/browser/url_loading", "//ios/chrome/browser/web", "//ios/chrome/browser/web:delegate", + "//ios/chrome/browser/web:page_placeholder", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:agents", "//ios/chrome/browser/web_state_list:session_metrics",
diff --git a/ios/chrome/browser/main/browser_agent_util.mm b/ios/chrome/browser/main/browser_agent_util.mm index 621fdb8..7e76425 100644 --- a/ios/chrome/browser/main/browser_agent_util.mm +++ b/ios/chrome/browser/main/browser_agent_util.mm
@@ -30,6 +30,7 @@ #import "ios/chrome/browser/upgrade/upgrade_center_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" #import "ios/chrome/browser/web/web_navigation_browser_agent.h" #import "ios/chrome/browser/web/web_state_delegate_browser_agent.h" #import "ios/chrome/browser/web/web_state_update_browser_agent.h" @@ -112,9 +113,10 @@ UpgradeCenterBrowserAgent::CreateForBrowser(browser, [UpgradeCenter sharedInstance]); + WebStateUpdateBrowserAgent::CreateForBrowser(browser); + PagePlaceholderBrowserAgent::CreateForBrowser(browser); + // This needs to be called last in case any downstream browser agents need to // access upstream agents created earlier in this function. ios::provider::AttachBrowserAgents(browser); - - WebStateUpdateBrowserAgent::CreateForBrowser(browser); }
diff --git a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc index 6b1d88e..9ba186b 100644 --- a/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc +++ b/ios/chrome/browser/net/ios_chrome_url_request_context_getter.cc
@@ -4,7 +4,6 @@ #include "ios/chrome/browser/net/ios_chrome_url_request_context_getter.h" -#include "base/compiler_specific.h" #include "base/functional/bind.h" #include "base/task/single_thread_task_runner.h" #include "ios/chrome/browser/browser_state/chrome_browser_state_io_data.h"
diff --git a/ios/chrome/browser/policy/device_management_service_configuration_ios.h b/ios/chrome/browser/policy/device_management_service_configuration_ios.h index f35eb992..e2af210 100644 --- a/ios/chrome/browser/policy/device_management_service_configuration_ios.h +++ b/ios/chrome/browser/policy/device_management_service_configuration_ios.h
@@ -7,7 +7,6 @@ #include <string> -#include "base/compiler_specific.h" #include "components/policy/core/common/cloud/device_management_service.h" namespace policy {
diff --git a/ios/chrome/browser/sessions/BUILD.gn b/ios/chrome/browser/sessions/BUILD.gn index 74f0c39..c7fb4de6 100644 --- a/ios/chrome/browser/sessions/BUILD.gn +++ b/ios/chrome/browser/sessions/BUILD.gn
@@ -138,10 +138,10 @@ ":restoration_agent", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/main:public", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/snapshots", "//ios/chrome/browser/tabs/inactive_tabs:features", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list/web_usage_enabler", ]
diff --git a/ios/chrome/browser/sessions/session_saving_scene_agent.h b/ios/chrome/browser/sessions/session_saving_scene_agent.h index fb93f99..2f280479 100644 --- a/ios/chrome/browser/sessions/session_saving_scene_agent.h +++ b/ios/chrome/browser/sessions/session_saving_scene_agent.h
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @interface SessionSavingSceneAgent : ObservingSceneAgent
diff --git a/ios/chrome/browser/shared/coordinator/alert/repost_form_coordinator.mm b/ios/chrome/browser/shared/coordinator/alert/repost_form_coordinator.mm index 6a68aafb..ba2a2fa5 100644 --- a/ios/chrome/browser/shared/coordinator/alert/repost_form_coordinator.mm +++ b/ios/chrome/browser/shared/coordinator/alert/repost_form_coordinator.mm
@@ -7,6 +7,8 @@ #import "base/check.h" #import "base/memory/weak_ptr.h" #import "base/notreached.h" +#import "base/strings/sys_string_conversions.h" + #import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/main/browser.h" @@ -96,7 +98,15 @@ // 400 milliseconds const int64_t kDelayBetweenAttemptsNanoSecs = 0.4 * NSEC_PER_SEC; if (_repostAttemptCount >= kMaximumNumberAttempts) { - NOTREACHED(); + if (!self.baseViewController.view.window) { + NOTREACHED() << "no window is found"; + } else { + UIViewController* presented = + self.baseViewController.presentedViewController; + NOTREACHED() << "presenting view controller " + << base::SysNSStringToUTF8( + NSStringFromClass([presented class])); + } [self stop]; return; }
diff --git a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn index ab728a4..bcbd057a 100644 --- a/ios/chrome/browser/shared/coordinator/scene/BUILD.gn +++ b/ios/chrome/browser/shared/coordinator/scene/BUILD.gn
@@ -9,6 +9,22 @@ frameworks = [ "UIKit.framework" ] } +source_set("observing_scene_agent") { + configs += [ "//build/config/compiler:enable_arc" ] + + sources = [ + "observing_scene_state_agent.h", + "observing_scene_state_agent.mm", + ] + + frameworks = [ "UIKit.framework" ] + + public_deps = [ + "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_observer", + ] +} + source_set("scene_state_header") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -139,6 +155,7 @@ "//ios/chrome/browser/url", "//ios/chrome/browser/url:constants", "//ios/chrome/browser/url_loading", + "//ios/chrome/browser/web:page_placeholder", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:agents", "//ios/chrome/browser/web_state_list:session_metrics",
diff --git a/ios/chrome/browser/ui/main/observing_scene_state_agent.h b/ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h similarity index 81% rename from ios/chrome/browser/ui/main/observing_scene_state_agent.h rename to ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h index 4a885187..e604316 100644 --- a/ios/chrome/browser/ui/main/observing_scene_state_agent.h +++ b/ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.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 IOS_CHROME_BROWSER_UI_MAIN_OBSERVING_SCENE_STATE_AGENT_H_ -#define IOS_CHROME_BROWSER_UI_MAIN_OBSERVING_SCENE_STATE_AGENT_H_ +#ifndef IOS_CHROME_BROWSER_SHARED_COORDINATOR_SCENE_OBSERVING_SCENE_STATE_AGENT_H_ +#define IOS_CHROME_BROWSER_SHARED_COORDINATOR_SCENE_OBSERVING_SCENE_STATE_AGENT_H_ #import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" #import "ios/chrome/browser/shared/coordinator/scene/scene_state_observer.h" @@ -27,4 +27,4 @@ @end -#endif // IOS_CHROME_BROWSER_UI_MAIN_OBSERVING_SCENE_STATE_AGENT_H_ +#endif // IOS_CHROME_BROWSER_SHARED_COORDINATOR_SCENE_OBSERVING_SCENE_STATE_AGENT_H_
diff --git a/ios/chrome/browser/ui/main/observing_scene_state_agent.mm b/ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.mm similarity index 93% rename from ios/chrome/browser/ui/main/observing_scene_state_agent.mm rename to ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.mm index 430a060a..12fbdd7 100644 --- a/ios/chrome/browser/ui/main/observing_scene_state_agent.mm +++ b/ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.mm
@@ -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 "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm index d9335eaa..b3de660 100644 --- a/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm +++ b/ios/chrome/browser/shared/coordinator/scene/scene_controller.mm
@@ -140,6 +140,7 @@ #import "ios/chrome/browser/url_loading/scene_url_loading_service.h" #import "ios/chrome/browser/url_loading/url_loading_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" #import "ios/chrome/browser/web_state_list/session_metrics.h" #import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" @@ -2709,7 +2710,9 @@ } } else { if (!self.currentInterface.viewController.presentedViewController) { - [targetInterface.bvc expectNewForegroundTab]; + PagePlaceholderBrowserAgent* pagePlaceholderBrowserAgent = + PagePlaceholderBrowserAgent::FromBrowser(targetInterface.browser); + pagePlaceholderBrowserAgent->ExpectNewForegroundTab(); } [self setCurrentInterfaceForMode:targetMode]; [self openOrReuseTabInMode:targetMode @@ -2724,7 +2727,9 @@ ? self.interfaceProvider.incognitoInterface : self.interfaceProvider.mainInterface; DCHECK(interface); - [interface.bvc expectNewForegroundTab]; + PagePlaceholderBrowserAgent* pagePlaceholderBrowserAgent = + PagePlaceholderBrowserAgent::FromBrowser(interface.browser); + pagePlaceholderBrowserAgent->ExpectNewForegroundTab(); } - (void)openNewTabFromOriginPoint:(CGPoint)originPoint
diff --git a/ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h b/ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h index c9ad97a..f8943b9 100644 --- a/ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h +++ b/ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h
@@ -7,7 +7,6 @@ #import <UIKit/UIKit.h> -#include "base/compiler_specific.h" #import "base/ios/block_types.h" #import "ios/chrome/test/block_cleanup_test.h"
diff --git a/ios/chrome/browser/snapshots/snapshot_browser_agent.mm b/ios/chrome/browser/snapshots/snapshot_browser_agent.mm index 232c409..50f9566 100644 --- a/ios/chrome/browser/snapshots/snapshot_browser_agent.mm +++ b/ios/chrome/browser/snapshots/snapshot_browser_agent.mm
@@ -96,6 +96,27 @@ void SnapshotBrowserAgent::MigrateStorageIfNecessary() { DCHECK(snapshot_cache_); + + WebStateList* web_state_list = browser_->GetWebStateList(); + const int web_state_list_count = web_state_list->count(); + if (!web_state_list_count) { + return; + } + + NSMutableArray<NSString*>* old_identifiers = + [NSMutableArray arrayWithCapacity:web_state_list_count]; + NSMutableArray<NSString*>* new_identifiers = + [NSMutableArray arrayWithCapacity:web_state_list_count]; + + for (int index = 0; index < web_state_list_count; ++index) { + web::WebState* web_state = web_state_list->GetWebStateAt(index); + [old_identifiers addObject:web_state->GetStableIdentifier()]; + [new_identifiers addObject:SnapshotTabHelper::FromWebState(web_state) + ->GetSnapshotIdentifier()]; + } + + [snapshot_cache_ renameSnapshotWithIdentifiers:old_identifiers + toIdentifiers:new_identifiers]; } void SnapshotBrowserAgent::PurgeUnusedSnapshots() {
diff --git a/ios/chrome/browser/snapshots/snapshot_cache.h b/ios/chrome/browser/snapshots/snapshot_cache.h index 6cabcb7..2c2e67f9 100644 --- a/ios/chrome/browser/snapshots/snapshot_cache.h +++ b/ios/chrome/browser/snapshots/snapshot_cache.h
@@ -62,6 +62,11 @@ - (void)purgeCacheOlderThan:(const base::Time&)date keeping:(NSSet*)liveSnapshotIDs; +// Renames snapshots named `oldIdentifiers` to `newIdentifiers`. It is a +// programmatic error if the two array do not have the same length. +- (void)renameSnapshotWithIdentifiers:(NSArray<NSString*>*)oldIdentifiers + toIdentifiers:(NSArray<NSString*>*)newIdentifiers; + // Hint that the snapshot for `snapshotID` will likely be saved to disk when the // application is backgrounded. The snapshot is then saved in memory, so it // does not need to be read off disk.
diff --git a/ios/chrome/browser/snapshots/snapshot_cache.mm b/ios/chrome/browser/snapshots/snapshot_cache.mm index 2afb1357..e0f5ec0c 100644 --- a/ios/chrome/browser/snapshots/snapshot_cache.mm +++ b/ios/chrome/browser/snapshots/snapshot_cache.mm
@@ -286,6 +286,38 @@ } } +void RenameSnapshots(const base::FilePath& cache_directory, + NSArray<NSString*>* old_identifiers, + NSArray<NSString*>* new_identifiers, + ImageScale snapshot_scale) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::WILL_BLOCK); + + DCHECK(base::DirectoryExists(cache_directory)); + DCHECK_EQ(old_identifiers.count, new_identifiers.count); + + const NSUInteger count = old_identifiers.count; + for (NSUInteger index = 0; index < count; ++index) { + for (const ImageType image_type : kImageTypes) { + const base::FilePath old_image_path = ImagePath( + old_identifiers[index], image_type, snapshot_scale, cache_directory); + const base::FilePath new_image_path = ImagePath( + new_identifiers[index], image_type, snapshot_scale, cache_directory); + + // Only migrate snapshots which are needed. + if (!base::PathExists(old_image_path) || + base::PathExists(new_image_path)) { + continue; + } + + if (!base::Move(old_image_path, new_image_path)) { + DLOG(ERROR) << "Error migrating file: " << old_image_path.AsUTF8Unsafe() + << " to: " << new_image_path.AsUTF8Unsafe(); + } + } + } +} + void CreateCacheDirectory(const base::FilePath& cache_directory) { // This is a NO-OP if the directory already exists. if (!base::CreateDirectory(cache_directory)) { @@ -505,6 +537,20 @@ liveSnapshotIDs, _snapshotsScale)); } +- (void)renameSnapshotWithIdentifiers:(NSArray<NSString*>*)oldIdentifiers + toIdentifiers:(NSArray<NSString*>*)newIdentifiers { + DCHECK_CALLED_ON_VALID_SEQUENCE(_sequenceChecker); + if (!_taskRunner) { + return; + } + + DCHECK_EQ(oldIdentifiers.count, newIdentifiers.count); + _taskRunner->PostTask( + FROM_HERE, + base::BindOnce(&RenameSnapshots, _cacheDirectory, oldIdentifiers, + newIdentifiers, _snapshotsScale)); +} + - (void)willBeSavedGreyWhenBackgrounding:(NSString*)snapshotID { DCHECK_CALLED_ON_VALID_SEQUENCE(_sequenceChecker); if (!snapshotID)
diff --git a/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm b/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm index eede8a4..d58d5b8 100644 --- a/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm +++ b/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm
@@ -387,6 +387,34 @@ } } +// Tests that migration code correctly rename the specified files and leave +// the other files untouched. +TEST_F(SnapshotCacheTest, RenameSnapshots) { + SnapshotCache* cache = GetSnapshotCache(); + + // This snapshot will be renamed. + NSString* image1_id = [[NSUUID UUID] UUIDString]; + base::FilePath image1_path = [cache imagePathForSnapshotID:image1_id]; + ASSERT_TRUE(base::WriteFile(image1_path, "image1")); + + // This snapshot will not be renamed. + NSString* image2_id = [[NSUUID UUID] UUIDString]; + base::FilePath image2_path = [cache imagePathForSnapshotID:image2_id]; + ASSERT_TRUE(base::WriteFile(image2_path, "image2")); + + NSString* new_identifier = [[NSUUID UUID] UUIDString]; + [cache renameSnapshotWithIdentifiers:@[ image1_id ] + toIdentifiers:@[ new_identifier ]]; + FlushRunLoops(); + + // image1 should have been moved. + EXPECT_FALSE(base::PathExists(image1_path)); + EXPECT_TRUE(base::PathExists([cache imagePathForSnapshotID:new_identifier])); + + // image2 should not have moved. + EXPECT_TRUE(base::PathExists(image2_path)); +} + // Loads the color images into the cache, and pins two of them. Ensures that // only the two pinned IDs remain in memory after a memory warning. TEST_F(SnapshotCacheTest, HandleMemoryWarning) {
diff --git a/ios/chrome/browser/snapshots/snapshot_generator.mm b/ios/chrome/browser/snapshots/snapshot_generator.mm index b4eddff4..83cd089 100644 --- a/ios/chrome/browser/snapshots/snapshot_generator.mm +++ b/ios/chrome/browser/snapshots/snapshot_generator.mm
@@ -226,21 +226,33 @@ -frameInBaseView.origin.y); BOOL snapshotSuccess = YES; - // `drawViewHierarchyInRect:` has undefined behavior when the view is not - // in the visible view hierarchy. In practice, when this method is called - // on a view that is part of view controller containment and not in the view - // hierarchy, an UIViewControllerHierarchyInconsistency exception will be - // thrown. if (baseView.window && ViewHierarchyContainsWKWebView(baseView)) { + // `-renderInContext:` is the preferred way to render a snapshot, but it's + // buggy for WKWebView, which is used for some WebUI pages such as + // "No internet" or "Site can't be reached". If a WKWebView-containing + // hierarchy must be snapshotted, the UIView `-drawViewHierarchyInRect:` + // method is used instead. + // `drawViewHierarchyInRect:` has undefined behavior when the view is not + // in the visible view hierarchy. In practice, when this method is called + // on a view that is part of view controller containment and not in the view + // hierarchy, an UIViewControllerHierarchyInconsistency exception will be + // thrown. // TODO(crbug.com/636188): `-drawViewHierarchyInRect:afterScreenUpdates:` is // buggy causing GPU glitches, screen redraws during animations, broken // pinch to dismiss on tablet, etc. snapshotSuccess = [baseView drawViewHierarchyInRect:baseView.bounds afterScreenUpdates:YES]; } else { - // `-renderInContext:` is buggy for WKWebView, which is used for some - // Chromium pages such as "No internet" or "Site can't be reached". - [[baseView layer] renderInContext:context]; + // Render the view's layer via `-renderInContext:`. + // To mitigate against crashes like crbug.com/1429512, ensure that + // the layer's position is valid. If not, mark the snapshotting as failed. + CALayer* layer = baseView.layer; + CGPoint pos = layer.position; + if (isnan(pos.x) || isnan(pos.y)) { + snapshotSuccess = NO; + } else { + [layer renderInContext:context]; + } } UIImage* image = nil; if (snapshotSuccess)
diff --git a/ios/chrome/browser/snapshots/snapshot_tab_helper.mm b/ios/chrome/browser/snapshots/snapshot_tab_helper.mm index 0dac837..d43f4696 100644 --- a/ios/chrome/browser/snapshots/snapshot_tab_helper.mm +++ b/ios/chrome/browser/snapshots/snapshot_tab_helper.mm
@@ -34,6 +34,18 @@ kMaxValue = kSnapshotSucceeded, }; +// Generates an identifier for WebState's snapshot. +NSString* GenerateSnapshotIdentifier(const web::WebState* web_state) { + DCHECK(web_state->GetUniqueIdentifier().is_valid()); + DCHECK_GT(web_state->GetUniqueIdentifier().id(), 0); + + static_assert(sizeof(SessionID::id_type) == sizeof(int32_t)); + const uint32_t identifier = + static_cast<uint32_t>(web_state->GetUniqueIdentifier().id()); + + return [NSString stringWithFormat:@"%08u", identifier]; +} + } // namespace SnapshotTabHelper::~SnapshotTabHelper() { @@ -105,7 +117,7 @@ DCHECK(web_state_); snapshot_generator_ = [[SnapshotGenerator alloc] initWithWebState:web_state_ - snapshotIdentifier:web_state_->GetStableIdentifier()]; + snapshotIdentifier:GenerateSnapshotIdentifier(web_state_)]; web_state_observation_.Observe(web_state_); }
diff --git a/ios/chrome/browser/sync/sync_observer_bridge.h b/ios/chrome/browser/sync/sync_observer_bridge.h index 055e37b..873a806 100644 --- a/ios/chrome/browser/sync/sync_observer_bridge.h +++ b/ios/chrome/browser/sync/sync_observer_bridge.h
@@ -7,7 +7,6 @@ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" #include "base/scoped_observation.h" #include "components/sync/driver/sync_service.h" #include "components/sync/driver/sync_service_observer.h"
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm index 0b1fe84..e442493f 100644 --- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm +++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -87,8 +87,8 @@ std::unique_ptr<translate::TranslateInfoBarDelegate> delegate) const { bool skip_banner = delegate->translate_step() == translate::TranslateStep::TRANSLATE_STEP_TRANSLATING; - return std::make_unique<InfoBarIOS>(InfobarType::kInfobarTypeTranslate, - std::move(delegate), skip_banner); + return std::make_unique<InfoBarIOS>(InfobarType::kInfobarTypeTranslate, + std::move(delegate), skip_banner); } bool ChromeIOSTranslateClient::ShowTranslateUI( @@ -103,7 +103,7 @@ // Infobar UI. translate::TranslateInfoBarDelegate::Create( - step != translate::TRANSLATE_STEP_BEFORE_TRANSLATE, + step != translate::TRANSLATE_STEP_BEFORE_TRANSLATE || triggered_from_menu, translate_manager_->GetWeakPtr(), InfoBarManagerImpl::FromWebState(web_state_), step, source_language, target_language, error_type, triggered_from_menu);
diff --git a/ios/chrome/browser/ui/alert_view/alert_consumer.h b/ios/chrome/browser/ui/alert_view/alert_consumer.h index 1dfb914f..10bf857 100644 --- a/ios/chrome/browser/ui/alert_view/alert_consumer.h +++ b/ios/chrome/browser/ui/alert_view/alert_consumer.h
@@ -25,7 +25,8 @@ (NSArray<TextFieldConfiguration*>*)textFieldConfigurations; // Sets the actions for this alert. The double array of actions would be -// represented visually with each sub-array being a row of buttons. +// represented visually with each sub-array being a row of buttons, unless the +// sum of the button text widths cannot fit into a single row. - (void)setActions:(NSArray<NSArray<AlertAction*>*>*)actions; // Sets the accessibility identifier for the alert view.
diff --git a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm index 84f15e2..33f2db6 100644 --- a/ios/chrome/browser/ui/alert_view/alert_view_controller.mm +++ b/ios/chrome/browser/ui/alert_view/alert_view_controller.mm
@@ -72,6 +72,13 @@ return 1.0 / [UIScreen mainScreen].scale; } +// Returns the width of the alert. +CGFloat GetAlertWidth() { + BOOL is_a11y_content_size = UIContentSizeCategoryIsAccessibilityCategory( + [UIApplication sharedApplication].preferredContentSizeCategory); + return is_a11y_content_size ? kAlertWidthAccessibility : kAlertWidth; +} + // Positions the content view on the screen. void PositionContentViewInParentView(UIView* contentView, UIView* parentView) { [NSLayoutConstraint activateConstraints:@[ @@ -266,13 +273,6 @@ self.swipeRecognizer.enabled = NO; [self.contentView addGestureRecognizer:self.swipeRecognizer]; - auto GetAlertWidth = ^CGFloat(void) { - BOOL isAccessibilityContentSize = - UIContentSizeCategoryIsAccessibilityCategory( - [UIApplication sharedApplication].preferredContentSizeCategory); - return isAccessibilityContentSize ? kAlertWidthAccessibility : kAlertWidth; - }; - NSLayoutConstraint* widthConstraint = [self.contentView.widthAnchor constraintEqualToConstant:GetAlertWidth()]; widthConstraint.priority = UILayoutPriorityRequired - 1; @@ -362,9 +362,6 @@ CGFloat spaceBefore = [stackView customSpacingAfterView:previousView]; [stackView setCustomSpacing:kTextfieldStackInsetTop + spaceBefore afterView:previousView]; - } else { - // There should always be a title or message. - NOTREACHED() << "Presenting alert without a title or message."; } [stackView addArrangedSubview:self.textFieldStackHolder]; NSDirectionalEdgeInsets stackHolderContentInsets = @@ -590,30 +587,47 @@ for (NSArray<AlertAction*>* rowOfActions in self.actions) { DCHECK_GT([rowOfActions count], 0U); AddSeparatorToStackView(buttons); - UIStackView* rowOfButtons = [[UIStackView alloc] init]; - rowOfButtons.axis = UILayoutConstraintAxisHorizontal; - rowOfButtons.alignment = UIStackViewAlignmentCenter; - UIView* firstButton; + // Calculate the axis for the sub-stackview. + CGFloat maxWidth = 0; + NSMutableArray<GrayHighlightButton*>* rowOfButtons = + [[NSMutableArray alloc] init]; for (AlertAction* action in rowOfActions) { - if (action != [rowOfActions firstObject]) { - AddSeparatorToStackView(rowOfButtons); - } GrayHighlightButton* button = GetButtonForAction(action); [button addTarget:self action:@selector(didSelectActionForButton:) forControlEvents:UIControlEventTouchUpInside]; - [rowOfButtons addArrangedSubview:button]; - if (firstButton) { + [rowOfButtons addObject:button]; + maxWidth = MAX(maxWidth, button.intrinsicContentSize.width); + } + UILayoutConstraintAxis axis = + maxWidth > GetAlertWidth() / rowOfActions.count + ? UILayoutConstraintAxisVertical + : UILayoutConstraintAxisHorizontal; + // Actually creates and adds the stack view to the view, and position the + // buttons. + UIStackView* rowOfButtonStackView = [[UIStackView alloc] init]; + rowOfButtonStackView.axis = axis; + rowOfButtonStackView.alignment = UIStackViewAlignmentCenter; + GrayHighlightButton* firstButton = [rowOfButtons firstObject]; + GrayHighlightButton* lastButton = [rowOfButtons lastObject]; + for (GrayHighlightButton* button in rowOfButtons) { + [rowOfButtonStackView addArrangedSubview:button]; + if (button != lastButton) { + AddSeparatorToStackView(rowOfButtonStackView); + } + if (axis == UILayoutConstraintAxisHorizontal) { [button.widthAnchor constraintEqualToAnchor:firstButton.widthAnchor] .active = YES; + AddSameConstraintsToSides(button, rowOfButtonStackView, + (LayoutSides::kTop | LayoutSides::kBottom)); } else { - firstButton = button; + AddSameConstraintsToSides( + button, rowOfButtonStackView, + (LayoutSides::kTrailing | LayoutSides::kLeading)); } - AddSameConstraintsToSides(button, rowOfButtons, - (LayoutSides::kTop | LayoutSides::kBottom)); } - [buttons addArrangedSubview:rowOfButtons]; - AddSameConstraintsToSides(rowOfButtons, buttons, + [buttons addArrangedSubview:rowOfButtonStackView]; + AddSameConstraintsToSides(rowOfButtonStackView, buttons, (LayoutSides::kTrailing | LayoutSides::kLeading)); } return buttons;
diff --git a/ios/chrome/browser/ui/app_store_rating/BUILD.gn b/ios/chrome/browser/ui/app_store_rating/BUILD.gn index 2fadea9b..ddfc75a 100644 --- a/ios/chrome/browser/ui/app_store_rating/BUILD.gn +++ b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
@@ -26,8 +26,8 @@ "//ios/chrome/browser/promos_manager", "//ios/chrome/browser/promos_manager:constants", "//ios/chrome/browser/promos_manager:types", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/ui/promos_manager:promos", "//ios/chrome/common", ]
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.h b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.h index a375b59..42bf1ddf1 100644 --- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.h +++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.h
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" class PromosManager;
diff --git a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm index 72a4003..7c8d89af 100644 --- a/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm +++ b/ios/chrome/browser/ui/authentication/signin/user_signin/user_signin_mediator.mm
@@ -138,7 +138,6 @@ completion:(ProceduralBlock)completion { [self.authenticationFlow cancelAndDismissAnimated:animated]; - self.syncService->GetUserSettings()->SetSyncRequested(false); DCHECK(self.delegate); switch (self.delegate.signinStateOnStart) { case IdentitySigninStateSignedOut: { @@ -172,10 +171,13 @@ } case IdentitySigninStateSignedInWithSyncEnabled: { // Switching accounts is not possible without sign-out. - NOTREACHED(); - break; + NOTREACHED_NORETURN(); } } + + // All codepaths above clear the sync-requested bit, either because the user + // is signed out or because SyncService::StopAndClear() does the job. + CHECK(!self.syncService->GetUserSettings()->IsSyncRequested()); } - (void)signinWithIdentityOnStartAfterSignout {
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey.h b/ios/chrome/browser/ui/authentication/signin_earl_grey.h index 7f9be66..378ff8b 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey.h +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey.h
@@ -7,7 +7,6 @@ #import <Foundation/Foundation.h> -#import "base/compiler_specific.h" #import "ios/chrome/browser/signin/capabilities_dict.h" #import "ios/testing/earl_grey/base_eg_test_helper_impl.h"
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn index 2c51c52a..28891a49 100644 --- a/ios/chrome/browser/ui/bookmarks/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -174,6 +174,7 @@ testonly = true sources = [ "bookmarks_accessibility_egtest.mm", + "bookmarks_account_storage_egtest.mm", "bookmarks_account_storage_promo_egtest.mm", "bookmarks_egtest.mm", "bookmarks_entries_egtest.mm",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h index 1fc9199d..87a486b 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h
@@ -6,7 +6,7 @@ #define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_EARL_GREY_UI_H_ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" + #import "ios/testing/earl_grey/base_eg_test_helper_impl.h" @protocol GREYMatcher;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm index 6f8fd24..944a23f1 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_mediator_unittest.mm
@@ -54,7 +54,7 @@ sync_setup_service_ = std::make_unique<FakeSyncSetupService>(sync_service_); mediator_ = [[BookmarkMediator alloc] - initWithWithBookmarkModel:bookmark_model_ + initWithWithBookmarkModel:profile_bookmark_model_ prefs:chrome_browser_state_->GetPrefs() authenticationService:authentication_service_ syncSetupService:sync_setup_service_.get()];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm index 06fa674..45907f2 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_path_cache_unittest.mm
@@ -32,7 +32,7 @@ TEST_F(BookmarkPathCacheTest, TestPathCache) { // Try to store and retrieve a cache. - const BookmarkNode* mobile_node = bookmark_model_->mobile_node(); + const BookmarkNode* mobile_node = profile_bookmark_model_->mobile_node(); const BookmarkNode* f1 = AddFolder(mobile_node, @"f1"); int64_t folder_id = f1->id(); int topmost_row = 23; @@ -44,7 +44,7 @@ int result_topmost_row; [BookmarkPathCache getBookmarkTopMostRowCacheWithPrefService:&prefs_ - model:bookmark_model_ + model:profile_bookmark_model_ folderId:&result_folder_id topMostRow:&result_topmost_row]; EXPECT_EQ(folder_id, result_folder_id); @@ -53,7 +53,7 @@ TEST_F(BookmarkPathCacheTest, TestPathCacheWhenFolderDeleted) { // Try to store and retrieve a cache after the cached path is deleted. - const BookmarkNode* mobile_node = bookmark_model_->mobile_node(); + const BookmarkNode* mobile_node = profile_bookmark_model_->mobile_node(); const BookmarkNode* f1 = AddFolder(mobile_node, @"f1"); int64_t folder_id = f1->id(); int topmost_row = 23; @@ -62,13 +62,14 @@ topMostRow:topmost_row]; // Delete the folder. - bookmark_model_->Remove(f1, bookmarks::metrics::BookmarkEditSource::kOther); + profile_bookmark_model_->Remove( + f1, bookmarks::metrics::BookmarkEditSource::kOther); int64_t unused_folder_id; int unused_topmost_row; BOOL result = [BookmarkPathCache getBookmarkTopMostRowCacheWithPrefService:&prefs_ - model:bookmark_model_ + model:profile_bookmark_model_ folderId:&unused_folder_id topMostRow:&unused_topmost_row]; ASSERT_FALSE(result);
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm index 54f15f5..9a47e94 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_utils_ios_unittest.mm
@@ -30,7 +30,7 @@ }; TEST_F(BookmarkIOSUtilsUnitTest, DeleteNodes) { - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); const BookmarkNode* a = AddBookmark(mobileNode, @"a"); const BookmarkNode* b = AddBookmark(mobileNode, @"b"); @@ -47,7 +47,7 @@ toDelete.insert(f2b); toDelete.insert(f2); - bookmark_utils_ios::DeleteBookmarks(toDelete, bookmark_model_); + bookmark_utils_ios::DeleteBookmarks(toDelete, profile_bookmark_model_); EXPECT_EQ(2u, mobileNode->children().size()); const BookmarkNode* child0 = mobileNode->children()[0].get(); @@ -59,7 +59,7 @@ } TEST_F(BookmarkIOSUtilsUnitTest, MoveNodes) { - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); const BookmarkNode* a = AddBookmark(mobileNode, @"a"); const BookmarkNode* b = AddBookmark(mobileNode, @"b"); @@ -76,7 +76,7 @@ toMove.insert(f2b); toMove.insert(f2); - bookmark_utils_ios::MoveBookmarks(toMove, bookmark_model_, f1); + bookmark_utils_ios::MoveBookmarks(toMove, profile_bookmark_model_, f1); EXPECT_EQ(2u, mobileNode->children().size()); const BookmarkNode* child0 = mobileNode->children()[0].get(); @@ -88,10 +88,10 @@ } TEST_F(BookmarkIOSUtilsUnitTest, TestCreateBookmarkPath) { - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* f1 = AddFolder(mobileNode, @"f1"); NSArray<NSNumber*>* path = - bookmark_utils_ios::CreateBookmarkPath(bookmark_model_, f1->id()); + bookmark_utils_ios::CreateBookmarkPath(profile_bookmark_model_, f1->id()); NSMutableArray<NSNumber*>* expectedPath = [NSMutableArray array]; [expectedPath addObject:@0]; [expectedPath addObject:[NSNumber numberWithLongLong:mobileNode->id()]]; @@ -101,12 +101,12 @@ TEST_F(BookmarkIOSUtilsUnitTest, TestCreateNilBookmarkPath) { NSArray<NSNumber*>* path = - bookmark_utils_ios::CreateBookmarkPath(bookmark_model_, 999); + bookmark_utils_ios::CreateBookmarkPath(profile_bookmark_model_, 999); EXPECT_TRUE(path == nil); } TEST_F(BookmarkIOSUtilsUnitTest, TestVisibleNonDescendantNodes) { - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* music = AddFolder(mobileNode, @"music"); const BookmarkNode* pop = AddFolder(music, @"pop"); @@ -126,7 +126,7 @@ const BookmarkNode* camel = AddFolder(animals, @"camel"); AddFolder(camel, @"al paca"); - AddFolder(bookmark_model_->other_node(), @"buildings"); + AddFolder(profile_bookmark_model_->other_node(), @"buildings"); std::set<const BookmarkNode*> obstructions; // Editing a folder and a bookmark. @@ -135,7 +135,7 @@ bookmark_utils_ios::NodeVector result = bookmark_utils_ios::VisibleNonDescendantNodes(obstructions, - bookmark_model_); + profile_bookmark_model_); ASSERT_EQ(13u, result.size()); EXPECT_NSEQ(base::SysUTF16ToNSString(result[0]->GetTitle()), @@ -163,7 +163,7 @@ EXPECT_TRUE(bookmark_utils_ios::IsSubvectorOfNodes(vector2, vector1)); // Empty vs vector with one element: [] - [1]. - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* bookmark1 = AddBookmark(mobileNode, @"1"); vector2.push_back(bookmark1); EXPECT_TRUE(bookmark_utils_ios::IsSubvectorOfNodes(vector1, vector2)); @@ -231,7 +231,7 @@ bookmark_utils_ios::MissingNodesIndices(vector1, vector2).size()); // [] - [1]. - const BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const BookmarkNode* mobileNode = profile_bookmark_model_->mobile_node(); const BookmarkNode* bookmark1 = AddBookmark(mobileNode, @"1"); vector2.push_back(bookmark1); std::vector<bookmark_utils_ios::NodeVector::size_type> missingNodesIndices =
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_account_storage_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_account_storage_egtest.mm new file mode 100644 index 0000000..4f3e333 --- /dev/null +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_account_storage_egtest.mm
@@ -0,0 +1,92 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UIKit/UIKit.h> +#import <XCTest/XCTest.h> + +#import "base/ios/ios_util.h" +#import "components/bookmarks/common/bookmark_features.h" +#import "components/signin/public/base/consent_level.h" +#import "ios/chrome/browser/signin/fake_system_identity.h" +#import "ios/chrome/browser/ui/authentication/signin/signin_constants.h" +#import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" +#import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" +#import "ios/chrome/browser/ui/authentication/signin_matchers.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h" +#import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h" +#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" +#import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" +#import "ios/chrome/test/earl_grey/chrome_matchers.h" +#import "ios/chrome/test/earl_grey/web_http_server_chrome_test_case.h" +#import "ios/testing/earl_grey/earl_grey_test.h" +#import "net/test/embedded_test_server/embedded_test_server.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +using chrome_test_util::BookmarksHomeDoneButton; +using chrome_test_util::BookmarksNavigationBarBackButton; +using chrome_test_util::IdentityCellMatcherForEmail; +using chrome_test_util::OmniboxText; +using chrome_test_util::PrimarySignInButton; +using chrome_test_util::SecondarySignInButton; + +// Bookmark promo integration tests for Chrome with +// kEnableBookmarksAccountStorage enabled. +@interface BookmarksAccountStorageTestCase : WebHttpServerChromeTestCase +@end + +@implementation BookmarksAccountStorageTestCase + +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + config.features_enabled.push_back(bookmarks::kEnableBookmarksAccountStorage); + return config; +} + +- (void)setUp { + [super setUp]; + [ChromeEarlGrey waitForBookmarksToFinishLoading]; + [ChromeEarlGrey clearBookmarks]; +} + +// Tear down called once per test. +- (void)tearDown { + [super tearDown]; + [ChromeEarlGrey clearBookmarks]; + [BookmarkEarlGrey clearBookmarksPositionCache]; +} + +#pragma mark - BookmarksAccountStorageTestCase Tests + +// Tests if there is only one "Mobile Bookmarks" in the bookmark list when +// the user is signed in+sync. +- (void)testMobileBookmarksWithSignInPlusSync { + GREYAssertTrue(self.testServer->Start(), @"Server did not start."); + // Add the bookmark in the device storage. + const GURL bookmarkURL = self.testServer->GetURL("/pony.html"); + std::string expectedURLContent = bookmarkURL.GetContent(); + NSString* bookmarkTitle = @"my bookmark"; + [ChromeEarlGrey loadURL:bookmarkURL]; + [[EarlGrey selectElementWithMatcher:OmniboxText(expectedURLContent)] + assertWithMatcher:grey_notNil()]; + [BookmarkEarlGrey waitForBookmarkModelLoaded:YES]; + [BookmarkEarlGreyUI bookmarkCurrentTabWithTitle:bookmarkTitle]; + // Sign-in+sync with identity. + FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1]; + [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity enableSync:YES]; + [BookmarkEarlGreyUI openBookmarks]; + // Tests that there is only one "Mobile Bookmarks". + [[EarlGrey selectElementWithMatcher:grey_allOf(grey_kindOfClassName( + @"UITableViewCell"), + grey_descendant(grey_text( + @"Mobile Bookmarks")), + nil)] + assertWithMatcher:grey_sufficientlyVisible()]; +} + +@end
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm index 6fea0abf..74511fa0 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -768,6 +768,67 @@ assertWithMatcher:grey_nil()]; } +// Tests that swiping down dismisses multiple bookmarks UIs on the same +// navigation controller. +- (void)testSwipeDownToDismissMultipleBookmarksUI { + [BookmarkEarlGrey setupStandardBookmarks]; + [BookmarkEarlGreyUI openBookmarks]; + [BookmarkEarlGreyUI openMobileBookmarks]; + + // Invoke Edit through long press. + [[EarlGrey + selectElementWithMatcher:TappableBookmarkNodeWithLabel(@"First URL")] + performAction:grey_longPress()]; + [[EarlGrey selectElementWithMatcher:chrome_test_util:: + BookmarksContextMenuEditButton()] + performAction:grey_tap()]; + + // Tap the Folder button and verify folder chooser UI is displayed. + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Change Folder")] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID(kBookmarkFolderPickerViewContainerIdentifier)] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Choose to move the bookmark into a new folder and verify folder creator is + // visible. + [[EarlGrey + selectElementWithMatcher:grey_accessibilityID( + kBookmarkCreateNewFolderCellIdentifier)] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID(kBookmarkFolderCreateViewContainerIdentifier)] + assertWithMatcher:grey_sufficientlyVisible()]; + + // Tap on Folder button to open folder chooser UI and verify `New Folder` + // section is not visible. + [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Change Folder")] + performAction:grey_tap()]; + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID(kBookmarkFolderPickerViewContainerIdentifier)] + assertWithMatcher:grey_sufficientlyVisible()]; + [[EarlGrey + selectElementWithMatcher:grey_accessibilityID( + kBookmarkCreateNewFolderCellIdentifier)] + assertWithMatcher:grey_notVisible()]; + + // Swipe TableView down and verify that we're back to the bookmarks list. + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID(kBookmarkFolderPickerViewContainerIdentifier)] + performAction:grey_swipeFastInDirection(kGREYDirectionDown)]; + [[EarlGrey + selectElementWithMatcher: + grey_accessibilityID(kBookmarkFolderPickerViewContainerIdentifier)] + assertWithMatcher:grey_nil()]; + [[EarlGrey selectElementWithMatcher:grey_accessibilityID( + kBookmarksHomeTableViewIdentifier)] + assertWithMatcher:grey_sufficientlyVisible()]; +} + - (void)testFolderEmptyState { [BookmarkEarlGrey setupStandardBookmarks]; [BookmarkEarlGreyUI openBookmarks];
diff --git a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller_unittest.mm index 1ee4615..544fe58 100644 --- a/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller_unittest.mm
@@ -54,14 +54,15 @@ BookmarksEditorViewController* controller = [[BookmarksEditorViewController alloc] initWithBrowser:browser_.get()]; - const bookmarks::BookmarkNode* mobile_node = bookmark_model_->mobile_node(); + const bookmarks::BookmarkNode* mobile_node = + profile_bookmark_model_->mobile_node(); const bookmarks::BookmarkNode* bookmark = AddBookmark(mobile_node, @"foo"); - BookmarksEditorMediator* mediator = - [[BookmarksEditorMediator alloc] initWithBookmarkModel:bookmark_model_ - bookmark:bookmark - prefs:nullptr - syncSetupService:nullptr - syncService:nullptr]; + BookmarksEditorMediator* mediator = [[BookmarksEditorMediator alloc] + initWithBookmarkModel:profile_bookmark_model_ + bookmark:bookmark + prefs:nullptr + syncSetupService:nullptr + syncService:nullptr]; controller.mutator = mediator; [controller updateSync]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm index d5e6c741..cd043d5 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_coordinator.mm
@@ -166,19 +166,24 @@ _mediator.consumer = nil; _mediator.delegate = nil; _mediator = nil; - if (_baseNavigationController) { - DCHECK_EQ(_baseNavigationController.topViewController, _viewController); - [_baseNavigationController popViewControllerAnimated:YES]; - } else if (_navigationController) { + if (_navigationController) { [self.baseViewController dismissViewControllerAnimated:YES completion:nil]; _navigationController = nil; - } else { + } else if (_baseNavigationController && + _baseNavigationController.presentingViewController) { + // If `_baseNavigationController.presentingViewController` is `nil` then + // the parent coordinator (who owns the `_baseNavigationController`) has + // already been dismissed. In this case `_baseNavigationController` itself + // is no longer being presented and this coordinator was dismissed as well. + DCHECK_EQ(_baseNavigationController.topViewController, _viewController); + [_baseNavigationController popViewControllerAnimated:YES]; + } else if (!_baseNavigationController) { // If there is no `_baseNavigationController` and `_navigationController`, // the view controller has been already dismissed. See // `presentationControllerDidDismiss:` and // `bookmarksFolderChooserViewControllerDidDismiss:`. // Therefore `self.baseViewController.presentedViewController` must be - // `nullptr`. + // `nil`. DCHECK(!self.baseViewController.presentedViewController); } _viewController.delegate = nil;
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.h b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.h index d66f1698..9fce158d 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.h +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.h
@@ -33,7 +33,8 @@ NS_DESIGNATED_INITIALIZER; // Initializes BookmarksFolderEditorCoordinator. The view will edit the bookmark // folder node. -// `folderNode` cannot be `nullptr` and must be editable. +// `folderNode` cannot be `nullptr` and must be editable (`folderNode` can't be +// the root node or any of the permanent nodes). - (instancetype) initWithBaseViewController:(UIViewController*)navigationController browser:(Browser*)browser
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm index b987114..842adcd 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_coordinator.mm
@@ -37,13 +37,10 @@ BookmarksFolderEditorViewController* _viewController; // Coordinator to show the folder chooser UI. BookmarksFolderChooserCoordinator* _folderChooserCoordinator; - // `_parentFolderNode` is only used when a new folder is added. The new - // folder should be added in `_parentFolderNode`. If `_parentFolderNode` is - // `nullptr`, then the new folder needs to be added in the default folder. + // Parent folder to `_folderNode`. Should never be `nullptr`. const bookmarks::BookmarkNode* _parentFolderNode; - // If `_folderNode` is set, the user is editing an existing folder and - // `_parentFolderNode` should be `nullptr`. If `_folderNode` is not set, the - // user is adding a new folder. + // If `_folderNode` is `nullptr`, the user is adding a new folder. Otherwise + // the user is editing an existing folder. const bookmarks::BookmarkNode* _folderNode; } @@ -74,9 +71,11 @@ folderNode: (const bookmarks::BookmarkNode*)folder { DCHECK(folder); + DCHECK(folder->parent()); self = [super initWithBaseViewController:baseViewController browser:browser]; if (self) { _folderNode = folder; + _parentFolderNode = folder->parent(); } return self; } @@ -104,13 +103,9 @@ self.browser->GetCommandDispatcher(), SnackbarCommands); if (_baseNavigationController) { - DCHECK(_parentFolderNode); - DCHECK(!_folderNode); [_baseNavigationController pushViewController:_viewController animated:YES]; } else { DCHECK(!_navigationController); - DCHECK(!_parentFolderNode); - DCHECK(_folderNode); _navigationController = [[BookmarkNavigationController alloc] initWithRootViewController:_viewController]; _navigationController.modalPresentationStyle = UIModalPresentationFormSheet; @@ -128,19 +123,24 @@ [self stopBookmarksFolderChooserCoordinator]; DCHECK(_viewController); - if (_baseNavigationController) { - DCHECK_EQ(self.baseNavigationController.topViewController, _viewController); - [_baseNavigationController popViewControllerAnimated:YES]; - } else if (_navigationController) { + if (_navigationController) { [self.baseViewController dismissViewControllerAnimated:YES completion:nil]; _navigationController = nil; - } else { + } else if (_baseNavigationController && + _baseNavigationController.presentingViewController) { + // If `_baseNavigationController.presentingViewController` is `nil` then + // the parent coordinator (who owns the `_baseNavigationController`) has + // already been dismissed. In this case `_baseNavigationController` itself + // is no longer being presented and this coordinator was dismissed as well. + DCHECK_EQ(_baseNavigationController.topViewController, _viewController); + [_baseNavigationController popViewControllerAnimated:YES]; + } else if (!_baseNavigationController) { // If there is no `_baseNavigationController` and `_navigationController`, // the view controller has been already dismissed. See // `presentationControllerDidDismiss:` and // `bookmarksFolderEditorDidDismiss:`. // Therefore `self.baseViewController.presentedViewController` must be - // `nullptr`. + // `nil`. DCHECK(!self.baseViewController.presentedViewController); } [_viewController disconnect]; @@ -184,7 +184,6 @@ // Deleting the folder is only allowed when the user is editing an existing // folder. DCHECK(_folderNode); - DCHECK(!_parentFolderNode); [_delegate bookmarksFolderEditorCoordinatorShouldStop:self]; }
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h index 70505384..9793b7f 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h
@@ -69,9 +69,10 @@ @property(nonatomic, weak) id<SnackbarCommands> snackbarCommandsHandler; // `bookmarkModel` must not be `nullptr` and must be loaded. -// Both `parentFolder` and `folder` cannot be `nullptr`. If `folder` is not -// `nullptr` than it must also be editable. If `folder` is not `nullptr` then -// it also means that we're editing an existing folder. +// `parentFolder` must not be `nullptr`. +// If `folder` is not `nullptr` than it means we're editing an existing folder +// and `folder` must also be editable (`folder` can't be the root node or any +// of the permanent nodes). // `browser` must not be `nullptr`. - (instancetype)initWithBookmarkModel:(bookmarks::BookmarkModel*)bookmarkModel folderNode:(const bookmarks::BookmarkNode*)folder
diff --git a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm index e57db14..bc33870 100644 --- a/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.mm
@@ -70,7 +70,10 @@ // The browser for this view controller. base::WeakPtr<Browser> _browser; ChromeBrowserState* _browserState; + // Parent folder to `_folder`. Should never be `nullptr`. const BookmarkNode* _parentFolder; + // If `_folderNode` is `nullptr`, the user is adding a new folder. Otherwise + // the user is editing an existing folder. const BookmarkNode* _folder; BOOL _edited; @@ -95,9 +98,7 @@ browser:(Browser*)browser { DCHECK(bookmarkModel); DCHECK(bookmarkModel->loaded()); - // Both of these can't be `nullptr`. - DCHECK(parentFolder || folder) - << "parentFolder: " << parentFolder << ", folder: " << folder; + DCHECK(parentFolder); if (folder) { DCHECK(!bookmarkModel->is_permanent_node(folder)); } @@ -108,7 +109,7 @@ if (self) { _bookmarkModel = bookmarkModel; _folder = folder; - _parentFolder = parentFolder ? parentFolder : _folder->parent(); + _parentFolder = parentFolder; _editingExistingFolder = _folder != nullptr; _browser = browser->AsWeakPtr(); _browserState = browser->GetBrowserState()->GetOriginalChromeBrowserState();
diff --git a/ios/chrome/browser/ui/bookmarks/home/BUILD.gn b/ios/chrome/browser/ui/bookmarks/home/BUILD.gn index 89ade6c..e145aaa2 100644 --- a/ios/chrome/browser/ui/bookmarks/home/BUILD.gn +++ b/ios/chrome/browser/ui/bookmarks/home/BUILD.gn
@@ -39,6 +39,7 @@ "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view:views", "//ios/chrome/browser/shared/ui/util", + "//ios/chrome/browser/signin", "//ios/chrome/browser/sync", "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication:signin_presenter",
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm index db7e884c..e08da5c 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_mediator.mm
@@ -10,6 +10,7 @@ #import "components/bookmarks/browser/bookmark_model.h" #import "components/bookmarks/browser/bookmark_utils.h" #import "components/bookmarks/browser/titled_url_match.h" +#import "components/bookmarks/common/bookmark_features.h" #import "components/bookmarks/common/bookmark_pref_names.h" #import "components/bookmarks/managed/managed_bookmark_service.h" #import "components/prefs/ios/pref_observer_bridge.h" @@ -24,6 +25,8 @@ #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_model.h" +#import "ios/chrome/browser/signin/authentication_service.h" +#import "ios/chrome/browser/signin/authentication_service_factory.h" #import "ios/chrome/browser/sync/sync_observer_bridge.h" #import "ios/chrome/browser/sync/sync_service_factory.h" #import "ios/chrome/browser/sync/sync_setup_service.h" @@ -73,6 +76,7 @@ base::WeakPtr<Browser> _browser; // The sync setup service for this mediator. SyncSetupService* _syncSetupService; + AuthenticationService* _authenticationService; // Base view controller to present sign-in UI. UIViewController* _baseViewController; } @@ -132,6 +136,8 @@ _syncService = SyncServiceFactory::GetForBrowserState(browserState); _syncSetupService = SyncSetupServiceFactory::GetForBrowserState(browserState); + _authenticationService = + AuthenticationServiceFactory::GetForBrowserState(browserState); [self computePromoTableViewData]; [self computeBookmarkTableViewData]; @@ -143,6 +149,8 @@ _bookmarkPromoController = nil; _modelBridge = nullptr; _syncSetupService = nullptr; + _syncService = nullptr; + _authenticationService = nullptr; _syncedBookmarksObserver = nullptr; _browser = nullptr; self.consumer = nil; @@ -202,12 +210,16 @@ if (![self hasBookmarksOrFolders]) { return; } - [self generateNodesForProfileRootNode]; - if (!self.sharedState.accountBookmarkModel) { + [self + generateTableViewDataForModel:self.sharedState.profileBookmarkModel + inSection:BookmarksHomeSectionIdentifierRootProfile]; + if (![self accountBookmarkModelAvailable]) { return; } [self updateHeaderForProfileRootNode]; - [self generateNodesForAccountRootNode]; + [self + generateTableViewDataForModel:self.sharedState.accountBookmarkModel + inSection:BookmarksHomeSectionIdentifierRootAccount]; [self updateHeaderForAccountRootNode]; } @@ -587,17 +599,6 @@ forSectionWithIdentifier:BookmarksHomeSectionIdentifierRootAccount]; } -- (void)generateNodesForProfileRootNode { - [self - generateTableViewDataForModel:self.sharedState.profileBookmarkModel - inSection:BookmarksHomeSectionIdentifierRootProfile]; -} -- (void)generateNodesForAccountRootNode { - [self - generateTableViewDataForModel:self.sharedState.accountBookmarkModel - inSection:BookmarksHomeSectionIdentifierRootAccount]; -} - // The original chrome browser state used for services that don't exist in // incognito mode. E.g., `_syncSetupService`, `_syncService` and // `ManagedBookmarkService`. @@ -660,4 +661,19 @@ IsManagedSyncDataType(prefService, SyncSetupService::kSyncBookmarks); return syncDisabledPolicy || syncTypesDisabledPolicy; } + +// Returns YES if the account storage should be visible. +- (BOOL)accountBookmarkModelAvailable { + if (!base::FeatureList::IsEnabled( + bookmarks::kEnableBookmarksAccountStorage)) { + return NO; + } + // TODO (crbug.com/1430453): Needs to use better signal to know if + // the account is enabled or not. + return _authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSignin) && + !_authenticationService->HasPrimaryIdentity( + signin::ConsentLevel::kSync); +} + @end
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.h b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.h index 982b038..77084a95 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.h +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.h
@@ -65,11 +65,11 @@ @property(nonatomic, strong) TableViewModel* tableViewModel; // The model holding profile bookmark data. -@property(nonatomic, readonly, assign) +@property(nonatomic, assign, readonly) bookmarks::BookmarkModel* profileBookmarkModel; - // The model holding account bookmark data. -@property(nonatomic, readonly) bookmarks::BookmarkModel* accountBookmarkModel; +@property(nonatomic, assign, readonly) + bookmarks::BookmarkModel* accountBookmarkModel; // Views. @@ -129,10 +129,16 @@ // Max number of favicon download requests in the lifespan of this tableView. + (NSUInteger)maxDownloadFaviconCount; -- (instancetype)initWithProfileBookmarkModel: - (bookmarks::BookmarkModel*)profileBookmarkModel - displayedRootNode: - (const bookmarks::BookmarkNode*)displayedRootNode +// Initializes BookmarksHomeSharedState. +// `profileBookmarkModel` cannot be nullptr. +// `accountBookmarkModel` if kEnableBookmarksAccountStorage is enabled, +// the model cannot be nullptr,. Otherwise, it has to be nullptr. +// `displayedRootNode` is the displayed folder. cannot be nullptr. +- (instancetype) + initWithProfileBookmarkModel:(bookmarks::BookmarkModel*)profileBookmarkModel + accountBookmarkModel:(bookmarks::BookmarkModel*)accountBookmarkModel + displayedRootNode: + (const bookmarks::BookmarkNode*)displayedRootNode NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.mm index 80884d1b..9d35351 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_shared_state.mm
@@ -44,10 +44,17 @@ - (instancetype) initWithProfileBookmarkModel:(bookmarks::BookmarkModel*)profileBookmarkModel + accountBookmarkModel:(bookmarks::BookmarkModel*)accountBookmarkModel displayedRootNode: (const bookmarks::BookmarkNode*)displayedRootNode { if ((self = [super init])) { + CHECK(profileBookmarkModel); + CHECK(!base::FeatureList::IsEnabled( + bookmarks::kEnableBookmarksAccountStorage) || + accountBookmarkModel); + CHECK(displayedRootNode); _profileBookmarkModel = profileBookmarkModel; + _accountBookmarkModel = accountBookmarkModel; _tableViewDisplayedRootNode = displayedRootNode; } return self; @@ -89,13 +96,4 @@ return kMaxDownloadFaviconCount; } -- (bookmarks::BookmarkModel*)accountBookmarkModel { - if (base::FeatureList::IsEnabled(bookmarks::kEnableBookmarksAccountStorage)) { - // TODO(crbug.com/1404250) - // For manual testing, waiting for an actual account storage. - return self.profileBookmarkModel; - } - return nil; -} - @end
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm index 85bd7775..999e252 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller.mm
@@ -12,12 +12,14 @@ #import "base/ranges/algorithm.h" #import "base/strings/sys_string_conversions.h" #import "components/bookmarks/browser/bookmark_model.h" +#import "components/bookmarks/common/bookmark_features.h" #import "components/bookmarks/common/bookmark_metrics.h" #import "components/bookmarks/common/bookmark_pref_names.h" #import "components/bookmarks/managed/managed_bookmark_service.h" #import "components/prefs/pref_service.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/app/tests_hook.h" +#import "ios/chrome/browser/bookmarks/account_bookmark_model_factory.h" #import "ios/chrome/browser/bookmarks/bookmark_model_bridge_observer.h" #import "ios/chrome/browser/bookmarks/bookmarks_utils.h" #import "ios/chrome/browser/bookmarks/local_or_syncable_bookmark_model_factory.h" @@ -145,7 +147,9 @@ @property(nonatomic, strong) BookmarksHomeSharedState* sharedState; // The profile bookmark model used. -@property(nonatomic, assign) bookmarks::BookmarkModel* profileBookmarks; +@property(nonatomic, assign) bookmarks::BookmarkModel* profileBookmarkModel; +// The account bookmark model used. +@property(nonatomic, assign) bookmarks::BookmarkModel* accountBookmarkModel; // The Browser in which bookmarks are presented // TODO(crbug.com/1423926): Need to convert this property into: @@ -219,7 +223,9 @@ @implementation BookmarksHomeViewController { // Bridge to register for bookmark changes in the profile model. - std::unique_ptr<BookmarkModelBridge> _profileBridge; + std::unique_ptr<BookmarkModelBridge> _profileBookmarkModelBridge; + // Bridge to register for bookmark changes in the account model. + std::unique_ptr<BookmarkModelBridge> _accountBookmarkModelBridge; // The bookmark node that was choosen by an entity outside of the Bookmarks UI // and is selected when the view is loaded. const bookmarks::BookmarkNode* _externalBookmark; @@ -239,11 +245,18 @@ _faviconLoader = IOSChromeFaviconLoaderFactory::GetForBrowserState(_browserState); - _profileBookmarks = + _profileBookmarkModel = ios::LocalOrSyncableBookmarkModelFactory::GetForBrowserState( _browserState); - - _profileBridge.reset(new BookmarkModelBridge(self, _profileBookmarks)); + _profileBookmarkModelBridge = + std::make_unique<BookmarkModelBridge>(self, _profileBookmarkModel); + if (base::FeatureList::IsEnabled( + bookmarks::kEnableBookmarksAccountStorage)) { + _accountBookmarkModel = + ios::AccountBookmarkModelFactory::GetForBrowserState(_browserState); + _accountBookmarkModelBridge = + std::make_unique<BookmarkModelBridge>(self, _accountBookmarkModel); + } } return self; } @@ -262,7 +275,10 @@ _sharedState.tableView.delegate = nil; self.browser = nullptr; self.browserState = nullptr; - _profileBridge.reset(); + _profileBookmarkModel = nullptr; + _profileBookmarkModelBridge.reset(); + _accountBookmarkModel = nullptr; + _accountBookmarkModelBridge.reset(); } - (void)setExternalBookmark:(const bookmarks::BookmarkNode*)node { @@ -283,7 +299,12 @@ - (NSArray<BookmarksHomeViewController*>*)cachedViewControllerStack { // This method is only designed to be called for the view controller // associated with the root node. - DCHECK(self.profileBookmarks->loaded()); + DCHECK(_profileBookmarkModel->loaded()); + if (base::FeatureList::IsEnabled(bookmarks::kEnableBookmarksAccountStorage)) { + CHECK(_accountBookmarkModel->loaded()); + } else { + CHECK(!_accountBookmarkModel); + } DCHECK([self isDisplayingBookmarkRoot]); NSMutableArray<BookmarksHomeViewController*>* stack = [NSMutableArray array]; @@ -301,29 +322,29 @@ if (![BookmarkPathCache getBookmarkTopMostRowCacheWithPrefService:self.browserState ->GetPrefs() - model:self.profileBookmarks + model:self.profileBookmarkModel folderId:&cachedFolderID topMostRow:&cachedIndexPathRow] || - cachedFolderID == self.profileBookmarks->root_node()->id()) { + cachedFolderID == self.profileBookmarkModel->root_node()->id()) { return stack; } NSArray<NSNumber*>* path = bookmark_utils_ios::CreateBookmarkPath( - self.profileBookmarks, cachedFolderID); + self.profileBookmarkModel, cachedFolderID); if (!path) { return stack; } - DCHECK_EQ(self.profileBookmarks->root_node()->id(), + DCHECK_EQ(self.profileBookmarkModel->root_node()->id(), [[path firstObject] longLongValue]); for (NSUInteger ii = 1; ii < [path count]; ii++) { int64_t nodeID = [[path objectAtIndex:ii] longLongValue]; const BookmarkNode* node = - bookmark_utils_ios::FindFolderById(self.profileBookmarks, nodeID); + bookmark_utils_ios::FindFolderById(self.profileBookmarkModel, nodeID); DCHECK(node); // if node is an empty permanent node, stop. if (node->children().empty() && - IsPrimaryPermanentNode(node, self.profileBookmarks)) { + IsPrimaryPermanentNode(node, self.profileBookmarkModel)) { break; } @@ -393,7 +414,7 @@ self.searchTerm = @""; - if (self.profileBookmarks->loaded()) { + if (self.profileBookmarkModel->loaded()) { [self loadBookmarkViews]; } else { [self showLoadingSpinnerBackground]; @@ -408,7 +429,7 @@ self.navigationController.interactivePopGestureRecognizer.delegate = self; // Hide the toolbar if we're displaying the root node. - if (self.profileBookmarks->loaded() && + if (self.profileBookmarkModel->loaded() && (![self isDisplayingBookmarkRoot] || self.sharedState.currentlyShowingSearchResults)) { self.navigationController.toolbarHidden = NO; @@ -476,7 +497,8 @@ [self loadModel]; self.sharedState = [[BookmarksHomeSharedState alloc] - initWithProfileBookmarkModel:_profileBookmarks + initWithProfileBookmarkModel:_profileBookmarkModel + accountBookmarkModel:_accountBookmarkModel displayedRootNode:self.displayedFolderNode]; self.sharedState.tableViewModel = self.tableViewModel; self.sharedState.tableView = self.tableView; @@ -522,7 +544,7 @@ [self editExternalBookmarkIfSet]; - DCHECK(self.profileBookmarks->loaded()); + DCHECK(self.profileBookmarkModel->loaded()); DCHECK([self isViewLoaded]); } @@ -656,27 +678,53 @@ #pragma mark - Action sheet callbacks -// Opens the folder move editor for the given node. -- (void)moveNodes:(const std::set<const BookmarkNode*>&)nodes { +// Opens the folder move editor for the given node IDs. +- (void)moveBookmarkNodeWithIDs:(std::set<int64_t>)nodeIDs + userAction:(const char*)userAction { DCHECK(!_folderChooserCoordinator); - DCHECK(nodes.size() > 0); - const BookmarkNode* editedNode = *(nodes.begin()); + DCHECK(nodeIDs.size() > 0); + absl::optional<std::set<const BookmarkNode*>> nodesFromIDs = + bookmark_utils_ios::FindNodesByIds(self.profileBookmarkModel, nodeIDs); + if (!nodesFromIDs) { + // While the contextual menu was opened, the nodes might have been removed. + // If the nodes don't exist anymore, there nothing to do. + return; + } + DCHECK(nodesFromIDs->size() > 0); + base::RecordAction(base::UserMetricsAction(userAction)); + const BookmarkNode* editedNode = *(nodesFromIDs->begin()); const BookmarkNode* selectedFolder = editedNode->parent(); _folderChooserCoordinator = [[BookmarksFolderChooserCoordinator alloc] initWithBaseViewController:self.navigationController browser:_browser - hiddenNodes:nodes]; + hiddenNodes:*nodesFromIDs]; [_folderChooserCoordinator setSelectedFolder:selectedFolder]; _folderChooserCoordinator.delegate = self; [_folderChooserCoordinator start]; } -// Deletes the current node. -- (void)deleteNodes:(const std::set<const BookmarkNode*>&)nodes { +// Deletes the `nodeIDs` if they still exist and records `userAction`. +- (void)deleteBookmarkNodesWithIDs:(std::set<int64_t>)nodeIDs + userAction:(const char*)userAction { + absl::optional<std::set<const BookmarkNode*>> nodesFromIDs = + bookmark_utils_ios::FindNodesByIds(self.profileBookmarkModel, nodeIDs); + if (!nodesFromIDs) { + // While the contextual menu was opened, the nodes might have been removed. + // If the nodes don't exist anymore, there nothing to do. + return; + } + [self deleteBookmarkNodes:*nodesFromIDs userAction:userAction]; +} + +// Deletes the `nodes` and records `userAction`. +- (void)deleteBookmarkNodes:(const std::set<const BookmarkNode*>&)nodes + userAction:(const char*)userAction { DCHECK_GE(nodes.size(), 1u); + base::RecordAction(base::UserMetricsAction(userAction)); [self.snackbarCommandsHandler showSnackbarMessage:bookmark_utils_ios::DeleteBookmarksWithUndoToast( - nodes, self.profileBookmarks, self.browserState)]; + nodes, self.profileBookmarkModel, + self.browserState)]; [self setTableViewEditing:NO]; } @@ -690,24 +738,38 @@ } } -// Opens the editor on the given URL node. -- (void)editNodeURL:(const BookmarkNode*)node { - DCHECK(node); - DCHECK_EQ(node->type(), BookmarkNode::URL); +// Opens the editor for `nodeID` node, if it still exists. The node has to be +// a bookmark node. +- (void)editBookmarkNodeWithID:(int64_t)nodeID { + const bookmarks::BookmarkNode* bookmarkNodeFromID = + bookmark_utils_ios::FindNodeById(self.profileBookmarkModel, nodeID); + if (!bookmarkNodeFromID) { + // While the contextual menu was opened, the node might has been removed. + // If the node doesn't exist anymore, there nothing to do. + return; + } + DCHECK_EQ(bookmarkNodeFromID->type(), BookmarkNode::URL); base::RecordAction( base::UserMetricsAction("MobileBookmarkManagerEditBookmark")); [self ensureBookmarksCoordinator]; - [self.bookmarksCoordinator presentEditorForURLNode:node]; + [self.bookmarksCoordinator presentEditorForURLNode:bookmarkNodeFromID]; } -// Opens the editor on the given Folder node. -- (void)editNodeFolder:(const BookmarkNode*)node { +// Opens the editor for `nodeID` node, if it still exists. The node has to be +// a folder node. +- (void)editFolderNodeWithID:(int64_t)folderNodeID { + const bookmarks::BookmarkNode* folderNodeFromID = + bookmark_utils_ios::FindNodeById(self.profileBookmarkModel, folderNodeID); + if (!folderNodeFromID) { + // While the contextual menu was opened, the node might has been removed. + // If the node doesn't exist anymore, there nothing to do. + return; + } + DCHECK_EQ(folderNodeFromID->type(), BookmarkNode::FOLDER); base::RecordAction( base::UserMetricsAction("MobileBookmarkManagerEditFolder")); - DCHECK(node); - DCHECK_EQ(node->type(), BookmarkNode::FOLDER); [self ensureBookmarksCoordinator]; - [self.bookmarksCoordinator presentEditorForFolderNode:node]; + [self.bookmarksCoordinator presentEditorForFolderNode:folderNodeFromID]; } - (void)openAllURLs:(std::vector<GURL>)urls @@ -763,12 +825,12 @@ int unusedIndexPathRow; while ([BookmarkPathCache getBookmarkTopMostRowCacheWithPrefService:self.browserState->GetPrefs() - model:self.profileBookmarks + model:self.profileBookmarkModel folderId:&unusedFolderId topMostRow:&unusedIndexPathRow]) { - [BookmarkPathCache - clearBookmarkTopMostRowCacheWithPrefService:self.browserState - ->GetPrefs()]; + [BookmarkPathCache + clearBookmarkTopMostRowCacheWithPrefService:self.browserState + ->GetPrefs()]; } // Rebuild folder controller list, going back up the tree. @@ -823,11 +885,6 @@ completion:completion]; } -- (void)handleSelectNodesForDeletion: - (const std::set<const bookmarks::BookmarkNode*>&)nodes { - [self deleteNodes:nodes]; -} - - (void)handleSelectEditNodes: (const std::set<const bookmarks::BookmarkNode*>&)nodes { // Early return if bookmarks table is not in edit mode. @@ -893,8 +950,8 @@ [self.snackbarCommandsHandler showSnackbarMessage: bookmark_utils_ios::UpdateBookmarkPositionWithUndoToast( - node, self.displayedFolderNode, position, self.profileBookmarks, - self.browserState)]; + node, self.displayedFolderNode, position, + self.profileBookmarkModel, self.browserState)]; } - (void)handleRefreshContextBar { @@ -949,7 +1006,7 @@ [self setTableViewEditing:NO]; [self.snackbarCommandsHandler showSnackbarMessage:bookmark_utils_ios::MoveBookmarksWithUndoToast( - std::move(editedNodes), self.profileBookmarks, + std::move(editedNodes), self.profileBookmarkModel, folder, self.browserState)]; } @@ -973,7 +1030,7 @@ - (void)bookmarkModelLoaded:(bookmarks::BookmarkModel*)model { DCHECK(!self.displayedFolderNode); - self.displayedFolderNode = self.profileBookmarks->root_node(); + self.displayedFolderNode = self.profileBookmarkModel->root_node(); // If the view hasn't loaded yet, then return early. The eventual call to // viewDidLoad will properly initialize the views. This early return must @@ -990,7 +1047,7 @@ if ([BookmarkPathCache getBookmarkTopMostRowCacheWithPrefService:self.browserState ->GetPrefs() - model:self.profileBookmarks + model:self.profileBookmarkModel folderId:&unusedFolderId topMostRow:&unusedIndexPathRow]) { self.isReconstructingFromCache = YES; @@ -1067,7 +1124,7 @@ #pragma mark - private - (BOOL)isDisplayingBookmarkRoot { - return self.displayedFolderNode == self.profileBookmarks->root_node(); + return self.displayedFolderNode == self.profileBookmarkModel->root_node(); } // Check if any of our controller is presenting. We don't consider when this @@ -1108,7 +1165,7 @@ (const bookmarks::BookmarkNode*)node { viewController.navigationItem.leftBarButtonItem.action = @selector(back); // Disable large titles on every VC but the root controller. - if (node != self.profileBookmarks->root_node()) { + if (node != self.profileBookmarkModel->root_node()) { viewController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; } @@ -1450,16 +1507,26 @@ return self.scrimView.superview ? YES : NO; } -// Triggers the URL sharing flow for the given `URL` and `title`, with the -// `indexPath` for the cell representing the UI component for that URL. -- (void)shareURL:(const GURL&)URL - title:(NSString*)title - indexPath:(NSIndexPath*)indexPath { - UIView* cellView = [self.tableView cellForRowAtIndexPath:indexPath]; +// Triggers the URL sharing flow for `bookmarkNodeID` node, if it still exists. +- (void)shareBookmarkNodeWithID:(int64_t)bookmarkNodeID + indexPath:(NSIndexPath*)indexPath { + const bookmarks::BookmarkNode* bookmarkNodeFromID = + bookmark_utils_ios::FindNodeById(self.profileBookmarkModel, + bookmarkNodeID); + if (!bookmarkNodeFromID) { + // While the contextual menu was opened, the node might has been removed. + // If the node doesn't exist anymore, there nothing to do. + return; + } + DCHECK(bookmarkNodeFromID->is_url()); + GURL bookmarkURL = bookmarkNodeFromID->url(); + NSString* title = + bookmark_utils_ios::TitleForBookmarkNode(bookmarkNodeFromID); SharingParams* params = - [[SharingParams alloc] initWithURL:URL + [[SharingParams alloc] initWithURL:bookmarkURL title:title scenario:SharingScenario::BookmarkEntry]; + UIView* cellView = [self.tableView cellForRowAtIndexPath:indexPath]; self.sharingCoordinator = [[SharingCoordinator alloc] initWithBaseViewController:self browser:self.browser @@ -1591,9 +1658,8 @@ case BookmarksContextBarMultipleFolderSelection: case BookmarksContextBarMixedSelection: // Delete clicked. - [self deleteNodes:nodes]; - base::RecordAction( - base::UserMetricsAction("MobileBookmarkManagerRemoveSelected")); + [self deleteBookmarkNodes:nodes + userAction:"MobileBookmarkManagerRemoveSelected"]; break; case BookmarksContextBarNone: default: @@ -1854,18 +1920,10 @@ addItemWithTitle:titleString action:^{ BookmarksHomeViewController* strongSelf = weakSelf; - if (!strongSelf) { - return; - } - - absl::optional<std::set<const BookmarkNode*>> nodesFromIds = - bookmark_utils_ios::FindNodesByIds( - strongSelf.profileBookmarks, nodeIds); - if (nodesFromIds) { - base::RecordAction(base::UserMetricsAction( - "MobileBookmarkManagerMoveToFolderBulk")); - [strongSelf moveNodes:*nodesFromIds]; - } + [strongSelf + moveBookmarkNodeWithIDs:nodeIds + userAction: + "MobileBookmarkManagerMoveToFolderBulk"]; } style:UIAlertActionStyleDefault]; } @@ -1887,15 +1945,7 @@ [coordinator addItemWithTitle:titleString action:^{ BookmarksHomeViewController* strongSelf = weakSelf; - if (!strongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById( - strongSelf.profileBookmarks, nodeId); - if (nodeFromId) { - [strongSelf editNodeURL:nodeFromId]; - } + [strongSelf editBookmarkNodeWithID:nodeId]; } style:UIAlertActionStyleDefault enabled:editEnabled]; @@ -1974,38 +2024,24 @@ [coordinator addItemWithTitle:titleString action:^{ BookmarksHomeViewController* strongSelf = weakSelf; - if (!strongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById( - strongSelf.profileBookmarks, nodeId); - if (nodeFromId) { - [strongSelf editNodeFolder:nodeFromId]; - } + [strongSelf editFolderNodeWithID:nodeId]; } style:UIAlertActionStyleDefault enabled:editEnabled]; titleString = GetNSString(IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE); - [coordinator addItemWithTitle:titleString - action:^{ - BookmarksHomeViewController* strongSelf = weakSelf; - if (!strongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById( - strongSelf.profileBookmarks, nodeId); - if (nodeFromId) { - base::RecordAction(base::UserMetricsAction( - "MobileBookmarkManagerMoveToFolder")); - std::set<const BookmarkNode*> nodes{nodeFromId}; - [strongSelf moveNodes:nodes]; - } - } - style:UIAlertActionStyleDefault - enabled:editEnabled]; + [coordinator + addItemWithTitle:titleString + action:^{ + BookmarksHomeViewController* strongSelf = weakSelf; + std::set<int64_t> nodeIDs{nodeId}; + [strongSelf + moveBookmarkNodeWithIDs:nodeIDs + userAction: + "MobileBookmarkManagerMoveToFolder"]; + } + style:UIAlertActionStyleDefault + enabled:editEnabled]; } - (void)configureCoordinator:(AlertCoordinator*)coordinator @@ -2025,17 +2061,10 @@ addItemWithTitle:titleString action:^{ BookmarksHomeViewController* strongSelf = weakSelf; - if (!strongSelf) { - return; - } - absl::optional<std::set<const bookmarks::BookmarkNode*>> - nodesFromIds = bookmark_utils_ios::FindNodesByIds( - strongSelf.profileBookmarks, nodeIds); - if (nodesFromIds) { - base::RecordAction(base::UserMetricsAction( - "MobileBookmarkManagerMoveToFolderBulk")); - [strongSelf moveNodes:*nodesFromIds]; - } + [strongSelf + moveBookmarkNodeWithIDs:nodeIds + userAction: + "MobileBookmarkManagerMoveToFolderBulk"]; } style:UIAlertActionStyleDefault]; } @@ -2258,9 +2287,8 @@ const BookmarkNode* node = nodeItem.bookmarkNode; std::set<const BookmarkNode*> nodes; nodes.insert(node); - [self handleSelectNodesForDeletion:nodes]; - base::RecordAction( - base::UserMetricsAction("MobileBookmarkManagerEntryDeleted")); + [self deleteBookmarkNodes:nodes + userAction:"MobileBookmarkManagerEntryDeleted"]; } } @@ -2441,49 +2469,22 @@ UIAction* editAction = [actionFactory actionToEditWithBlock:^{ BookmarksHomeViewController* innerStrongSelf = weakSelf; - if (!innerStrongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById(innerStrongSelf.profileBookmarks, - nodeId); - if (nodeFromId) { - [innerStrongSelf editNodeURL:nodeFromId]; - } + [innerStrongSelf editBookmarkNodeWithID:nodeId]; }]; [menuElements addObject:editAction]; - [menuElements - addObject:[actionFactory actionToShareWithBlock:^{ - BookmarksHomeViewController* innerStrongSelf = weakSelf; - if (!innerStrongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById( - innerStrongSelf.profileBookmarks, nodeId); - if (nodeFromId) { - [weakSelf - shareURL:nodeURL - title:bookmark_utils_ios::TitleForBookmarkNode(nodeFromId) - indexPath:indexPath]; - } - }]]; + [menuElements addObject:[actionFactory actionToShareWithBlock:^{ + BookmarksHomeViewController* innerStrongSelf = weakSelf; + [innerStrongSelf shareBookmarkNodeWithID:nodeId + indexPath:indexPath]; + }]]; UIAction* deleteAction = [actionFactory actionToDeleteWithBlock:^{ BookmarksHomeViewController* innerStrongSelf = weakSelf; - if (!innerStrongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById(innerStrongSelf.profileBookmarks, - nodeId); - if (nodeFromId) { - std::set<const BookmarkNode*> nodes{nodeFromId}; - [innerStrongSelf handleSelectNodesForDeletion:nodes]; - base::RecordAction( - base::UserMetricsAction("MobileBookmarkManagerEntryDeleted")); - } + std::set<int64_t> nodeIDs{nodeId}; + [innerStrongSelf + deleteBookmarkNodesWithIDs:nodeIDs + userAction:"MobileBookmarkManagerEntryDeleted"]; }]; [menuElements addObject:deleteAction]; @@ -2513,30 +2514,14 @@ UIAction* editAction = [actionFactory actionToEditWithBlock:^{ BookmarksHomeViewController* innerStrongSelf = weakSelf; - if (!innerStrongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById(innerStrongSelf.profileBookmarks, - nodeId); - if (nodeFromId) { - [innerStrongSelf editNodeFolder:nodeFromId]; - } + [innerStrongSelf editFolderNodeWithID:nodeId]; }]; UIAction* moveAction = [actionFactory actionToMoveFolderWithBlock:^{ BookmarksHomeViewController* innerStrongSelf = weakSelf; - if (!innerStrongSelf) { - return; - } - const bookmarks::BookmarkNode* nodeFromId = - bookmark_utils_ios::FindNodeById(innerStrongSelf.profileBookmarks, - nodeId); - if (nodeFromId) { - base::RecordAction( - base::UserMetricsAction("MobileBookmarkManagerMoveToFolder")); - std::set<const BookmarkNode*> nodes{nodeFromId}; - [innerStrongSelf moveNodes:nodes]; - } + std::set<int64_t> nodeIDs{nodeId}; + [innerStrongSelf + moveBookmarkNodeWithIDs:nodeIDs + userAction:"MobileBookmarkManagerMoveToFolder"]; }]; if (!canEditNode) { @@ -2592,7 +2577,7 @@ showSnackbarMessage: bookmark_utils_ios::CreateBookmarkAtPositionWithUndoToast( base::SysUTF8ToNSString(URL.spec()), URL, - self.displayedFolderNode, index, self.profileBookmarks, + self.displayedFolderNode, index, self.profileBookmarkModel, self.browserState)]; }
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller_unittest.mm index 077b251..72403a1 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmarks_home_view_controller_unittest.mm
@@ -55,7 +55,8 @@ controller.applicationCommandsHandler = mockApplicationCommandHandler; controller.snackbarCommandsHandler = mockSnackbarCommandHandler; - const bookmarks::BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const bookmarks::BookmarkNode* mobileNode = + profile_bookmark_model_->mobile_node(); AddBookmark(mobileNode, @"foo"); controller.displayedFolderNode = mobileNode; // sections: Bookmarks, root profile, root account, message. @@ -113,8 +114,10 @@ controller.applicationCommandsHandler = mockApplicationCommandHandler; controller.snackbarCommandsHandler = mockSnackbarCommandHandler; - const bookmarks::BookmarkNode* rootNode = bookmark_model_->root_node(); - const bookmarks::BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const bookmarks::BookmarkNode* rootNode = + profile_bookmark_model_->root_node(); + const bookmarks::BookmarkNode* mobileNode = + profile_bookmark_model_->mobile_node(); AddBookmark(mobileNode, @"foo"); // Ensure there are bookmarks controller.displayedFolderNode = rootNode; // sections: Promo, Bookmarks, root profile, root account, message. @@ -177,8 +180,10 @@ controller.applicationCommandsHandler = mockApplicationCommandHandler; controller.snackbarCommandsHandler = mockSnackbarCommandHandler; - const bookmarks::BookmarkNode* rootNode = bookmark_model_->root_node(); - const bookmarks::BookmarkNode* mobileNode = bookmark_model_->mobile_node(); + const bookmarks::BookmarkNode* rootNode = + profile_bookmark_model_->root_node(); + const bookmarks::BookmarkNode* mobileNode = + profile_bookmark_model_->mobile_node(); AddBookmark(mobileNode, @"foo"); // Ensure there are bookmarks controller.displayedFolderNode = rootNode; // sections: Promo, Bookmarks, root profile, root account, message. @@ -198,7 +203,8 @@ [controller.tableViewModel sectionForSectionIdentifier: BookmarksHomeSectionIdentifierRootProfile]]); - EXPECT_EQ(1, [controller tableView:controller.tableView + // The user is signed out, account storage section should not be visible. + EXPECT_EQ(0, [controller tableView:controller.tableView numberOfRowsInSection: [controller.tableViewModel sectionForSectionIdentifier: @@ -239,7 +245,7 @@ controller.applicationCommandsHandler = mockApplicationCommandHandler; controller.snackbarCommandsHandler = mockSnackbarCommandHandler; - controller.displayedFolderNode = bookmark_model_->mobile_node(); + controller.displayedFolderNode = profile_bookmark_model_->mobile_node(); base::UserActionTester user_action_tester; std::string user_action = "MobileKeyCommandClose"; ASSERT_EQ(user_action_tester.GetActionCount(user_action), 0);
diff --git a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h index c9e7e6d..722a214 100644 --- a/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h +++ b/ios/chrome/browser/ui/bookmarks/undo_manager_bridge_observer.h
@@ -5,7 +5,6 @@ #ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_UNDO_MANAGER_BRIDGE_OBSERVER_H_ #define IOS_CHROME_BROWSER_UI_BOOKMARKS_UNDO_MANAGER_BRIDGE_OBSERVER_H_ -#include "base/compiler_specific.h" #include "components/undo/undo_manager_observer.h" // The ObjC translations of the C++ observer callbacks are defined here.
diff --git a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_provider.swift b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_provider.swift index 4610f9a..4aed194 100644 --- a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_provider.swift +++ b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_provider.swift
@@ -26,7 +26,8 @@ // hierarchy when the view is displayed or removed. lazy var viewController: UIViewController = { var viewController = UIHostingController( - rootView: BringAndroidTabsPromptBottomMessageView(tabsCount: self.tabsCount, provider: self)) + rootView: BringAndroidTabsPromptBottomMessageView( + tabsCount: self.tabsCount, provider: self)) // Workaround of SwiftUI/UIKit interoperality limitation that the topmost // view always have an opaque background. viewController.view.backgroundColor = UIColor.clear
diff --git a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_view.swift b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_view.swift index 72e5faee6..6a7aa6a7 100644 --- a/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_view.swift +++ b/ios/chrome/browser/ui/bring_android_tabs/bring_android_tabs_prompt_bottom_message_view.swift
@@ -11,6 +11,7 @@ private let kPromptCornerRadius: CGFloat = 20 private let kIconPadding: CGFloat = 12 private let kTextVerticalSpacing: CGFloat = 12 +private let kTextMinimumScaleFactor: CGFloat = 0.5 // The view object for "Bring Android Tabs" bottom message prompt. struct BringAndroidTabsPromptBottomMessageView: View { @@ -36,6 +37,7 @@ number: self.tabsCount) ) .font(.body) + .minimumScaleFactor(kTextMinimumScaleFactor) Text( L10nUtils.pluralString( messageId: IDS_IOS_BRING_ANDROID_TABS_PROMPT_SUBTITLE, @@ -43,6 +45,7 @@ ) .font(.footnote) .foregroundColor(.textSecondary) + .minimumScaleFactor(kTextMinimumScaleFactor) } .padding(.top, kTextVerticalSpacing - kPromptInnerPadding) Spacer() @@ -59,7 +62,9 @@ L10nUtils.pluralString( messageId: IDS_IOS_BRING_ANDROID_TABS_PROMPT_REVIEW_TABS_BUTTON_BOTTOM_MESSAGE, - number: self.tabsCount)) + number: self.tabsCount) + ) + .minimumScaleFactor(kTextMinimumScaleFactor) Spacer() Image(systemName: kChevronForwardSymbol) .foregroundColor(.textSecondary)
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index 5d60e25..7c1e4d0c 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -330,6 +330,7 @@ "//ios/chrome/browser/url_loading:url_loading", "//ios/chrome/browser/web", "//ios/chrome/browser/web:delegate", + "//ios/chrome/browser/web:page_placeholder", "//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list:agents", "//ios/chrome/browser/web_state_list:test_support",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index b47c045..7712301 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -145,6 +145,7 @@ #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.h" #import "ios/chrome/browser/ui/qr_scanner/qr_scanner_legacy_coordinator.h" #import "ios/chrome/browser/ui/reading_list/reading_list_coordinator.h" +#import "ios/chrome/browser/ui/reading_list/reading_list_coordinator_delegate.h" #import "ios/chrome/browser/ui/recent_tabs/recent_tabs_coordinator.h" #import "ios/chrome/browser/ui/sad_tab/sad_tab_coordinator.h" #import "ios/chrome/browser/ui/safe_browsing/safe_browsing_coordinator.h" @@ -177,12 +178,14 @@ #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" #import "ios/chrome/browser/web/font_size/font_size_tab_helper.h" +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/browser/web/print/print_tab_helper.h" #import "ios/chrome/browser/web/repost_form_tab_helper.h" #import "ios/chrome/browser/web/repost_form_tab_helper_delegate.h" #import "ios/chrome/browser/web/web_navigation_browser_agent.h" #import "ios/chrome/browser/web/web_state_delegate_browser_agent.h" +#import "ios/chrome/browser/web/web_state_update_browser_agent.h" #import "ios/chrome/browser/web_state_list/tab_insertion_browser_agent.h" #import "ios/chrome/browser/web_state_list/view_source_browser_agent.h" #import "ios/chrome/browser/web_state_list/web_usage_enabler/web_usage_enabler_browser_agent.h" @@ -237,6 +240,7 @@ PromosManagerCommands, PolicyChangeCommands, PreloadControllerDelegate, + ReadingListCoordinatorDelegate, RepostFormTabHelperDelegate, SigninPresenter, SnapshotGeneratorDelegate, @@ -471,6 +475,15 @@ [self createViewController]; [self updateViewControllerDependencies]; + + // Force the view load at a specific time. + // TODO(crbug.com/1431971): This should ideally go in createViewController, + // but part of creating the view controller involves setting up a dispatch to + // a command that isn't handled until updateViewControllerDependencies + // (OmniboxCommands). + BOOL created = [self ensureViewIsCreated]; + CHECK(created); + // Independent mediators should start before coordinators so model state is // accurate for any UI that starts up. [self startIndependentMediators]; @@ -562,6 +575,7 @@ [self.printController dismissAnimated:YES]; [self.readingListCoordinator stop]; + self.readingListCoordinator.delegate = nil; self.readingListCoordinator = nil; [self.sharingCoordinator stop]; @@ -670,6 +684,13 @@ _viewController = nil; } +// Ensure BrowserViewController's view is created +- (BOOL)ensureViewIsCreated { + // Call `-view` for the side effect of creating the view. + UIView* view = self.viewController.view; + return view != nil; +} + // Creates the browser view controller dependencies. - (void)createViewControllerDependencies { _dispatcher = self.browser->GetCommandDispatcher(); @@ -893,6 +914,8 @@ type:ToolbarContainerType::kSecondary]; _viewControllerDependencies.safeAreaProvider = [[SafeAreaProvider alloc] initWithBrowser:self.browser]; + _viewControllerDependencies.pagePlaceholderBrowserAgent = + PagePlaceholderBrowserAgent::FromBrowser(self.browser); } - (void)updateViewControllerDependencies { @@ -954,6 +977,7 @@ _viewControllerDependencies.voiceSearchController = nil; _viewControllerDependencies.secondaryToolbarContainerCoordinator = nil; _viewControllerDependencies.safeAreaProvider = nil; + _viewControllerDependencies.pagePlaceholderBrowserAgent = nil; [_bookmarksCoordinator shutdown]; _bookmarksCoordinator = nil; @@ -1192,6 +1216,7 @@ self.promosManagerCoordinator = nil; [self.readingListCoordinator stop]; + self.readingListCoordinator.delegate = nil; self.readingListCoordinator = nil; [self.recentTabsCoordinator stop]; @@ -1439,6 +1464,7 @@ self.readingListCoordinator = [[ReadingListCoordinator alloc] initWithBaseViewController:self.viewController browser:self.browser]; + self.readingListCoordinator.delegate = self; [self.readingListCoordinator start]; } @@ -1508,7 +1534,8 @@ translate::TranslateManager* translateManager = translateClient->GetTranslateManager(); DCHECK(translateManager); - translateManager->ShowTranslateUI(/*auto_translate=*/true); + translateManager->ShowTranslateUI(/*auto_translate=*/true, + /*triggered_from_menu=*/true); } } @@ -2674,4 +2701,12 @@ } } +#pragma mark - ReadingListCoordinatorDelegate + +- (void)closeReadingList { + [self.readingListCoordinator stop]; + self.readingListCoordinator.delegate = nil; + self.readingListCoordinator = nil; +} + @end
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.h b/ios/chrome/browser/ui/browser_view/browser_view_controller.h index ec96b9cb..dd5e454 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.h +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.h
@@ -51,6 +51,7 @@ @class NewTabPageCoordinator; @class LensCoordinator; @protocol OmniboxCommands; +class PagePlaceholderBrowserAgent; @protocol PopupMenuCommands; @class PopupMenuCoordinator; // TODO(crbug.com/1328039): Remove all use of the prerender service from BVC @@ -104,6 +105,7 @@ LayoutGuideCenter* layoutGuideCenter; id<OmniboxCommands> omniboxCommandsHandler; BOOL isOffTheRecord; + PagePlaceholderBrowserAgent* pagePlaceholderBrowserAgent; ReadingListModel* readingModel; UrlLoadingBrowserAgent* urlLoadingBrowserAgent; UrlLoadingNotifierBrowserAgent* urlLoadingNotifierBrowserAgent; @@ -186,13 +188,6 @@ // with. - (void)appendTabAddedCompletion:(ProceduralBlock)tabAddedCompletion; -// Informs the BVC that a new foreground tab is about to be opened. This is -// intended to be called before setWebUsageSuspended:NO in cases where a new tab -// is about to appear in order to allow the BVC to avoid doing unnecessary work -// related to showing the previously selected tab. -// TODO(crbug.com/1329109): Move this to a browser agent or web event mediator. -- (void)expectNewForegroundTab; - // Shows the voice search UI. - (void)startVoiceSearch;
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index bb8cf008..7746e03 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -92,6 +92,7 @@ #import "ios/chrome/browser/url_loading/new_tab_animation_tab_helper.h" #import "ios/chrome/browser/url_loading/url_loading_observer_bridge.h" #import "ios/chrome/browser/url_loading/url_loading_params.h" +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" #import "ios/chrome/browser/web/page_placeholder_tab_helper.h" #import "ios/chrome/browser/web/web_navigation_util.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" @@ -232,10 +233,6 @@ // YES if Voice Search should be started when the new tab animation is // finished. BOOL _startVoiceSearchAfterNewTabAnimation; - // YES if waiting for a foreground tab due to expectNewForegroundTab. - // TODO(crbug.com/1329109): Move this to a browser agent or web event - // mediator. - BOOL _expectingForegroundTab; // Whether or not -shutdown has been called. BOOL _isShutdown; @@ -303,6 +300,9 @@ LayoutGuideCenter* _layoutGuideCenter; ReadingListModel* _readingModel; + + // Used to add or cancel a page placeholder for next navigation. + PagePlaceholderBrowserAgent* _pagePlaceholderBrowserAgent; } // Activates/deactivates the object. This will enable/disable the ability for @@ -507,6 +507,7 @@ self.secondaryToolbarContainerCoordinator = dependencies.secondaryToolbarContainerCoordinator; self.safeAreaProvider = dependencies.safeAreaProvider; + _pagePlaceholderBrowserAgent = dependencies.pagePlaceholderBrowserAgent; dependencies.lensCoordinator.delegate = self; @@ -815,11 +816,6 @@ } } -// TODO(crbug.com/1329109): Move this to a browser agent or web event mediator. -- (void)expectNewForegroundTab { - _expectingForegroundTab = YES; -} - - (void)startVoiceSearch { // Delay Voice Search until new tab animations have finished. if (self.inNewTabAnimation) { @@ -861,12 +857,7 @@ // tab if the caller is about to create one) ends up on screen completely. // Force loading the view in case it was not loaded yet. [self loadViewIfNeeded]; - // TODO(crbug.com/1329109): Move this to a browser agent or web event - // mediator. - if (self.currentWebState && _expectingForegroundTab) { - PagePlaceholderTabHelper::FromWebState(self.currentWebState) - ->AddPlaceholderForNextNavigation(); - } + _pagePlaceholderBrowserAgent->AddPagePlaceholder(); if (self.currentWebState) [self displayWebState:self.currentWebState]; } @@ -2981,9 +2972,10 @@ [self dismissPopups]; } -- (void)webStateSelected:(web::WebState*)webState { - DCHECK(webState); - +- (void)webStateSelected { + if (!self.currentWebState) { + return; + } // Ignore changes while the tab stack view is visible (or while suspended). // The display will be refreshed when this view becomes active again. if (!self.visible || !self.webUsageEnabled) { @@ -2992,21 +2984,9 @@ // TODO(crbug.com/1329088): Trigger this update from the mediator, or (as an // interm step) pass the view to be displayed instead. - [self displayWebState:webState]; - - // TODO(crbug.com/1329109): Move this to a browser agent or web event - // mediator. - if (_expectingForegroundTab && !self.inNewTabAnimation) { - // Now that the new tab has been displayed, return to normal. Rather than - // keep a reference to the previous tab, just turn off preview mode for all - // tabs (since doing so is a no-op for the tabs that don't have it set). - _expectingForegroundTab = NO; - - for (int index = 0; index < self.webStateListSize; ++index) { - web::WebState* webStateAtIndex = self.webStateList->GetWebStateAt(index); - PagePlaceholderTabHelper::FromWebState(webStateAtIndex) - ->CancelPlaceholderForNextNavigation(); - } + [self displayWebState:self.currentWebState]; + if (!self.inNewTabAnimation) { + _pagePlaceholderBrowserAgent->CancelPagePlaceholder(); } } @@ -3151,16 +3131,8 @@ } strongSelf.inNewTabAnimation = NO; - // Use the model's currentWebState here because it is possible that it can - // be reset to a new value before the new Tab animation finished (e.g. - // if another Tab shows a dialog via `dialogPresenter`). However, that - // webState's view hasn't been displayed yet because it was in a new tab - // animation. - web::WebState* currentWebState = strongSelf.currentWebState; - if (currentWebState) { - [strongSelf webStateSelected:currentWebState]; - } + [strongSelf webStateSelected]; if (completion) completion();
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm index 6833d827..caaf082 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_unittest.mm
@@ -64,6 +64,7 @@ #import "ios/chrome/browser/ui/toolbar/toolbar_coordinator_adaptor.h" #import "ios/chrome/browser/url_loading/new_tab_animation_tab_helper.h" #import "ios/chrome/browser/url_loading/url_loading_notifier_browser_agent.h" +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" #import "ios/chrome/browser/web/web_navigation_browser_agent.h" #import "ios/chrome/browser/web/web_state_update_browser_agent.h" #import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h" @@ -138,6 +139,7 @@ LensBrowserAgent::CreateForBrowser(browser_.get()); WebNavigationBrowserAgent::CreateForBrowser(browser_.get()); TabUsageRecorderBrowserAgent::CreateForBrowser(browser_.get()); + PagePlaceholderBrowserAgent::CreateForBrowser(browser_.get()); WebUsageEnablerBrowserAgent::FromBrowser(browser_.get()) ->SetWebUsageEnabled(true); @@ -260,6 +262,8 @@ TabUsageRecorderBrowserAgent::FromBrowser(browser_.get()); web_navigation_browser_agent_ = WebNavigationBrowserAgent::FromBrowser(browser_.get()); + page_placeholder_browser_agent_ = + PagePlaceholderBrowserAgent::FromBrowser(browser_.get()); BrowserViewControllerDependencies dependencies; dependencies.prerenderService = fake_prerender_service_.get(); @@ -287,6 +291,7 @@ initWithBrowser:browser_.get() type:ToolbarContainerType::kSecondary]; dependencies.safeAreaProvider = safe_area_provider_; + dependencies.pagePlaceholderBrowserAgent = page_placeholder_browser_agent_; bvc_ = [[BrowserViewController alloc] initWithBrowser:browser_.get() browserContainerViewController:container_ @@ -384,10 +389,11 @@ TabUsageRecorderBrowserAgent* tab_usage_recorder_browser_agent_; WebNavigationBrowserAgent* web_navigation_browser_agent_; SafeAreaProvider* safe_area_provider_; + PagePlaceholderBrowserAgent* page_placeholder_browser_agent_; }; TEST_F(BrowserViewControllerTest, TestWebStateSelected) { - [bvc_ webStateSelected:ActiveWebState()]; + [bvc_ webStateSelected]; EXPECT_EQ(ActiveWebState()->GetView().superview, container_.view); EXPECT_TRUE(ActiveWebState()->IsVisible()); }
diff --git a/ios/chrome/browser/ui/browser_view/tab_consumer.h b/ios/chrome/browser/ui/browser_view/tab_consumer.h index 0454b99e..227fb6f4 100644 --- a/ios/chrome/browser/ui/browser_view/tab_consumer.h +++ b/ios/chrome/browser/ui/browser_view/tab_consumer.h
@@ -33,8 +33,7 @@ // Tells the consumer to make any required view changes when a `webState` is // selected in the WebStateList. The notification will not be sent when the // `webState` is already the selected WebState. -// TODO(crbug.com/1417570): Remove webState from this call. -- (void)webStateSelected:(web::WebState*)webState; +- (void)webStateSelected; // Tells the consumer to make `webState` the currently visible WebState, // displaying its view if BVC is in an active state.
diff --git a/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm b/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm index a345c898..28816874 100644 --- a/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm +++ b/ios/chrome/browser/ui/browser_view/tab_events_mediator.mm
@@ -143,8 +143,6 @@ if (oldWebState) { [self.consumer prepareForNewTabAnimation]; } - // NOTE: webStateSelected expects to always be called with a - // non-null WebState. if (newWebState) { // Activating without inserting an NTP requires starting it in two // scenarios: 1) After doing a batch tab restore (i.e. undo tab removals, @@ -152,7 +150,7 @@ // WebState is showing the NTP. BrowserCoordinator's -setActive: only starts // the NTP if it is the active view. [self startNTPIfNeededForActiveWebState:newWebState]; - [self.consumer webStateSelected:newWebState]; + [self.consumer webStateSelected]; } }
diff --git a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn index 733577e..654234b 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn +++ b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn
@@ -33,9 +33,9 @@ "//ios/chrome/browser/promos_manager:features", "//ios/chrome/browser/promos_manager:types", "//ios/chrome/browser/shared/coordinator/chrome_coordinator", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/ui/util", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/ui/promos_manager:promos", "//ios/public/provider/chrome/browser/branded_images:branded_images_api", "//ios/public/provider/chrome/browser/password_auto_fill:password_auto_fill_api",
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.h b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.h index 6c415993..688627e 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.h +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.h
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" class PrefService; class PromosManager;
diff --git a/ios/chrome/browser/ui/incognito_reauth/BUILD.gn b/ios/chrome/browser/ui/incognito_reauth/BUILD.gn index b017645a..2dc49ee 100644 --- a/ios/chrome/browser/ui/incognito_reauth/BUILD.gn +++ b/ios/chrome/browser/ui/incognito_reauth/BUILD.gn
@@ -64,9 +64,9 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/application_context", "//ios/chrome/browser/prefs:pref_names", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/web_state_list", "//ios/chrome/common/ui/reauthentication", "//ios/web/public",
diff --git a/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h b/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h index b15311c5..50bfada 100644 --- a/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h +++ b/ios/chrome/browser/ui/incognito_reauth/incognito_reauth_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_INCOGNITO_REAUTH_INCOGNITO_REAUTH_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_INCOGNITO_REAUTH_INCOGNITO_REAUTH_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" #import "ios/chrome/browser/ui/incognito_reauth/incognito_reauth_commands.h"
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn index c38738a..659478a 100644 --- a/ios/chrome/browser/ui/main/BUILD.gn +++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -4,22 +4,6 @@ import("//ios/build/chrome_build.gni") -source_set("observing_scene_agent") { - configs += [ "//build/config/compiler:enable_arc" ] - - sources = [ - "observing_scene_state_agent.h", - "observing_scene_state_agent.mm", - ] - - frameworks = [ "UIKit.framework" ] - - public_deps = [ - "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", - "//ios/chrome/browser/shared/coordinator/scene:scene_state_observer", - ] -} - source_set("default_browser_scene_agent") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ @@ -27,12 +11,12 @@ "default_browser_scene_agent.mm", ] deps = [ - ":observing_scene_agent", "//base", "//ios/chrome/app/application_delegate:app_state_header", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/promos_manager", "//ios/chrome/browser/promos_manager:constants", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/public/features", @@ -61,8 +45,8 @@ "layout_guide_scene_agent.mm", ] deps = [ - ":observing_scene_agent", "//base", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/ui/util:util_swift", ] frameworks = [ "UIKit.framework" ] @@ -90,10 +74,10 @@ ] deps = [ - ":observing_scene_agent", "//base", "//ios/chrome/app:blocking_scene_commands", "//ios/chrome/app/application_delegate:app_state_header", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/ui/blocking_overlay", ]
diff --git a/ios/chrome/browser/ui/main/default_browser_scene_agent.h b/ios/chrome/browser/ui/main/default_browser_scene_agent.h index 2604209..151a72dd 100644 --- a/ios/chrome/browser/ui/main/default_browser_scene_agent.h +++ b/ios/chrome/browser/ui/main/default_browser_scene_agent.h
@@ -6,7 +6,7 @@ #define IOS_CHROME_BROWSER_UI_MAIN_DEFAULT_BROWSER_SCENE_AGENT_H_ #import "ios/chrome/browser/promos_manager/promos_manager.h" -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @class CommandDispatcher; @class DefaultBrowserPromoNonModalScheduler;
diff --git a/ios/chrome/browser/ui/main/layout_guide_scene_agent.h b/ios/chrome/browser/ui/main/layout_guide_scene_agent.h index b5201040..d58724048 100644 --- a/ios/chrome/browser/ui/main/layout_guide_scene_agent.h +++ b/ios/chrome/browser/ui/main/layout_guide_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_MAIN_LAYOUT_GUIDE_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_MAIN_LAYOUT_GUIDE_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @class LayoutGuideCenter;
diff --git a/ios/chrome/browser/ui/main/ui_blocker_scene_agent.h b/ios/chrome/browser/ui/main/ui_blocker_scene_agent.h index a578196..57599b7 100644 --- a/ios/chrome/browser/ui/main/ui_blocker_scene_agent.h +++ b/ios/chrome/browser/ui/main/ui_blocker_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_MAIN_UI_BLOCKER_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_MAIN_UI_BLOCKER_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" // A scene agent that shows a UI overlay on the scene based on modal overlay // show/hide events.
diff --git a/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h b/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h index 996bf5f..6c7f68b 100644 --- a/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h +++ b/ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #include "components/omnibox/browser/omnibox_client.h" #include "ios/chrome/browser/autocomplete/autocomplete_scheme_classifier_impl.h"
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc index a6aa188..d198d1a 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc +++ b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc
@@ -24,6 +24,10 @@ "OmniboxMultilineSearchSuggest", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kOmniboxTailSuggest, + "OmniboxTailSuggest", + base::FEATURE_DISABLED_BY_DEFAULT); + bool IsIpadPopoutOmniboxEnabled() { return base::FeatureList::IsEnabled(kEnablePopoutOmniboxIpad) && ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h index 030a656e..02e879a 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h
@@ -20,6 +20,9 @@ // Feature flag to enable multiple lines for search suggestions in omnibox. BASE_DECLARE_FEATURE(kOmniboxMultilineSearchSuggest); +// Feature flag to enable tail suggestions in the omnibox. +BASE_DECLARE_FEATURE(kOmniboxTailSuggest); + // Returns if kEnablePopoutOmniboxIpad feature is enabled. bool IsIpadPopoutOmniboxEnabled(); #endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_UI_FEATURES_H_
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm index 43714d7..b485ad1 100644 --- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm +++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -21,7 +21,6 @@ #import "ios/chrome/browser/ui/fullscreen/scoped_fullscreen_disabler.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_gesture_recognizer.h" #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.h" -#import "ios/chrome/browser/ui/page_info/page_info_constants.h" #import "ios/chrome/browser/ui/side_swipe/side_swipe_controller.h" #import "ios/chrome/browser/ui/voice/voice_search_notification_names.h" #import "ios/public/provider/chrome/browser/fullscreen/fullscreen_api.h" @@ -304,7 +303,6 @@ _lockNotificationsCounterparts = @{ UIKeyboardWillHideNotification : UIKeyboardWillShowNotification, kVoiceSearchWillHideNotification : kVoiceSearchWillShowNotification, - kPageInfoWillHideNotification : kPageInfoWillShowNotification, kSideSwipeDidStopNotification : kSideSwipeWillStartNotification };
diff --git a/ios/chrome/browser/ui/page_info/page_info_constants.h b/ios/chrome/browser/ui/page_info/page_info_constants.h index d289f5c6..32886cf06 100644 --- a/ios/chrome/browser/ui/page_info/page_info_constants.h +++ b/ios/chrome/browser/ui/page_info/page_info_constants.h
@@ -10,9 +10,4 @@ // Accessibility identifier for the page info view. extern NSString* const kPageInfoViewAccessibilityIdentifier; -// Notification sent when the page info is shown. -extern NSString* const kPageInfoWillShowNotification; -// Notification sent when the page info is hidden. -extern NSString* const kPageInfoWillHideNotification; - #endif // IOS_CHROME_BROWSER_UI_PAGE_INFO_PAGE_INFO_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/page_info/page_info_constants.mm b/ios/chrome/browser/ui/page_info/page_info_constants.mm index 617c63c..b5fda6a 100644 --- a/ios/chrome/browser/ui/page_info/page_info_constants.mm +++ b/ios/chrome/browser/ui/page_info/page_info_constants.mm
@@ -10,9 +10,3 @@ NSString* const kPageInfoViewAccessibilityIdentifier = @"PageInfoViewAccessibilityIdentifier"; - -NSString* const kPageInfoWillShowNotification = - @"kPageInfoWillShowNotification"; - -NSString* const kPageInfoWillHideNotification = - @"kPageInfoWillHideNotification";
diff --git a/ios/chrome/browser/ui/policy/BUILD.gn b/ios/chrome/browser/ui/policy/BUILD.gn index b28a3cbc..dfccbfda 100644 --- a/ios/chrome/browser/ui/policy/BUILD.gn +++ b/ios/chrome/browser/ui/policy/BUILD.gn
@@ -28,12 +28,12 @@ "//ios/chrome/browser/policy", "//ios/chrome/browser/policy:policy_util", "//ios/chrome/browser/prefs:pref_names", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", "//ios/chrome/browser/ui/authentication/signin", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/ui/policy/user_policy", "//ios/chrome/browser/ui/scoped_ui_blocker", "//ui/base",
diff --git a/ios/chrome/browser/ui/policy/signin_policy_scene_agent.h b/ios/chrome/browser/ui/policy/signin_policy_scene_agent.h index 6d11f4c..cef223f 100644 --- a/ios/chrome/browser/ui/policy/signin_policy_scene_agent.h +++ b/ios/chrome/browser/ui/policy/signin_policy_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_POLICY_SIGNIN_POLICY_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_POLICY_SIGNIN_POLICY_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @protocol SceneUIProvider; @protocol ApplicationCommands;
diff --git a/ios/chrome/browser/ui/policy/user_policy_scene_agent.h b/ios/chrome/browser/ui/policy/user_policy_scene_agent.h index 3e680c3..8008a94 100644 --- a/ios/chrome/browser/ui/policy/user_policy_scene_agent.h +++ b/ios/chrome/browser/ui/policy/user_policy_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_POLICY_USER_POLICY_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_POLICY_USER_POLICY_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @protocol SceneUIProvider; class AuthenticationService;
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn index f0d4a906..207dd92 100644 --- a/ios/chrome/browser/ui/popup_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -220,6 +220,7 @@ "//ios/chrome/browser/find_in_page:features", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/ui/settings:constants", + "//ios/chrome/test:eg_test_support+eg2", "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/web/common:features",
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm index 45999d4..e5013c4 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
@@ -13,6 +13,7 @@ #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/web_http_server_chrome_test_case.h" +#import "ios/chrome/test/scoped_eg_synchronization_disabler.h" #import "ios/testing/earl_grey/app_launch_manager.h" #import "ios/testing/earl_grey/earl_grey_test.h" #import "ios/web/public/test/http_server/http_server.h" @@ -228,15 +229,26 @@ // The IPH appears immediately on startup, so don't open a new tab when the // app starts up. [[self class] testForStartup]; - [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config]; - [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: - grey_accessibilityID(@"BubbleViewLabelIdentifier")]; + // Scope for the synchronization disabled. + { + ScopedSynchronizationDisabler syncDisabler; - // Open the tools menu and verify the second tooltip is visible. - [ChromeEarlGreyUI openToolsMenu]; - [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: - grey_accessibilityID(@"BubbleViewLabelIdentifier")]; + [[AppLaunchManager sharedManager] + ensureAppLaunchedWithConfiguration:config]; + + // The app relaunch (to enable a feature flag) may take a while, therefore + // the timeout is extended to 15 seconds. + [ChromeEarlGrey + waitForUIElementToAppearWithMatcher:grey_accessibilityID( + @"BubbleViewLabelIdentifier") + timeout:base::Seconds(15)]; + + // Open the tools menu and verify the second tooltip is visible. + [ChromeEarlGreyUI openToolsMenu]; + [ChromeEarlGrey waitForSufficientlyVisibleElementWithMatcher: + grey_accessibilityID(@"BubbleViewLabelIdentifier")]; + } // End of the sync disabler scope. } @end
diff --git a/ios/chrome/browser/ui/price_notifications/price_notifications_price_tracking_egtest.mm b/ios/chrome/browser/ui/price_notifications/price_notifications_price_tracking_egtest.mm index 7f397934..277fc0c 100644 --- a/ios/chrome/browser/ui/price_notifications/price_notifications_price_tracking_egtest.mm +++ b/ios/chrome/browser/ui/price_notifications/price_notifications_price_tracking_egtest.mm
@@ -51,6 +51,27 @@ assertWithMatcher:grey_notNil()]; } +- (void)testPriceTrackingIsNotVisibleInIncognito { + CGFloat const kMenuScrollDisplacement = 150; + id<GREYAction> scrollRight = + grey_scrollInDirection(kGREYDirectionRight, kMenuScrollDisplacement); + id<GREYAction> scrollDown = + grey_scrollInDirection(kGREYDirectionDown, kMenuScrollDisplacement); + id<GREYMatcher> interactableSettingsButton = + grey_allOf(chrome_test_util::PriceNotificationsDestinationButton(), + grey_interactable(), nil); + id<GREYAction> scrollAction = + [ChromeEarlGrey isNewOverflowMenuEnabled] ? scrollRight : scrollDown; + + [self signinPriceTrackingUser]; + [ChromeEarlGreyUI openNewIncognitoTab]; + [ChromeEarlGreyUI openToolsMenu]; + [[[EarlGrey selectElementWithMatcher:interactableSettingsButton] + usingSearchAction:scrollAction + onElementWithMatcher:chrome_test_util::ToolsMenuView()] + assertWithMatcher:grey_nil()]; +} + #pragma mark - Helpers // Opens price tracking UI from the overflow menu carousel.
diff --git a/ios/chrome/browser/ui/price_notifications/price_notifications_table_view_controller.mm b/ios/chrome/browser/ui/price_notifications/price_notifications_table_view_controller.mm index a292f68..57f8fba0 100644 --- a/ios/chrome/browser/ui/price_notifications/price_notifications_table_view_controller.mm +++ b/ios/chrome/browser/ui/price_notifications/price_notifications_table_view_controller.mm
@@ -187,8 +187,9 @@ if (trackableItem && !currentlyTracking) { [self addItem:trackableItem - toBeginning:YES - ofSection:SectionIdentifierTrackableItemsOnCurrentSite]; + toBeginning:YES + ofSection:SectionIdentifierTrackableItemsOnCurrentSite + withRowAnimation:UITableViewRowAnimationAutomatic]; } if (!self.viewIfLoaded.window) { @@ -206,32 +207,38 @@ _shouldHideLoadingState = YES; [self initializeTableViewModelIfNeeded]; [self removeLoadingState]; - BOOL shouldReloadSection = NO; TableViewModel* model = self.tableViewModel; - if (!_hasTrackedItems) { [model setHeader: [self createHeaderForSectionIndex:SectionIdentifierTrackedItems isEmpty:NO] forSectionWithIdentifier:SectionIdentifierTrackedItems]; - [model setHeader:[self createHeaderForSectionIndex: - SectionIdentifierTableViewHeader - isEmpty:NO] - forSectionWithIdentifier:SectionIdentifierTableViewHeader]; - shouldReloadSection = YES; - } - _hasTrackedItems = YES; - [self addItem:trackedItem - toBeginning:beginning - ofSection:SectionIdentifierTrackedItems]; - if (!self.viewIfLoaded.window || !shouldReloadSection) { + trackedItem.type = ItemTypeListItem; + trackedItem.delegate = self; + if (beginning) { + [self.tableViewModel insertItem:trackedItem + inSectionWithIdentifier:SectionIdentifierTrackedItems + atIndex:0]; + } else { + [self.tableViewModel addItem:trackedItem + toSectionWithIdentifier:SectionIdentifierTrackedItems]; + } + + if (self.viewIfLoaded.window) { + [self.tableView reloadSections:[self createIndexSetForSectionIdentifiers: + {SectionIdentifierTrackedItems}] + withRowAnimation:UITableViewRowAnimationFade]; + } + _hasTrackedItems = YES; return; } - [self.tableView reloadSections:[self createIndexSetForSectionIdentifiers: - {SectionIdentifierTrackedItems, - SectionIdentifierTableViewHeader}] - withRowAnimation:UITableViewRowAnimationAutomatic]; + + _hasTrackedItems = YES; + [self addItem:trackedItem + toBeginning:beginning + ofSection:SectionIdentifierTrackedItems + withRowAnimation:UITableViewRowAnimationTop]; } - (void)didStopPriceTrackingItem:(PriceNotificationsTableViewItem*)trackedItem @@ -240,7 +247,6 @@ SectionIdentifier trackedSection = SectionIdentifierTrackedItems; SectionIdentifier trackableSection = SectionIdentifierTrackableItemsOnCurrentSite; - std::vector<SectionIdentifier> sectionsToReload; BOOL addItemToTrackableSection = isViewingProductSite && ![model hasItemForItemType:ItemTypeListItem sectionIdentifier:trackableSection]; @@ -250,15 +256,15 @@ [model removeItemWithType:ItemTypeListItem fromSectionWithIdentifier:trackedSection atIndex:index.item]; + BOOL reloadTrackedSection = ![model hasItemForItemType:ItemTypeListItem + sectionIdentifier:trackedSection]; - if (![model hasItemForItemType:ItemTypeListItem - sectionIdentifier:trackedSection]) { + if (reloadTrackedSection) { _hasTrackedItems = NO; [model setHeader: [self createHeaderForSectionIndex:SectionIdentifierTrackedItems isEmpty:YES] forSectionWithIdentifier:trackedSection]; - sectionsToReload.push_back(trackedSection); } if (addItemToTrackableSection) { @@ -269,7 +275,6 @@ [model insertItem:trackedItem inSectionWithIdentifier:trackableSection atIndex:0]; - sectionsToReload.push_back(trackableSection); } NSString* messageText = l10n_util::GetNSString( @@ -284,22 +289,30 @@ return; } - if (addItemToTrackableSection) { - NSIndexPath* trackableSectionIndex = - [model indexPathForItemType:ItemTypeListItem - sectionIdentifier:trackableSection]; - [self.tableView moveRowAtIndexPath:index toIndexPath:trackableSectionIndex]; - } + [self.tableView + performBatchUpdates:^{ + UITableViewRowAnimation animation = UITableViewRowAnimationMiddle; + if (addItemToTrackableSection) { + [self.tableView + reloadSections:[self createIndexSetForSectionIdentifiers: + {trackableSection}] + withRowAnimation:UITableViewRowAnimationFade]; + animation = UITableViewRowAnimationFade; + } - if (sectionsToReload.size()) { - [self.tableView reloadSections:[self createIndexSetForSectionIdentifiers: - sectionsToReload] - withRowAnimation:UITableViewRowAnimationAutomatic]; - return; - } + if (reloadTrackedSection) { + [self.tableView + reloadSections: + [self createIndexSetForSectionIdentifiers:{trackedSection}] + withRowAnimation:UITableViewRowAnimationFade]; + return; + } - [self.tableView deleteRowsAtIndexPaths:@[ index ] - withRowAnimation:UITableViewRowAnimationAutomatic]; + [self.tableView deleteRowsAtIndexPaths:@[ index ] + withRowAnimation:animation]; + } + completion:^(BOOL completion){ + }]; } - (void)didStartPriceTrackingForItem: @@ -322,9 +335,8 @@ [self.tableView reloadSections:[self createIndexSetForSectionIdentifiers: - {SectionIdentifierTableViewHeader, - SectionIdentifierTrackableItemsOnCurrentSite}] - withRowAnimation:UITableViewRowAnimationAutomatic]; + {SectionIdentifierTrackableItemsOnCurrentSite}] + withRowAnimation:UITableViewRowAnimationFade]; [self addTrackedItem:trackableItem toBeginning:YES]; } @@ -357,8 +369,9 @@ // Adds an item to `sectionID` and displays it to the UI. - (void)addItem:(PriceNotificationsTableViewItem*)item - toBeginning:(BOOL)toBeginning - ofSection:(SectionIdentifier)sectionID { + toBeginning:(BOOL)toBeginning + ofSection:(SectionIdentifier)sectionID + withRowAnimation:(UITableViewRowAnimation)animation { if (sectionID == SectionIdentifierTrackableItemsOnCurrentSite && [self.tableViewModel hasItemForItemType:ItemTypeListItem @@ -383,7 +396,7 @@ [self.tableView insertRowsAtIndexPaths:@[ [self.tableViewModel indexPathForItem:item] ] - withRowAnimation:UITableViewRowAnimationAutomatic]; + withRowAnimation:animation]; } // Returns a TableViewHeaderFooterItem that displays the title for the section @@ -456,14 +469,17 @@ emptyTrackedItem.loading = YES; emptyTrackedItem.tracking = YES; [self addItem:emptyTrackableItem - toBeginning:YES - ofSection:SectionIdentifierTrackableItemsOnCurrentSite]; + toBeginning:YES + ofSection:SectionIdentifierTrackableItemsOnCurrentSite + withRowAnimation:UITableViewRowAnimationAutomatic]; [self addItem:emptyTrackedItem - toBeginning:YES - ofSection:SectionIdentifierTrackedItems]; + toBeginning:YES + ofSection:SectionIdentifierTrackedItems + withRowAnimation:UITableViewRowAnimationAutomatic]; [self addItem:emptyTrackedItem - toBeginning:YES - ofSection:SectionIdentifierTrackedItems]; + toBeginning:YES + ofSection:SectionIdentifierTrackedItems + withRowAnimation:UITableViewRowAnimationAutomatic]; _displayedLoadingState = YES; }
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn index 780f7613..90a5e61 100644 --- a/ios/chrome/browser/ui/promos_manager/BUILD.gn +++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -34,9 +34,9 @@ ] deps = [ "//ios/chrome/app/application_delegate:app_state_header", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/public/commands", - "//ios/chrome/browser/ui/main:observing_scene_agent", ] }
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_scene_agent.h b/ios/chrome/browser/ui/promos_manager/promos_manager_scene_agent.h index 9e760129..05f9328 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_scene_agent.h +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_PROMOS_MANAGER_PROMOS_MANAGER_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_PROMOS_MANAGER_PROMOS_MANAGER_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" @class CommandDispatcher;
diff --git a/ios/chrome/browser/ui/reading_list/BUILD.gn b/ios/chrome/browser/ui/reading_list/BUILD.gn index a573c0c..0171ba6 100644 --- a/ios/chrome/browser/ui/reading_list/BUILD.gn +++ b/ios/chrome/browser/ui/reading_list/BUILD.gn
@@ -6,6 +6,7 @@ sources = [ "reading_list_coordinator.h", "reading_list_coordinator.mm", + "reading_list_coordinator_delegate.h", "reading_list_list_item_custom_action_factory.h", "reading_list_list_item_custom_action_factory.mm", "reading_list_list_item_factory.h",
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_app_interface.h b/ios/chrome/browser/ui/reading_list/reading_list_app_interface.h index 76414dc9..ae12092 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_app_interface.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_app_interface.h
@@ -8,8 +8,6 @@ #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> -#include "base/compiler_specific.h" - // ReadingListAppInterface contains the app-side // implementation for helpers. These helpers are compiled into // the app binary and can be called from either app or test code.
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.h b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.h index 75b1b11..083aa86d29 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.h
@@ -6,10 +6,14 @@ #define IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COORDINATOR_H_ #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" +#import "ios/chrome/browser/ui/reading_list/reading_list_coordinator_delegate.h" // Coordinator for Reading List, displaying the Reading List when starting. @interface ReadingListCoordinator : ChromeCoordinator +// The delegate handling coordinator dismissal. +@property(nonatomic, weak) id<ReadingListCoordinatorDelegate> delegate; + @end #endif // IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index f9de946..26a112f 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -213,7 +213,7 @@ - (void)dismissButtonTapped { base::RecordAction(base::UserMetricsAction("MobileReadingListClose")); - [self stop]; + [_delegate closeReadingList]; } - (void)stop { @@ -226,6 +226,9 @@ self.tableViewController = nil; self.navigationController = nil; + [self.mediator disconnect]; + self.mediator = nil; + [self.sharingCoordinator stop]; self.sharingCoordinator = nil; @@ -252,7 +255,7 @@ - (void)dismissReadingListListViewController:(UIViewController*)viewController { DCHECK_EQ(self.tableViewController, viewController); [self.tableViewController willBeDismissed]; - [self stop]; + [_delegate closeReadingList]; } - (void)readingListListViewController:(UIViewController*)viewController @@ -382,7 +385,7 @@ UrlLoadingBrowserAgent::FromBrowser(self.browser)->Load(params); } - [self stop]; + [_delegate closeReadingList]; } - (void)openItemOfflineInNewTab:(id<ReadingListListItem>)item {
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator_delegate.h b/ios/chrome/browser/ui/reading_list/reading_list_coordinator_delegate.h new file mode 100644 index 0000000..1009c72e6 --- /dev/null +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator_delegate.h
@@ -0,0 +1,18 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COORDINATOR_DELEGATE_H_ +#define IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COORDINATOR_DELEGATE_H_ + +@class ReadingListCoordinator; + +// Delegate for ReadingListCoordinator. +@protocol ReadingListCoordinatorDelegate + +// Called when the reading list should be dismissed. +- (void)closeReadingList; + +@end + +#endif // IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_COORDINATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_mediator.h b/ios/chrome/browser/ui/reading_list/reading_list_mediator.h index ce034d5a..5c8779d 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_mediator.h +++ b/ios/chrome/browser/ui/reading_list/reading_list_mediator.h
@@ -36,6 +36,9 @@ // Marks the entry with `URL` as read. - (void)markEntryRead:(const GURL&)URL; +// Disconnects the mediator and clear internal dependencies. +- (void)disconnect; + @end #endif // IOS_CHROME_BROWSER_UI_READING_LIST_READING_LIST_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm b/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm index baf6da9..ed6df2cf 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_mediator.mm
@@ -60,10 +60,6 @@ @implementation ReadingListMediator @synthesize dataSink = _dataSink; -@synthesize model = _model; -@synthesize shouldMonitorModel = _shouldMonitorModel; -@synthesize itemFactory = _itemFactory; -@synthesize faviconLoader = _faviconLoader; #pragma mark - Public @@ -92,6 +88,14 @@ self.model->SetReadStatusIfExists(URL, true); } +- (void)disconnect { + _dataSink = nil; + _model = nullptr; + _itemFactory = nil; + _faviconLoader = nullptr; + _modelBridge.reset(); +} + #pragma mark - ReadingListDataSource - (BOOL)isItemRead:(id<ReadingListListItem>)item {
diff --git a/ios/chrome/browser/ui/settings/bandwidth/bandwidth_management_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/bandwidth/bandwidth_management_table_view_controller_unittest.mm index 01aa58b2..8780c4e 100644 --- a/ios/chrome/browser/ui/settings/bandwidth/bandwidth_management_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/bandwidth/bandwidth_management_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/run_loop.h" #import "base/test/test_simple_task_runner.h" #import "components/pref_registry/pref_registry_syncable.h"
diff --git a/ios/chrome/browser/ui/settings/bandwidth/dataplan_usage_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/bandwidth/dataplan_usage_table_view_controller_unittest.mm index 795ae8a..d128609 100644 --- a/ios/chrome/browser/ui/settings/bandwidth/dataplan_usage_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/bandwidth/dataplan_usage_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/files/file_path.h" #import "base/memory/ref_counted.h" #import "base/test/task_environment.h"
diff --git a/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.h b/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.h index 726734a..c535d4f 100644 --- a/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.h +++ b/ios/chrome/browser/ui/settings/passphrase_table_view_controller_test.h
@@ -7,7 +7,6 @@ #include "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h" -#include "base/compiler_specific.h" #include "components/keyed_service/core/keyed_service.h" #include "components/sync/engine/cycle/sync_cycle_snapshot.h" #include "google_apis/gaia/google_service_auth_error.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm index 65925b3..f1aebd6b 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -279,7 +279,7 @@ browser:self.browser title:title message:message - rect:anchorView.frame + rect:anchorView.bounds view:anchorView] : [[ActionSheetCoordinator alloc] initWithBaseViewController:self.viewController @@ -318,7 +318,7 @@ browser:self.browser title:actionSheetTitle message:actionSheetMessage - rect:anchorView.frame + rect:anchorView.bounds view:anchorView]; __weak __typeof(self) weakSelf = self;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm index 146fb8f..d19b387 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_mediator.mm
@@ -408,8 +408,13 @@ } } +// Returns a credential that a) is saved in the user account, and b) has the +// same website/username as `password`, but a different password value. - (absl::optional<password_manager::CredentialUIEntry>) conflictingAccountPassword:(PasswordDetails*)password { + // All credentials for the same website are in `_credentials` due to password + // grouping. So it's enough to search that reduced list and not all saved + // passwords. auto it = base::ranges::find_if( _credentials, [password](const password_manager::CredentialUIEntry& credential) {
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm index 0599d2d..78f5efc 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -93,6 +93,28 @@ } // namespace +#pragma mark - TableViewTextItemWithConfigureHandler + +// TableViewTextItem supporting a handler for when a cell is configured for +// display. +@interface TableViewTextItemWithConfigureHandler : TableViewTextItem + +@property(nonatomic, copy) void (^configureCellHandler)(); + +@end + +@implementation TableViewTextItemWithConfigureHandler + +- (void)configureCell:(TableViewCell*)tableCell + withStyler:(ChromeTableViewStyler*)styler { + [super configureCell:tableCell withStyler:styler]; + self.configureCellHandler(); +} + +@end + +#pragma mark - PasswordDetailsInfoItem + // Contains the website, username and password text items. @interface PasswordDetailsInfoItem : NSObject @@ -115,6 +137,8 @@ @implementation PasswordDetailsInfoItem @end +#pragma mark - PasswordDetailsTableViewController + @interface PasswordDetailsTableViewController () < TableViewTextEditItemDelegate, TableViewMultiLineTextEditItemDelegate, @@ -162,6 +186,11 @@ // navigates to the password list view. @property(nonatomic, strong) NSTimer* authValidityTimer; +// Used to avoid recording the "move to account offered" histogram twice for +// the same credential. +@property(nonatomic, strong) + NSMutableSet<NSString*>* usernamesWithMoveToAccountOfferRecorded; + @end @implementation PasswordDetailsTableViewController @@ -181,6 +210,7 @@ [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; _titleLabel.adjustsFontForContentSizeCategory = YES; self.navigationItem.titleView = _titleLabel; + self.usernamesWithMoveToAccountOfferRecorded = [[NSMutableSet alloc] init]; } return self; } @@ -398,15 +428,46 @@ return item; } -- (TableViewTextItem*)moveToAccountButtonItem { - TableViewTextItem* item = [[TableViewTextItem alloc] - initWithType:PasswordDetailsItemTypeMoveToAccountButton]; +- (TableViewTextItemWithConfigureHandler*)moveToAccountButtonItem: + (NSString*)usernameForMetrics { + TableViewTextItemWithConfigureHandler* item = + [[TableViewTextItemWithConfigureHandler alloc] + initWithType:PasswordDetailsItemTypeMoveToAccountButton]; item.text = l10n_util::GetNSString(IDS_IOS_SAVE_PASSWORD_TO_ACCOUNT_STORE); item.textColor = self.tableView.editing ? [UIColor colorNamed:kTextSecondaryColor] : [UIColor colorNamed:kBlueColor]; item.enabled = !self.tableView.editing; item.accessibilityIdentifier = kMovePasswordToAccountButtonId; + + // Register a handler to record the "move to account offered" metric. + // 1) The metric mustn't be recorded for credentials that are not visible in + // the scroll view yet, so do it when the button cell is really being + // configured for display (note: the button, not the text that comes before). + // Recording during cell construction instead wouldn't work, cells can be + // reused. Anyway, scrolling isn't a big concern in practice because the + // number of credentials in this page is usually small. + // 2) The metric mustn't be recorded for the same credential again upon model + // changes, e.g. credential removed or moved to account. Those events + // (re)configure cells and trigger the handler, so check if this username was + // already seen before recording. The username is the closest thing to a + // stable identifier of the credential. It can be edited, leading to a second + // recording, but that shouldn't happen often. This approach is good enough. + __weak __typeof(self) weakSelf = self; + item.configureCellHandler = ^{ + if (!weakSelf || [weakSelf.usernamesWithMoveToAccountOfferRecorded + containsObject:usernameForMetrics]) { + return; + } + + [weakSelf.usernamesWithMoveToAccountOfferRecorded + addObject:usernameForMetrics]; + // TODO(crbug.com/1392747): Use a common function for recording sites. + base::UmaHistogramEnumeration( + "PasswordManager.AccountStorage.MoveToAccountStoreFlowOffered", + password_manager::metrics_util::MoveToAccountStoreTrigger:: + kExplicitlyTriggeredInSettings); + }; return item; } @@ -1147,7 +1208,7 @@ if (passwordDetails.shouldOfferToMoveToAccount) { [model addItem:[self moveToAccountRecommendationItem] toSectionWithIdentifier:sectionForMoveCredential]; - [model addItem:[self moveToAccountButtonItem] + [model addItem:[self moveToAccountButtonItem:passwordDetails.username] toSectionWithIdentifier:sectionForMoveCredential]; }
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm index 42d21733..c4b3d58 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -2707,7 +2707,10 @@ NSString* text = l10n_util::GetNSString(IDS_IOS_CHECK_PASSWORDS); NSString* detailText = base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( - IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT, 1)); + password_manager::features::IsPasswordCheckupEnabled() + ? IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT + : IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT, + 1)); [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabel([NSString stringWithFormat:@"%@, %@", text,
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm index 9351b448..849655eb 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller.mm
@@ -1416,7 +1416,9 @@ case PasswordCheckStateUnmutedCompromisedPasswords: { _passwordProblemsItem.detailText = base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( - IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT, + IsPasswordCheckupEnabled() + ? IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT + : IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT, self.insecurePasswordsCount)); _passwordProblemsItem.warningState = WarningState::kSevereWarning;
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm index 0aa34d9a..d330359 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_view_controller_unittest.mm
@@ -4,7 +4,6 @@ #import "ios/chrome/browser/ui/settings/password/password_manager_view_controller.h" -#import "base/compiler_specific.h" #import "base/functional/bind.h" #import "base/strings/string_piece.h" #import "base/strings/sys_string_conversions.h" @@ -1054,7 +1053,7 @@ CheckTextCellTextWithId(IDS_IOS_CHECK_PASSWORDS_NOW_BUTTON, GetSectionIndex(SectionIdentifierPasswordCheck), 1); CheckDetailItemTextWithPluralIds( - IDS_IOS_CHECK_PASSWORDS, IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT, 1, + IDS_IOS_CHECK_PASSWORDS, IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT, 1, GetSectionIndex(SectionIdentifierPasswordCheck), 0); SettingsCheckItem* checkPassword = GetTableViewItem(GetSectionIndex(SectionIdentifierPasswordCheck), 0);
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm index 54e2a7d..d696554 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm
@@ -7,6 +7,7 @@ #import "base/check.h" #import "base/check_op.h" #import "base/mac/foundation_util.h" +#import "base/metrics/histogram_functions.h" #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" #import "components/strings/grit/components_strings.h" @@ -608,6 +609,8 @@ } - (void)accountStorageSwitchChanged:(UISwitch*)switchView { + base::UmaHistogramBoolean("PasswordManager.AccountStorageOptInSwitchFlipped", + switchView.on); [self.delegate accountStorageSwitchDidChange:switchView.on]; }
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm index c2c28ac6..3188ba1 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator.mm
@@ -1161,7 +1161,9 @@ : self.passwordCheckManager->GetInsecureCredentials().size(); self.passwordCheckItem.detailText = base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( - IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT, + IsPasswordCheckupEnabled() + ? IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT + : IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT, compromisedPasswordCount)); self.passwordCheckItem.warningState = WarningState::kSevereWarning; break;
diff --git a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm index f97381b..2e9de1b 100644 --- a/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm +++ b/ios/chrome/browser/ui/settings/safety_check/safety_check_mediator_unittest.mm
@@ -509,7 +509,7 @@ [mediator_ reconfigurePasswordCheckItem]; EXPECT_NSEQ(mediator_.passwordCheckItem.detailText, base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( - IDS_IOS_PASSWORD_CHECKUP_COMPROMISED_COUNT, 1))); + IDS_IOS_CHECK_PASSWORDS_COMPROMISED_COUNT, 1))); EXPECT_EQ(mediator_.passwordCheckItem.trailingImage, UnsafeImage()); EXPECT_TRUE( [mediator_.passwordCheckItem.trailingImageTintColor isEqual:RedColor()]);
diff --git a/ios/chrome/browser/ui/settings/settings_app_interface.h b/ios/chrome/browser/ui/settings/settings_app_interface.h index e99ea65..c4d98d42 100644 --- a/ios/chrome/browser/ui/settings/settings_app_interface.h +++ b/ios/chrome/browser/ui/settings/settings_app_interface.h
@@ -7,8 +7,6 @@ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" - // Test specific helpers for settings_egtest.mm. @interface SettingsAppInterface : NSObject
diff --git a/ios/chrome/browser/ui/settings/sync/sync_create_passphrase_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync/sync_create_passphrase_table_view_controller_unittest.mm index 40c6a7ca..87c8f22 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_create_passphrase_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_create_passphrase_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <UIKit/UIKit.h> -#import "base/compiler_specific.h" #import "base/test/ios/wait_util.h" #import "components/strings/grit/components_strings.h" #import "components/sync/test/mock_sync_service.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm index 8f82277..155c70d 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_passphrase_table_view_controller_unittest.mm
@@ -8,7 +8,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/functional/bind.h" #import "base/strings/sys_string_conversions.h" #import "base/test/ios/wait_util.h"
diff --git a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller_unittest.mm index c3e0929..7751a9f5 100644 --- a/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/sync/sync_encryption_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/functional/bind.h" #import "components/strings/grit/components_strings.h" #import "components/sync/test/test_sync_service.h"
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm index 6eb995ff..4448ac4 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/files/file_path.h" #import "base/mac/foundation_util.h" #import "base/task/single_thread_task_runner.h"
diff --git a/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm index e9a4eec..d22a511 100644 --- a/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/voice_search_table_view_controller_unittest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/files/file_path.h" #import "base/mac/foundation_util.h" #import "base/test/task_environment.h"
diff --git a/ios/chrome/browser/ui/sharing/activity_services/activities/bookmark_activity_unittest.mm b/ios/chrome/browser/ui/sharing/activity_services/activities/bookmark_activity_unittest.mm index 7c3a959..d6961a6 100644 --- a/ios/chrome/browser/ui/sharing/activity_services/activities/bookmark_activity_unittest.mm +++ b/ios/chrome/browser/ui/sharing/activity_services/activities/bookmark_activity_unittest.mm
@@ -57,7 +57,7 @@ BookmarkActivity* CreateActivity(const GURL& URL) { return [[BookmarkActivity alloc] initWithURL:URL title:kTestTitle - bookmarkModel:bookmark_model_ + bookmarkModel:profile_bookmark_model_ handler:mocked_handler_ prefService:&testing_pref_service_]; } @@ -106,8 +106,8 @@ TEST_F(BookmarkActivityTest, ActivityTitle_EditBookmark) { // Add a bookmark. const bookmarks::BookmarkNode* bookmark = - AddBookmark(bookmark_model_->mobile_node(), @"activity_test"); - ASSERT_TRUE(bookmark_model_->IsBookmarked(bookmark->url())); + AddBookmark(profile_bookmark_model_->mobile_node(), @"activity_test"); + ASSERT_TRUE(profile_bookmark_model_->IsBookmarked(bookmark->url())); BookmarkActivity* activity = CreateActivity(bookmark->url());
diff --git a/ios/chrome/browser/ui/start_surface/BUILD.gn b/ios/chrome/browser/ui/start_surface/BUILD.gn index d43392e..2b42c041 100644 --- a/ios/chrome/browser/ui/start_surface/BUILD.gn +++ b/ios/chrome/browser/ui/start_surface/BUILD.gn
@@ -37,11 +37,11 @@ "//ios/chrome/app/application_delegate:app_state_header", "//ios/chrome/app/strings", "//ios/chrome/browser/ntp", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_browser_agent", "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/ui/main:browser_interface_provider", - "//ios/chrome/browser/ui/main:observing_scene_agent", "//ios/chrome/browser/url", "//ios/chrome/browser/url:constants", "//ios/chrome/browser/web_state_list",
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h index 082905d..738c0481 100644 --- a/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h +++ b/ios/chrome/browser/ui/start_surface/start_surface_scene_agent.h
@@ -5,7 +5,7 @@ #ifndef IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_SCENE_AGENT_H_ #define IOS_CHROME_BROWSER_UI_START_SURFACE_START_SURFACE_SCENE_AGENT_H_ -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" // A scene agent for the Start Surface. @interface StartSurfaceSceneAgent : ObservingSceneAgent
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn index 9c3f493..00e47a9 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/BUILD.gn
@@ -119,7 +119,10 @@ "tab_grid_constants.mm", ] - deps = [ "resources:grid_background_color" ] + deps = [ + "resources:grid_background_color", + "//base", + ] } source_set("tab_grid_paging") {
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h index c277c34..2d66bd72 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.h
@@ -38,6 +38,9 @@ // selection mode. It will be used to update the buttons to use the correct // title (singular or plural). @property(nonatomic, assign) int selectedTabsCount; +// Tab button views created for the bottom toolbar. +@property(nonatomic, readonly) TabGridNewTabButton* smallNewTabButton; +@property(nonatomic, readonly) TabGridNewTabButton* largeNewTabButton; // Sets target/action for tapping event on new tab button. - (void)setNewTabButtonTarget:(id)target action:(SEL)action;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm index 91b0d884..1e87656d 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_bottom_toolbar.mm
@@ -28,8 +28,6 @@ NSArray<NSLayoutConstraint*>* _compactConstraints; NSArray<NSLayoutConstraint*>* _floatingConstraints; NSLayoutConstraint* _largeNewTabButtonBottomAnchor; - TabGridNewTabButton* _smallNewTabButton; - TabGridNewTabButton* _largeNewTabButton; UIBarButtonItem* _doneButton; UIBarButtonItem* _closeAllOrUndoButton; UIBarButtonItem* _editButton; @@ -266,6 +264,9 @@ // Remove the border of UIToolbar. [_toolbar setShadowImage:[[UIImage alloc] init] forToolbarPosition:UIBarPositionAny]; + [_toolbar + setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh + 1 + forAxis:UILayoutConstraintAxisVertical]; _closeAllOrUndoButton = [[UIBarButtonItem alloc] init]; _closeAllOrUndoButton.tintColor =
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h index f01628d..b77cc86 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h
@@ -5,9 +5,13 @@ #ifndef IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_GRID_CONSTANTS_H_ #define IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_GRID_CONSTANTS_H_ -#include <CoreGraphics/CoreGraphics.h> +#import <CoreGraphics/CoreGraphics.h> #import <Foundation/Foundation.h> +namespace base { +class TimeDelta; +} // namespace base + // Keys of UMA IOS.TabSwitcher.Idle histograms. extern const char kUMATabSwitcherIdleIncognitoTabGridPageHistogram[]; extern const char kUMATabSwitcherIdleRecentTabsHistogram[]; @@ -86,4 +90,7 @@ // Alpha of the background color of the toolbar. extern const CGFloat kToolbarBackgroundAlpha; +// Duration for animations in the tab grid. +extern const base::TimeDelta kAnimationDuration; + #endif // IOS_CHROME_BROWSER_UI_TAB_SWITCHER_TAB_GRID_TAB_GRID_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.mm index c8cd9ef..569365c 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.mm
@@ -4,6 +4,8 @@ #import "ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_constants.h" +#import "base/time/time.h" + #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif @@ -98,3 +100,6 @@ // Alpha of the background color of the toolbar. const CGFloat kToolbarBackgroundAlpha = 0.75; + +// Duration for animations in the tab grid. +const base::TimeDelta kAnimationDuration = base::Milliseconds(200);
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm index eac6791..5f72ebb8 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_coordinator.mm
@@ -407,6 +407,23 @@ // incognito (crbug.com/1136882). TabGridPage currentActivePage = self.baseViewController.activePage; + // Show "Bring Android Tabs" prompt if the user is an Android switcher and has + // open tabs from their previous Android device. + // Note: if the coordinator is already created, the prompt should have already + // been displayed, therefore we should not need to display it again. + BOOL shouldDisplayBringAndroidTabsPrompt = NO; + if (currentActivePage == TabGridPageRegularTabs && + !_bringAndroidTabsPromptCoordinator) { + BringAndroidTabsToIOSService* bringAndroidTabsService = + BringAndroidTabsToIOSServiceFactory::GetForBrowserState( + self.regularBrowser->GetBrowserState()); + if (bringAndroidTabsService != nil) { + bringAndroidTabsService->LoadTabs(); + shouldDisplayBringAndroidTabsPrompt = + bringAndroidTabsService->GetNumberOfAndroidTabs() > 0; + } + } + // If a BVC is currently being presented, dismiss it. This will trigger any // necessary animations. if (self.bvcContainer) { @@ -425,6 +442,9 @@ withCompletion:^{ self.bvcContainer = nil; [self.baseViewController contentDidAppear]; + if (shouldDisplayBringAndroidTabsPrompt) { + [self displayBringAndroidTabsPrompt]; + } }]; // On iOS 15+, snapshotting views with afterScreenUpdates:YES waits 0.5s @@ -434,23 +454,8 @@ // updating the status bar style afterwards. self.baseViewController.childViewControllerForStatusBarStyle = nil; }); - } - - // Show "Bring Android Tabs" prompt if the user is an Android switcher and has - // open tabs from their previous Android device. - // Note: if the coordinator is already created, the prompt should have already - // been displayed, therefore we should not need to display it again. - if (currentActivePage == TabGridPageRegularTabs && - !_bringAndroidTabsPromptCoordinator) { - BringAndroidTabsToIOSService* bringAndroidTabsService = - BringAndroidTabsToIOSServiceFactory::GetForBrowserState( - self.regularBrowser->GetBrowserState()); - if (bringAndroidTabsService != nil) { - bringAndroidTabsService->LoadTabs(); - if (bringAndroidTabsService->GetNumberOfAndroidTabs() > 0) { - [self displayBringAndroidTabsPrompt]; - } - } + } else if (shouldDisplayBringAndroidTabsPrompt) { + [self displayBringAndroidTabsPrompt]; } // Record when the tab switcher is presented. @@ -586,6 +591,33 @@ return _bookmarksCoordinator; } +- (void)displayBringAndroidTabsPrompt { + if (!_bringAndroidTabsPromptCoordinator) { + _bringAndroidTabsPromptCoordinator = + [[BringAndroidTabsPromptCoordinator alloc] + initWithBaseViewController:self.baseViewController + browser:self.regularBrowser]; + _bringAndroidTabsPromptCoordinator.commandHandler = self; + } + [_bringAndroidTabsPromptCoordinator start]; + switch (GetBringYourOwnTabsPromptType()) { + case BringYourOwnTabsPromptType::kHalfSheet: + [self.baseViewController + presentViewController:_bringAndroidTabsPromptCoordinator + .viewController + animated:YES + completion:nil]; + break; + case BringYourOwnTabsPromptType::kBottomMessage: + self.baseViewController.regularTabsBottomMessage = + _bringAndroidTabsPromptCoordinator.viewController; + break; + case BringYourOwnTabsPromptType::kDisabled: + NOTREACHED(); + break; + } +} + #pragma mark - Private (Thumb Strip) // Whether the thumb strip is enabled. @@ -880,7 +912,7 @@ [self.incognitoSnackbarCoordinator stop]; self.incognitoSnackbarCoordinator = nil; - self.baseViewController.bottomMessage = nil; + self.baseViewController.regularTabsBottomMessage = nil; [_bringAndroidTabsPromptCoordinator stop]; _bringAndroidTabsPromptCoordinator = nil; [_tabListFromAndroidCoordinator stop]; @@ -1321,33 +1353,6 @@ #pragma mark - BringAndroidTabsCommands -- (void)displayBringAndroidTabsPrompt { - if (!_bringAndroidTabsPromptCoordinator) { - _bringAndroidTabsPromptCoordinator = - [[BringAndroidTabsPromptCoordinator alloc] - initWithBaseViewController:self.baseViewController - browser:self.regularBrowser]; - _bringAndroidTabsPromptCoordinator.commandHandler = self; - } - [_bringAndroidTabsPromptCoordinator start]; - switch (GetBringYourOwnTabsPromptType()) { - case BringYourOwnTabsPromptType::kHalfSheet: - [self.baseViewController - presentViewController:_bringAndroidTabsPromptCoordinator - .viewController - animated:YES - completion:nil]; - break; - case BringYourOwnTabsPromptType::kBottomMessage: - self.baseViewController.bottomMessage = - _bringAndroidTabsPromptCoordinator.viewController; - break; - case BringYourOwnTabsPromptType::kDisabled: - NOTREACHED(); - break; - } -} - - (void)reviewAllBringAndroidTabs { [self onUserInteractionWithBringAndroidTabsPrompt:YES]; } @@ -1365,9 +1370,9 @@ completion:nil]; break; case BringYourOwnTabsPromptType::kBottomMessage: - DCHECK_EQ(self.baseViewController.bottomMessage, + DCHECK_EQ(self.baseViewController.regularTabsBottomMessage, _bringAndroidTabsPromptCoordinator.viewController); - self.baseViewController.bottomMessage = nil; + self.baseViewController.regularTabsBottomMessage = nil; break; case BringYourOwnTabsPromptType::kDisabled: NOTREACHED();
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h index b660081..9378ac8a 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.h
@@ -179,7 +179,7 @@ // The view controller that shows below the tab grid as a bottom message. Note // that setting this value immediately adds it to the view hierarchy. -@property(nonatomic, strong) UIViewController* bottomMessage; +@property(nonatomic, strong) UIViewController* regularTabsBottomMessage; // The layout guide center to use to refer to the bottom toolbar. @property(nonatomic, strong) LayoutGuideCenter* layoutGuideCenter;
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm index 91122c4..7a1b873a 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_view_controller.mm
@@ -173,6 +173,9 @@ // Constraints for the pinned tabs view. @property(nonatomic, strong) NSArray<NSLayoutConstraint*>* pinnedTabsConstraints; +// Bottom constraint for the regular tabs bottom message view. +@property(nonatomic, strong) + NSArray<NSLayoutConstraint*>* regularTabsBottomMessageConstraints; // The current state of the tab grid when using the thumb strip. @property(nonatomic, assign) ViewRevealState currentState; @@ -309,6 +312,12 @@ [super viewDidLayoutSubviews]; // Modify Incognito and Regular Tabs Insets [self setInsetForGridViews]; + // Reset bottom message width after bottom toolbar is updated after an + // orientation change. As this depends on + // `regularTabsViewController.gridView.contentOffset.x`, this should not be + // done in `-traitCollectionDidChange` when the updated layout has not been + // finalized. + [self updateRegularTabsBottomMessageConstraintsIfExists]; } - (void)viewWillTransitionToSize:(CGSize)size @@ -724,10 +733,25 @@ [_reauthAgent addObserver:self]; } -- (void)setBottomMessage:(UIViewController*)bottomMessage { - _bottomMessage = bottomMessage; - // TODO(crbug.com/1418117): Move around other UI components in the regular tab - // grid accordingly, and add/remove `bottomMessage` to the view hierarchy. +- (void)setRegularTabsBottomMessage:(UIViewController*)bottomMessage { + if (_regularTabsBottomMessage == bottomMessage) { + return; + } + [_regularTabsBottomMessage willMoveToParentViewController:nil]; + [_regularTabsBottomMessage.view removeFromSuperview]; + [_regularTabsBottomMessage removeFromParentViewController]; + _regularTabsBottomMessage = bottomMessage; + if (!_regularTabsBottomMessage) { + [self slideOutRegularTabsBottomMessage]; + return; + } + [self.regularTabsViewController + addChildViewController:self.regularTabsBottomMessage]; + [self.regularTabsViewController.view + addSubview:self.regularTabsBottomMessage.view]; + [self.regularTabsBottomMessage + didMoveToParentViewController:self.regularTabsViewController]; + [self initializeRegularTabsBottomMessageView]; } #pragma mark - TabGridPaging @@ -762,6 +786,13 @@ [self.incognitoTabsDelegate resetToAllItems]; [self hideScrim]; } + + // Reset the visibility of bottom message, if exists. + if (self.regularTabsBottomMessage) { + self.regularTabsBottomMessage.view.hidden = + self.tabGridMode != TabGridModeNormal; + } + [self setInsetForGridViews]; self.regularTabsViewController.mode = self.tabGridMode; self.incognitoTabsViewController.mode = self.tabGridMode; @@ -2156,7 +2187,7 @@ } self.currentPageViewController.accessibilityElementsHidden = YES; __weak __typeof(self) weakSelf = self; - [UIView animateWithDuration:0.2 + [UIView animateWithDuration:kAnimationDuration.InSecondsF() animations:^{ TabGridViewController* strongSelf = weakSelf; if (!strongSelf) @@ -2176,7 +2207,7 @@ // Hides scrim overlay. - (void)hideScrim { __weak TabGridViewController* weakSelf = self; - [UIView animateWithDuration:0.2 + [UIView animateWithDuration:kAnimationDuration.InSecondsF() animations:^{ TabGridViewController* strongSelf = weakSelf; if (!strongSelf) @@ -2327,7 +2358,11 @@ - (UIEdgeInsets)calculateInsetForRegularGridView { UIEdgeInsets inset = [self calculateInsetForIncognitoGridView]; - if (IsPinnedTabsEnabled() && !self.pinnedTabsViewController.view.isHidden) { + if (self.regularTabsBottomMessage && + !self.regularTabsBottomMessage.view.hidden) { + inset.bottom += self.regularTabsBottomMessage.view.bounds.size.height; + } + if (IsPinnedTabsEnabled() && !self.pinnedTabsViewController.view.hidden) { CGFloat pinnedViewHeight = self.pinnedTabsViewController.view.bounds.size.height; inset.bottom += pinnedViewHeight + kPinnedViewBottomPadding; @@ -2441,8 +2476,8 @@ animations:^{ self.regularTabsViewController.gridView.contentInset = inset; - } - completion:nil]; + [self updateRegularTabsBottomMessageConstraintsIfExists]; + }]; } - (void)pinnedTabsViewController: @@ -3135,4 +3170,112 @@ [NSLayoutConstraint activateConstraints:self.pinnedTabsConstraints]; } +// Updates the bottom constraint for the bottom message on the regular tabs. +- (void)updateRegularTabsBottomMessageConstraintsIfExists { + if (!self.regularTabsBottomMessage) { + return; + } + [NSLayoutConstraint + deactivateConstraints:self.regularTabsBottomMessageConstraints]; + self.regularTabsBottomMessageConstraints = nil; + + UIView* bottomMessageView = self.regularTabsBottomMessage.view; + NSMutableArray<NSLayoutConstraint*>* constraints = + [[NSMutableArray alloc] init]; + // left and right anchors. + if ([self shouldUseCompactLayout]) { + [constraints addObjectsFromArray:@[ + [bottomMessageView.widthAnchor + constraintEqualToAnchor:self.view.widthAnchor], + [bottomMessageView.centerXAnchor + constraintEqualToAnchor:self.regularTabsViewController.view + .centerXAnchor] + ]]; + } else { + // Make space on the right so that the message would NOT cover the new tab + // button. + CGFloat trailingMarginToShowNewTabButton = + kTabGridFloatingButtonHorizontalInset + + self.bottomToolbar.largeNewTabButton.intrinsicContentSize.width; + [constraints addObjectsFromArray:@[ + [bottomMessageView.widthAnchor + constraintEqualToAnchor:self.view.widthAnchor + constant:self.regularTabsViewController.gridView + .contentOffset.x - + trailingMarginToShowNewTabButton], + [bottomMessageView.leadingAnchor + constraintEqualToAnchor:self.regularTabsViewController.view + .leadingAnchor] + ]]; + } + // Bottom and top anchors. + CGFloat topLayoutAnchorConstant = + [self shouldUseCompactLayout] + ? self.topToolbar.intrinsicContentSize.height + + self.bottomToolbar.intrinsicContentSize.height + : self.topToolbar.intrinsicContentSize.height; + NSLayoutYAxisAnchor* bottomAnchor = [self shouldUseCompactLayout] + ? self.bottomToolbar.topAnchor + : self.view.bottomAnchor; + if (IsPinnedTabsEnabled() && !self.pinnedTabsViewController.view.hidden) { + bottomAnchor = self.pinnedTabsViewController.view.topAnchor; + } + [constraints addObjectsFromArray:@[ + [bottomMessageView.bottomAnchor constraintEqualToAnchor:bottomAnchor], + [bottomMessageView.topAnchor + constraintGreaterThanOrEqualToAnchor:self.view.topAnchor + constant:topLayoutAnchorConstant] + ]]; + self.regularTabsBottomMessageConstraints = constraints; + [NSLayoutConstraint + activateConstraints:self.regularTabsBottomMessageConstraints]; +} + +// Sets up the view for `self.regularTabsBottomMessage`. This should be called +// when the bottom message is just set. +- (void)initializeRegularTabsBottomMessageView { + UIView* bottomMessageView = self.regularTabsBottomMessage.view; + bottomMessageView.translatesAutoresizingMaskIntoConstraints = NO; + // The bottom message should cover all grid cells but not cover the blocking + // view. + bottomMessageView.layer.zPosition = FLT_MAX - 1; + bottomMessageView.hidden = self.tabGridMode != TabGridModeNormal; + [self slideInRegularTabsBottomMessage]; +} + +// Slides `self.regularTabsBottomMessage` from the bottom edge into place. This +// should be called only when the bottom message is just set. +- (void)slideInRegularTabsBottomMessage { + UIView* bottomMessageView = self.regularTabsBottomMessage.view; + self.regularTabsViewController.gridView.contentInset = + [self calculateInsetForRegularGridView]; + // Initial position of `bottomMessageView should be below the view, so that + // the animation slides it up from the bottom, instead of sliding it down from + // the top. + NSLayoutConstraint* initialConstraint = [bottomMessageView.topAnchor + constraintEqualToAnchor:self.view.bottomAnchor]; + initialConstraint.active = YES; + [self.regularTabsViewController.view layoutIfNeeded]; + // Perform initial animation. + __weak TabGridViewController* weakSelf = self; + [UIView + animateWithDuration:kAnimationDuration.InSecondsF() + animations:^{ + initialConstraint.active = NO; + [weakSelf updateRegularTabsBottomMessageConstraintsIfExists]; + [weakSelf.regularTabsViewController.view layoutIfNeeded]; + }]; +} + +// Slides an existing `self.regularTabsBottomMessage` out of the view. This +// should be called when the bottom message is just unset. +- (void)slideOutRegularTabsBottomMessage { + UIEdgeInsets inset = [self calculateInsetForRegularGridView]; + [UIView animateWithDuration:kAnimationDuration.InSecondsF() + animations:^{ + self.regularTabsViewController.gridView.contentInset = + inset; + }]; +} + @end
diff --git a/ios/chrome/browser/ui/whats_new/promo/BUILD.gn b/ios/chrome/browser/ui/whats_new/promo/BUILD.gn index 55d8cde..5f0a9ce5 100644 --- a/ios/chrome/browser/ui/whats_new/promo/BUILD.gn +++ b/ios/chrome/browser/ui/whats_new/promo/BUILD.gn
@@ -17,7 +17,7 @@ "//ios/chrome/browser/promos_manager:constants", "//ios/chrome/browser/promos_manager:features", "//ios/chrome/browser/promos_manager:types", - "//ios/chrome/browser/ui/main:observing_scene_agent", + "//ios/chrome/browser/shared/coordinator/scene:observing_scene_agent", "//ios/chrome/browser/ui/promos_manager:promos", "//ios/chrome/browser/ui/whats_new:util", ]
diff --git a/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent.h b/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent.h index 751c746..36f6815 100644 --- a/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent.h +++ b/ios/chrome/browser/ui/whats_new/promo/whats_new_scene_agent.h
@@ -7,7 +7,7 @@ #import <Foundation/Foundation.h> -#import "ios/chrome/browser/ui/main/observing_scene_state_agent.h" +#import "ios/chrome/browser/shared/coordinator/scene/observing_scene_state_agent.h" class PromosManager;
diff --git a/ios/chrome/browser/url_loading/scene_url_loading_service.h b/ios/chrome/browser/url_loading/scene_url_loading_service.h index bc7f08e..2929a7c 100644 --- a/ios/chrome/browser/url_loading/scene_url_loading_service.h +++ b/ios/chrome/browser/url_loading/scene_url_loading_service.h
@@ -50,9 +50,7 @@ inheritOpener:(BOOL)inheritOpener; // Informs the BVC that a new foreground tab is about to be opened in given -// `targetMode`. This is intended to be called before setWebUsageSuspended:NO in -// cases where a new tab is about to appear in order to allow the BVC to avoid -// doing unnecessary work related to showing the previously selected tab. +// `targetMode`. - (void)expectNewForegroundTabForMode:(ApplicationMode)targetMode; // TODO(crbug.com/907527): refactor to remove this and most methods above.
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn index 25d433a2..4293ac8a 100644 --- a/ios/chrome/browser/web/BUILD.gn +++ b/ios/chrome/browser/web/BUILD.gn
@@ -116,14 +116,18 @@ source_set("page_placeholder") { configs += [ "//build/config/compiler:enable_arc" ] sources = [ + "page_placeholder_browser_agent.h", + "page_placeholder_browser_agent.mm", "page_placeholder_tab_helper.h", "page_placeholder_tab_helper.mm", ] deps = [ "//base", + "//ios/chrome/browser/main:public", "//ios/chrome/browser/shared/ui/elements", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/snapshots", + "//ios/chrome/browser/web_state_list", "//ios/chrome/common/ui/util", "//ios/net", "//ios/web",
diff --git a/ios/chrome/browser/web/page_placeholder_browser_agent.h b/ios/chrome/browser/web/page_placeholder_browser_agent.h new file mode 100644 index 0000000..13404b7 --- /dev/null +++ b/ios/chrome/browser/web/page_placeholder_browser_agent.h
@@ -0,0 +1,45 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_PAGE_PLACEHOLDER_BROWSER_AGENT_H_ +#define IOS_CHROME_BROWSER_WEB_PAGE_PLACEHOLDER_BROWSER_AGENT_H_ + +#import <string> + +#include "ios/chrome/browser/main/browser_user_data.h" +#include "ios/chrome/browser/web_state_list/web_state_list.h" + +// Browser agent used to add or cancel a page placeholder for next navigation. +class PagePlaceholderBrowserAgent + : public BrowserUserData<PagePlaceholderBrowserAgent> { + public: + ~PagePlaceholderBrowserAgent() override; + + // Not copyable or assignable. + PagePlaceholderBrowserAgent(const PagePlaceholderBrowserAgent&) = delete; + PagePlaceholderBrowserAgent& operator=(const PagePlaceholderBrowserAgent&) = + delete; + + // Used to inform that a new foreground tab is about to be opened. + void ExpectNewForegroundTab(); + + // Adds a page placeholder. + void AddPagePlaceholder(); + + // Calcels the page placeholder. + void CancelPagePlaceholder(); + + private: + friend class BrowserUserData<PagePlaceholderBrowserAgent>; + BROWSER_USER_DATA_KEY_DECL(); + + explicit PagePlaceholderBrowserAgent(Browser* browser); + + WebStateList* web_state_list_ = nullptr; + + // True if waiting for a foreground tab due to expectNewForegroundTab. + bool expecting_foreground_tab_; +}; + +#endif // IOS_CHROME_BROWSER_WEB_PAGE_PLACEHOLDER_BROWSER_AGENT_H_
diff --git a/ios/chrome/browser/web/page_placeholder_browser_agent.mm b/ios/chrome/browser/web/page_placeholder_browser_agent.mm new file mode 100644 index 0000000..cff95900 --- /dev/null +++ b/ios/chrome/browser/web/page_placeholder_browser_agent.mm
@@ -0,0 +1,56 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/web/page_placeholder_browser_agent.h" + +#import "ios/chrome/browser/web/page_placeholder_tab_helper.h" +#import "ios/web/public/web_state.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +BROWSER_USER_DATA_KEY_IMPL(PagePlaceholderBrowserAgent) + +PagePlaceholderBrowserAgent::PagePlaceholderBrowserAgent(Browser* browser) + : web_state_list_(browser->GetWebStateList()) { + // All the BrowserAgent are attached to the Browser during the creation, + // the WebStateList must be empty at this point. + DCHECK(web_state_list_->empty()) + << "PagePlaceholderBrowserAgent created for a Browser with a non-empty " + "WebStateList."; +} + +PagePlaceholderBrowserAgent::~PagePlaceholderBrowserAgent() {} + +#pragma mark - Public + +void PagePlaceholderBrowserAgent::ExpectNewForegroundTab() { + expecting_foreground_tab_ = true; +} + +void PagePlaceholderBrowserAgent::AddPagePlaceholder() { + web::WebState* web_state = + web_state_list_ ? web_state_list_->GetActiveWebState() : nullptr; + if (web_state && expecting_foreground_tab_) { + PagePlaceholderTabHelper::FromWebState(web_state) + ->AddPlaceholderForNextNavigation(); + } +} + +void PagePlaceholderBrowserAgent::CancelPagePlaceholder() { + if (expecting_foreground_tab_) { + // Now that the new tab has been displayed, return to normal. Rather than + // keep a reference to the previous tab, just turn off preview mode for all + // tabs (since doing so is a no-op for the tabs that don't have it set). + expecting_foreground_tab_ = false; + + int web_state_list_size = web_state_list_ ? web_state_list_->count() : 0; + for (int index = 0; index < web_state_list_size; ++index) { + web::WebState* webStateAtIndex = web_state_list_->GetWebStateAt(index); + PagePlaceholderTabHelper::FromWebState(webStateAtIndex) + ->CancelPlaceholderForNextNavigation(); + } + } +}
diff --git a/ios/chrome/browser/web/visible_url_egtest.mm b/ios/chrome/browser/web/visible_url_egtest.mm index 8782f29..187ae49 100644 --- a/ios/chrome/browser/web/visible_url_egtest.mm +++ b/ios/chrome/browser/web/visible_url_egtest.mm
@@ -6,7 +6,6 @@ #import <memory> -#import "base/compiler_specific.h" #import "base/ios/ios_util.h" #import "base/strings/stringprintf.h" #import "base/strings/sys_string_conversions.h"
diff --git a/ios/chrome/browser/web_state_list/web_state_list.h b/ios/chrome/browser/web_state_list/web_state_list.h index af5b622..536570c9 100644 --- a/ios/chrome/browser/web_state_list/web_state_list.h +++ b/ios/chrome/browser/web_state_list/web_state_list.h
@@ -9,7 +9,6 @@ #include <vector> #include "base/auto_reset.h" -#include "base/compiler_specific.h" #include "base/functional/callback_forward.h" #include "base/memory/weak_ptr.h" #include "base/observer_list.h"
diff --git a/ios/chrome/test/app/navigation_test_util.h b/ios/chrome/test/app/navigation_test_util.h index 58335b7..c60a4df 100644 --- a/ios/chrome/test/app/navigation_test_util.h +++ b/ios/chrome/test/app/navigation_test_util.h
@@ -5,7 +5,6 @@ #ifndef IOS_CHROME_TEST_APP_NAVIGATION_TEST_UTIL_H_ #define IOS_CHROME_TEST_APP_NAVIGATION_TEST_UTIL_H_ -#include "base/compiler_specific.h" #include "url/gurl.h" namespace chrome_test_util {
diff --git a/ios/chrome/test/app/window_test_util.h b/ios/chrome/test/app/window_test_util.h index fdbd791..1ed3c02 100644 --- a/ios/chrome/test/app/window_test_util.h +++ b/ios/chrome/test/app/window_test_util.h
@@ -7,8 +7,6 @@ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" - namespace web { class WebState; }
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h index 4b65f13..01dfd28 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_ui.h
@@ -6,8 +6,9 @@ #define IOS_CHROME_TEST_EARL_GREY_CHROME_EARL_GREY_UI_H_ #import <Foundation/Foundation.h> + #import <string> -#include "base/compiler_specific.h" + #import "ios/testing/earl_grey/base_eg_test_helper_impl.h" @protocol GREYMatcher;
diff --git a/ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h b/ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h index 4161af5..6c323a60 100644 --- a/ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h +++ b/ios/chrome/test/fakes/fake_download_manager_tab_helper_delegate.h
@@ -5,7 +5,6 @@ #ifndef IOS_CHROME_TEST_FAKES_FAKE_DOWNLOAD_MANAGER_TAB_HELPER_DELEGATE_H_ #define IOS_CHROME_TEST_FAKES_FAKE_DOWNLOAD_MANAGER_TAB_HELPER_DELEGATE_H_ -#include "base/compiler_specific.h" #import "ios/chrome/browser/download/download_manager_tab_helper_delegate.h" #import "ios/web/public/download/download_task.h"
diff --git a/ios/chrome/test/ios_chrome_unit_test_suite.h b/ios/chrome/test/ios_chrome_unit_test_suite.h index a83a6d6..276fb28 100644 --- a/ios/chrome/test/ios_chrome_unit_test_suite.h +++ b/ios/chrome/test/ios_chrome_unit_test_suite.h
@@ -5,7 +5,6 @@ #ifndef IOS_CHROME_TEST_IOS_CHROME_UNIT_TEST_SUITE_H_ #define IOS_CHROME_TEST_IOS_CHROME_UNIT_TEST_SUITE_H_ -#include "base/compiler_specific.h" #include "base/task/single_thread_task_runner.h" #include "ios/web/public/test/web_test_suite.h"
diff --git a/ios/components/io_thread/ios_io_thread.h b/ios/components/io_thread/ios_io_thread.h index b8403ae..115025b 100644 --- a/ios/components/io_thread/ios_io_thread.h +++ b/ios/components/io_thread/ios_io_thread.h
@@ -14,7 +14,6 @@ #include <string> #include <vector> -#include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "components/prefs/pref_member.h"
diff --git a/ios/components/io_thread/ios_io_thread.mm b/ios/components/io_thread/ios_io_thread.mm index 48002cf..cb2f160 100644 --- a/ios/components/io_thread/ios_io_thread.mm +++ b/ios/components/io_thread/ios_io_thread.mm
@@ -11,7 +11,6 @@ #import "base/check_op.h" #import "base/command_line.h" -#import "base/compiler_specific.h" #import "base/environment.h" #import "base/functional/bind.h" #import "base/functional/callback_helpers.h"
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index 17fd73a..5dc34b3a 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -72a9cf193ff50e1df3d0b9ef2cb240c71ef4d30d \ No newline at end of file +716d700d01a9f0a0a3a9609f5328a44c7dde8a12 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index cdc34cdc..231439537 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -781a8d3321fb6431d90af0617b73c81a5403bfe3 \ No newline at end of file +2a07cc0b9800d36f28350c25d4482297ed92953d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 29b6ff73..e69355e 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -d287e492c007c40a1808755f004d9c9ffc72ee0b \ No newline at end of file +a1bf8dec14f9a2a1ad0afa80be776070c42b63a6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index 82afbcd..804761d 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -63cf8641324e83f611f29ba933af3378b2b92ca6 \ No newline at end of file +acab7fecdb7fd1a246723e4a5b4c24aee59f646b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 9d357b28..5164277 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -5a9994868c4c984088e664159620939cf97f123a \ No newline at end of file +d1a496a316098992b7601c13dd72f09f105e95a6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index d9ee897..a09dd8d8 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -af2323c103c6d9ef1ec0fed03d80ac1f1b0f5605 \ No newline at end of file +a51839e0fb1a064f8ad738e0086cb9f0ec5df282 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index d758890..5272a3b 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -f6e46c5916e5e39db2b2e49d8a1ef06f4228cb2d \ No newline at end of file +75c34dce3970fb04f0f83f8fb64700bae29bf8f5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index a2c9dc0..4eecda421 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -38191f57fa6c2ac05170233ee327b9c954634ad2 \ No newline at end of file +bdf6003b9c45dcdcdfc9cf2ec953b0d39eb4cbcb \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index 2fdb2e4b..c93d9308 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -1fac532748a33ab5562f6fa4a83d5d08b3cab641 \ No newline at end of file +edb58a90996b2d3daf9f1fc6c014cd02cf72ddb1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index e8a7c06..0b6963b 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -a1cb8bf98a71b7bf96406a757d7d7c5b6d2faa03 \ No newline at end of file +cdb38d001eb2debee45aa000d10101c1d45531ad \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 303be3d..c84a05f 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -2ef908994060caea7c8b0e09fc03a0aa931b705f \ No newline at end of file +a20d2fef73eb02ce0877112993992e48bdddb4e2 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 6a5afd9..693f4b0 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -c57e4affc1e8f0e164f7ff5f1c9ac414a4b224ce \ No newline at end of file +661f0fa802268cf15a0b8904116cb6b7ff1da8e3 \ No newline at end of file
diff --git a/ios/web/content/content_thread_impl.cc b/ios/web/content/content_thread_impl.cc index 90e7117b..8aba78b 100644 --- a/ios/web/content/content_thread_impl.cc +++ b/ios/web/content/content_thread_impl.cc
@@ -11,7 +11,6 @@ #include <utility> #include "base/atomicops.h" -#include "base/compiler_specific.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/lazy_instance.h"
diff --git a/ios/web/navigation/crw_wk_navigation_states.mm b/ios/web/navigation/crw_wk_navigation_states.mm index 19de418..e671acb3 100644 --- a/ios/web/navigation/crw_wk_navigation_states.mm +++ b/ios/web/navigation/crw_wk_navigation_states.mm
@@ -128,9 +128,6 @@ id key = [self keyForNavigation:navigation]; CRWWKNavigationsStateRecord* record = [_records objectForKey:key]; if (!record) { - DCHECK(state == web::WKNavigationState::REQUESTED || - state == web::WKNavigationState::STARTED || - state == web::WKNavigationState::COMMITTED); record = [[CRWWKNavigationsStateRecord alloc] initWithState:state index:++_lastStateIndex];
diff --git a/ios/web/public/test/http_server/data_response_provider.h b/ios/web/public/test/http_server/data_response_provider.h index fe060cc..ba162a2a 100644 --- a/ios/web/public/test/http_server/data_response_provider.h +++ b/ios/web/public/test/http_server/data_response_provider.h
@@ -8,7 +8,6 @@ #include <memory> #include <string> -#include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #import "ios/web/public/test/http_server/response_provider.h" #include "net/http/http_response_headers.h"
diff --git a/ios/web/shell/shell_main_delegate.h b/ios/web/shell/shell_main_delegate.h index 3fbc482..a7e3700 100644 --- a/ios/web/shell/shell_main_delegate.h +++ b/ios/web/shell/shell_main_delegate.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #include "ios/web/public/init/web_main_delegate.h" namespace web {
diff --git a/ios/web/shell/shell_url_request_context_getter.h b/ios/web/shell/shell_url_request_context_getter.h index 6c8fade..706a8850 100644 --- a/ios/web/shell/shell_url_request_context_getter.h +++ b/ios/web/shell/shell_url_request_context_getter.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/task/single_thread_task_runner.h"
diff --git a/ios/web/shell/shell_web_client.h b/ios/web/shell/shell_web_client.h index 5d30ecd..7dc3792 100644 --- a/ios/web/shell/shell_web_client.h +++ b/ios/web/shell/shell_web_client.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #import "ios/web/public/web_client.h" namespace web {
diff --git a/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface.h b/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface.h index bd06338..067e09462 100644 --- a/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface.h +++ b/ios/web/shell/test/earl_grey/shell_earl_grey_app_interface.h
@@ -7,8 +7,6 @@ #import <Foundation/Foundation.h> -#include "base/compiler_specific.h" - // Test methods that perform actions on Web Shell. These methods may read or // alter Web Shell's internal state programmatically or via the UI, but in both // cases will properly synchronize the UI for Earl Grey tests.
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 55379d9..b6054ce2 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -418,6 +418,25 @@ EXPECT_NSEQ(@"No", dialog->default_prompt_text); } +// Tests that window.prompt dialog is shown even when the given message and +// default value are empty. +TEST_F(JavaScriptDialogPresenterTest, PromptEmpty) { + ASSERT_FALSE(JSDialogPresenterHasDialogs()); + + js_dialog_presenter()->set_callback_user_input_argument(@"Maybe"); + + EXPECT_NSEQ(@"Maybe", ExecuteJavaScript(@"prompt('', '')")); + + ASSERT_TRUE(requested_alert_dialogs().empty()); + ASSERT_TRUE(requested_confirm_dialogs().empty()); + ASSERT_EQ(1U, requested_prompt_dialogs().size()); + auto& dialog = requested_prompt_dialogs().front(); + EXPECT_EQ(web_state(), dialog->web_state); + EXPECT_EQ(page_url(), dialog->origin_url); + EXPECT_NSEQ(@"", dialog->message_text); + EXPECT_NSEQ(@"", dialog->default_prompt_text); +} + // Tests that window.alert, window.confirm and window.prompt dialogs are not // shown if URL of presenting main frame is different from visible URL. TEST_F(JavaScriptDialogPresenterTest, DifferentVisibleUrl) {
diff --git a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm index 4216df8..bce77e5 100644 --- a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm +++ b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
@@ -6,7 +6,6 @@ #import <UIKit/UIKit.h> -#import "base/compiler_specific.h" #import "base/test/scoped_feature_list.h" #import "ios/web/common/features.h" #import "ios/web/web_state/ui/crw_web_view_scroll_view_delegate_proxy.h"
diff --git a/ios/web/web_sub_thread.cc b/ios/web/web_sub_thread.cc index e6065509..1138942 100644 --- a/ios/web/web_sub_thread.cc +++ b/ios/web/web_sub_thread.cc
@@ -4,7 +4,6 @@ #include "ios/web/web_sub_thread.h" -#include "base/compiler_specific.h" #include "base/debug/alias.h" #include "base/functional/bind.h" #include "base/threading/thread_restrictions.h"
diff --git a/ios/web/web_thread_impl.cc b/ios/web/web_thread_impl.cc index 41382d8..a6b17bb 100644 --- a/ios/web/web_thread_impl.cc +++ b/ios/web/web_thread_impl.cc
@@ -8,7 +8,6 @@ #include <utility> #include "base/atomicops.h" -#include "base/compiler_specific.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/lazy_instance.h"
diff --git a/ios/web/webui/shared_resources_data_source_ios.h b/ios/web/webui/shared_resources_data_source_ios.h index a8d005e..57fc895 100644 --- a/ios/web/webui/shared_resources_data_source_ios.h +++ b/ios/web/webui/shared_resources_data_source_ios.h
@@ -5,7 +5,6 @@ #ifndef IOS_WEB_WEBUI_SHARED_RESOURCES_DATA_SOURCE_IOS_H_ #define IOS_WEB_WEBUI_SHARED_RESOURCES_DATA_SOURCE_IOS_H_ -#include "base/compiler_specific.h" #include "ios/web/public/webui/url_data_source_ios.h" namespace web {
diff --git a/ios/web/webui/url_data_manager_ios_backend.h b/ios/web/webui/url_data_manager_ios_backend.h index 43c87c5..18fe42b0 100644 --- a/ios/web/webui/url_data_manager_ios_backend.h +++ b/ios/web/webui/url_data_manager_ios_backend.h
@@ -10,7 +10,6 @@ #include <string> #include <vector> -#include "base/compiler_specific.h" #include "base/supports_user_data.h" #include "ios/web/public/webui/url_data_source_ios.h" #include "ios/web/webui/url_data_manager_ios.h"
diff --git a/ios/web/webui/url_data_manager_ios_backend.mm b/ios/web/webui/url_data_manager_ios_backend.mm index f9c772f..f56e764 100644 --- a/ios/web/webui/url_data_manager_ios_backend.mm +++ b/ios/web/webui/url_data_manager_ios_backend.mm
@@ -7,7 +7,6 @@ #import <set> #import "base/command_line.h" -#import "base/compiler_specific.h" #import "base/debug/alias.h" #import "base/functional/bind.h" #import "base/memory/ref_counted.h"
diff --git a/ios/web/webui/web_ui_ios_data_source_impl.h b/ios/web/webui/web_ui_ios_data_source_impl.h index 23eeb48..6feeb925 100644 --- a/ios/web/webui/web_ui_ios_data_source_impl.h +++ b/ios/web/webui/web_ui_ios_data_source_impl.h
@@ -8,7 +8,6 @@ #include <map> #include <string> -#include "base/compiler_specific.h" #include "base/functional/callback.h" #include "base/values.h" #include "ios/web/public/webui/url_data_source_ios.h"
diff --git a/ios/web/webui/web_ui_ios_impl.h b/ios/web/webui/web_ui_ios_impl.h index ae4170ab..94425cf 100644 --- a/ios/web/webui/web_ui_ios_impl.h +++ b/ios/web/webui/web_ui_ios_impl.h
@@ -9,7 +9,6 @@ #include <memory> #include <vector> -#include "base/compiler_specific.h" #include "base/memory/weak_ptr.h" #include "base/values.h" #import "ios/web/public/web_state.h"
diff --git a/ios/web_view/internal/web_view_url_request_context_getter.h b/ios/web_view/internal/web_view_url_request_context_getter.h index 4be2f295..cee351f 100644 --- a/ios/web_view/internal/web_view_url_request_context_getter.h +++ b/ios/web_view/internal/web_view_url_request_context_getter.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "base/task/single_thread_task_runner.h"
diff --git a/ios/web_view/internal/web_view_web_client.h b/ios/web_view/internal/web_view_web_client.h index 7abdad7f..e81118e8 100644 --- a/ios/web_view/internal/web_view_web_client.h +++ b/ios/web_view/internal/web_view_web_client.h
@@ -7,7 +7,6 @@ #include <memory> -#include "base/compiler_specific.h" #import "ios/web/public/web_client.h" namespace ios_web_view {
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index df42a2a..3fdd134c 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -98,9 +98,6 @@ const char kDisableAudioInput[] = "disable-audio-input"; -// Present video content as overlays. -const char kUseOverlaysForVideo[] = "use-overlays-for-video"; - // Minimum size for buffer size used for output video frames in // FuchsiaVideoDecoder. May be set to avoid re-allocating video buffers when an // application upgrades video resolution mid-stream.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index ab0c4a7..8acee2c 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -58,7 +58,6 @@ MEDIA_EXPORT extern const char kEnableProtectedVideoBuffers[]; MEDIA_EXPORT extern const char kForceProtectedVideoOutputBuffers[]; MEDIA_EXPORT extern const char kDisableAudioInput[]; -MEDIA_EXPORT extern const char kUseOverlaysForVideo[]; MEDIA_EXPORT extern const char kMinVideoDecoderOutputBufferSize[]; MEDIA_EXPORT extern const char kAudioCapturerWithEchoCancellation[]; #endif
diff --git a/media/fuchsia/video/fuchsia_video_decoder.cc b/media/fuchsia/video/fuchsia_video_decoder.cc index f089eac..34d78313 100644 --- a/media/fuchsia/video/fuchsia_video_decoder.cc +++ b/media/fuchsia/video/fuchsia_video_decoder.cc
@@ -229,9 +229,7 @@ bool allow_overlays) : raster_context_provider_(raster_context_provider), media_codec_provider_(media_codec_provider), - use_overlays_for_video_(allow_overlays && - base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kUseOverlaysForVideo)), + use_overlays_for_video_(allow_overlays), sysmem_allocator_("CrFuchsiaVideoDecoder"), client_native_pixmap_factory_( ui::CreateClientNativePixmapFactoryOzone()) { @@ -320,6 +318,11 @@ protected_output_ = secure_mode != media::mojom::VideoDecoderSecureMemoryMode::CLEAR; + LOG(ERROR) << "+++ SECURE MODE = " << static_cast<int>(secure_mode) + << " use_overlays=" << use_overlays_for_video_ << " force=" + << base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kForceProtectedVideoOutputBuffers); + // Reset output buffers since we won't be able to re-use them. ReleaseOutputBuffers();
diff --git a/media/gpu/chromeos/vd_video_decode_accelerator.cc b/media/gpu/chromeos/vd_video_decode_accelerator.cc index 727b2680..e4b8095 100644 --- a/media/gpu/chromeos/vd_video_decode_accelerator.cc +++ b/media/gpu/chromeos/vd_video_decode_accelerator.cc
@@ -258,7 +258,7 @@ // its use. vd_ = create_vd_cb_.Run( gpu::GpuDriverBugWorkarounds(), client_task_runner_, - std::move(frame_pool), std::make_unique<VideoFrameConverter>(), + std::move(frame_pool), /*frame_converter=*/nullptr, VideoDecoderPipeline::DefaultPreferredRenderableFourccs(), std::make_unique<NullMediaLog>(), /*oop_video_decoder=*/{});
diff --git a/media/gpu/chromeos/vd_video_decode_accelerator.h b/media/gpu/chromeos/vd_video_decode_accelerator.h index 983426a3..1a72342 100644 --- a/media/gpu/chromeos/vd_video_decode_accelerator.h +++ b/media/gpu/chromeos/vd_video_decode_accelerator.h
@@ -22,7 +22,6 @@ #include "media/gpu/chromeos/fourcc.h" #include "media/gpu/chromeos/vda_video_frame_pool.h" #include "media/gpu/chromeos/video_decoder_pipeline.h" -#include "media/gpu/chromeos/video_frame_converter.h" #include "media/gpu/media_gpu_export.h" #include "media/mojo/mojom/stable/stable_video_decoder.mojom.h" #include "media/video/video_decode_accelerator.h"
diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc index cec76df1..6e66f2f9a 100644 --- a/media/gpu/chromeos/video_decoder_pipeline.cc +++ b/media/gpu/chromeos/video_decoder_pipeline.cc
@@ -200,7 +200,6 @@ mojo::PendingRemote<stable::mojom::StableVideoDecoder> oop_video_decoder) { DCHECK(client_task_runner); DCHECK(frame_pool); - DCHECK(frame_converter); DCHECK(!renderable_fourccs.empty()); CreateDecoderFunctionCB create_decoder_function_cb; @@ -326,13 +325,14 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); DETACH_FROM_SEQUENCE(decoder_sequence_checker_); DCHECK(main_frame_pool_); - DCHECK(frame_converter_); DCHECK(client_task_runner_); DVLOGF(2); decoder_weak_this_ = decoder_weak_this_factory_.GetWeakPtr(); main_frame_pool_->set_parent_task_runner(decoder_task_runner_); + if (!frame_converter_) + return; frame_converter_->Initialize( decoder_task_runner_, base::BindRepeating(&VideoDecoderPipeline::OnFrameConverted, @@ -594,7 +594,8 @@ if (image_processor_) image_processor_->Reset(); - frame_converter_->AbortPendingFrames(); + if (frame_converter_) + frame_converter_->AbortPendingFrames(); #if BUILDFLAG(IS_CHROMEOS) if (buffer_transcryptor_) @@ -678,7 +679,6 @@ void VideoDecoderPipeline::OnFrameDecoded(scoped_refptr<VideoFrame> frame) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_); - DCHECK(frame_converter_); DVLOGF(4); if (uses_oop_video_decoder_) { @@ -691,17 +691,22 @@ std::move(frame), base::BindOnce(&VideoDecoderPipeline::OnFrameProcessed, decoder_weak_this_)); - } else { - frame_converter_->ConvertFrame(std::move(frame)); + return; } + if (frame_converter_) + frame_converter_->ConvertFrame(std::move(frame)); + else + OnFrameConverted(std::move(frame)); } void VideoDecoderPipeline::OnFrameProcessed(scoped_refptr<VideoFrame> frame) { DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_); - DCHECK(frame_converter_); DVLOGF(4); - frame_converter_->ConvertFrame(std::move(frame)); + if (frame_converter_) + frame_converter_->ConvertFrame(std::move(frame)); + else + OnFrameConverted(std::move(frame)); } void VideoDecoderPipeline::OnFrameConverted(scoped_refptr<VideoFrame> frame) { @@ -744,7 +749,7 @@ DVLOGF(3); DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_); - return frame_converter_->HasPendingFrames() || + return (frame_converter_ && frame_converter_->HasPendingFrames()) || (image_processor_ && image_processor_->HasPendingFrames()); } @@ -755,10 +760,10 @@ has_error_ = true; - if (image_processor_) { + if (image_processor_) image_processor_->Reset(); - } - frame_converter_->AbortPendingFrames(); + if (frame_converter_) + frame_converter_->AbortPendingFrames(); #if BUILDFLAG(IS_CHROMEOS) if (buffer_transcryptor_)
diff --git a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc index cb042c9..e86c658 100644 --- a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc +++ b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
@@ -23,7 +23,6 @@ #include "media/base/status.h" #include "media/base/video_decoder_config.h" #include "media/gpu/chromeos/dmabuf_video_frame_pool.h" -#include "media/gpu/chromeos/mailbox_video_frame_converter.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/libdrm/src/include/drm/drm_fourcc.h" @@ -180,14 +179,13 @@ gfx::Rect(kCodedSize), kCodedSize, EmptyExtraData(), - EncryptionScheme::kUnencrypted), - converter_(new VideoFrameConverter) { + EncryptionScheme::kUnencrypted) { auto pool = std::make_unique<MockVideoFramePool>(); pool_ = pool.get(); decoder_ = base::WrapUnique(new VideoDecoderPipeline( gpu::GpuDriverBugWorkarounds(), base::SingleThreadTaskRunner::GetCurrentDefault(), std::move(pool), - std::move(converter_), + /*frame_converter=*/nullptr, VideoDecoderPipeline::DefaultPreferredRenderableFourccs(), std::make_unique<MockMediaLog>(), // This callback needs to be configured in the individual tests. @@ -381,7 +379,6 @@ scoped_refptr<DecoderBuffer> transcrypted_buffer_; media::CallbackRegistry<CdmContext::EventCB::RunType> event_callbacks_; #endif // BUILDFLAG(IS_CHROMEOS_ASH) - std::unique_ptr<VideoFrameConverter> converter_; std::unique_ptr<VideoDecoderPipeline> decoder_; raw_ptr<MockVideoFramePool> pool_; };
diff --git a/media/gpu/test/video_player/decoder_wrapper.cc b/media/gpu/test/video_player/decoder_wrapper.cc index 45e979fe..3ac61a0 100644 --- a/media/gpu/test/video_player/decoder_wrapper.cc +++ b/media/gpu/test/video_player/decoder_wrapper.cc
@@ -29,7 +29,6 @@ #if BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) #include "media/gpu/chromeos/platform_video_frame_pool.h" #include "media/gpu/chromeos/video_decoder_pipeline.h" -#include "media/gpu/chromeos/video_frame_converter.h" #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) namespace media { @@ -167,7 +166,7 @@ gpu::GpuDriverBugWorkarounds(), base::SingleThreadTaskRunner::GetCurrentDefault(), std::make_unique<PlatformVideoFramePool>(), - std::make_unique<VideoFrameConverter>(), + /*frame_converter=*/nullptr, VideoDecoderPipeline::DefaultPreferredRenderableFourccs(), std::make_unique<NullMediaLog>(), /*oop_video_decoder=*/{});
diff --git a/media/gpu/v4l2/test/v4l2_ioctl_shim.cc b/media/gpu/v4l2/test/v4l2_ioctl_shim.cc index 2faafdf..a80efe2b 100644 --- a/media/gpu/v4l2/test/v4l2_ioctl_shim.cc +++ b/media/gpu/v4l2/test/v4l2_ioctl_shim.cc
@@ -83,7 +83,8 @@ // Returns resolution and number of planes given |pix_mp|. std::ostream& operator<<(std::ostream& ostream, const struct v4l2_pix_format_mplane& pix_mp) { - ostream << pix_mp.width << " x " << pix_mp.height + ostream << media::FourccToString(pix_mp.pixelformat) << ", " << pix_mp.width + << " x " << pix_mp.height << ", num_planes = " << static_cast<size_t>(pix_mp.num_planes) << "."; return ostream; @@ -575,6 +576,19 @@ LOG_ASSERT(ret) << "VIDIOC_S_EXT_CTRLS failed."; } +void V4L2IoctlShim::SetExtCtrlsImmediate( + const std::unique_ptr<V4L2Queue>& queue, + v4l2_ext_controls* ext_ctrls) const { + // TODO(b/230021497): add compressed header probability related change + // when V4L2_CID_STATELESS_VP9_COMPRESSED_HDR is supported + ext_ctrls->which = V4L2_CTRL_WHICH_CUR_VAL; + ext_ctrls->request_fd = queue->media_request_fd(); + + const bool ret = Ioctl(VIDIOC_S_EXT_CTRLS, ext_ctrls); + + LOG_ASSERT(ret) << "VIDIOC_S_EXT_CTRLS failed."; +} + void V4L2IoctlShim::MediaIocRequestAlloc(int* media_request_fd) const { LOG_ASSERT(media_request_fd != nullptr) << "|media_request_fd| check failed.\n";
diff --git a/media/gpu/v4l2/test/v4l2_ioctl_shim.h b/media/gpu/v4l2/test/v4l2_ioctl_shim.h index f609f372..a279d74 100644 --- a/media/gpu/v4l2/test/v4l2_ioctl_shim.h +++ b/media/gpu/v4l2/test/v4l2_ioctl_shim.h
@@ -202,6 +202,12 @@ void SetExtCtrls(const std::unique_ptr<V4L2Queue>& queue, v4l2_ext_controls* ext_ctrls) const; + // Sets the value of controls which specify decoding parameters + // for each frame. Submits with V4L2_CTRL_WHICH_CUR_VAL to produce an + // immediate result instead of queuing up. + void SetExtCtrlsImmediate(const std::unique_ptr<V4L2Queue>& queue, + v4l2_ext_controls* ext_ctrls) const; + // Allocates requests (likely one per OUTPUT buffer) via // MEDIA_IOC_REQUEST_ALLOC on the media device. void MediaIocRequestAlloc(int* req_fd) const;
diff --git a/media/gpu/v4l2/test/vp9_decoder.cc b/media/gpu/v4l2/test/vp9_decoder.cc index 0f1c97fe..ad8d870 100644 --- a/media/gpu/v4l2/test/vp9_decoder.cc +++ b/media/gpu/v4l2/test/vp9_decoder.cc
@@ -447,6 +447,7 @@ break; } + const bool isOUTPUTQueueNew = !OUTPUT_queue_; if (!OUTPUT_queue_) { CreateOUTPUTQueue(kDriverCodecFourcc); } @@ -486,7 +487,16 @@ .ptr = &v4l2_compressed_hdr_probs}; } - v4l2_ioctl_->SetExtCtrls(OUTPUT_queue_, &ext_ctrls); + // Before the CAPTURE queue is set up the first frame must be parsed by the + // driver. This is done so that when VIDIOC_G_FMT is called the frame + // dimensions and format will be ready. Specifying V4L2_CTRL_WHICH_CUR_VAL + // when VIDIOC_S_EXT_CTRLS processes the request immediately so that the frame + // is parsed by the driver and the state is readied. + if (isOUTPUTQueueNew) { + v4l2_ioctl_->SetExtCtrlsImmediate(OUTPUT_queue_, &ext_ctrls); + } else { + v4l2_ioctl_->SetExtCtrls(OUTPUT_queue_, &ext_ctrls); + } v4l2_ioctl_->MediaRequestIocQueue(OUTPUT_queue_);
diff --git a/media/mojo/services/stable_video_decoder_factory_service.cc b/media/mojo/services/stable_video_decoder_factory_service.cc index 6e58b8a..50994a2 100644 --- a/media/mojo/services/stable_video_decoder_factory_service.cc +++ b/media/mojo/services/stable_video_decoder_factory_service.cc
@@ -14,7 +14,6 @@ #include "media/gpu/buildflags.h" #include "media/gpu/chromeos/platform_video_frame_pool.h" #include "media/gpu/chromeos/video_decoder_pipeline.h" -#include "media/gpu/chromeos/video_frame_converter.h" #include "media/gpu/gpu_video_accelerator_util.h" #include "media/gpu/gpu_video_decode_accelerator_factory.h" #include "media/gpu/gpu_video_decode_accelerator_helpers.h" @@ -131,7 +130,7 @@ gpu_driver_bug_workarounds_, /*client_task_runner=*/std::move(task_runner), std::make_unique<PlatformVideoFramePool>(), - std::make_unique<media::VideoFrameConverter>(), + /*frame_converter=*/nullptr, VideoDecoderPipeline::DefaultPreferredRenderableFourccs(), std::move(log), /*oop_video_decoder=*/{});
diff --git a/media/test/pipeline_integration_test.cc b/media/test/pipeline_integration_test.cc index 29e005be..2049b32 100644 --- a/media/test/pipeline_integration_test.cc +++ b/media/test/pipeline_integration_test.cc
@@ -82,31 +82,41 @@ #if defined(OPUS_FIXED_POINT) // NOTE: These hashes are specific to ARM devices, which use fixed-point Opus // implementation. x86 uses floating-point Opus, so x86 hashes won't match -#if defined(ARCH_CPU_ARM64) +constexpr char kOpusSmallCodecDelayHash_1[] = + "-0.48,-0.09,1.27,1.06,1.54,-0.22,"; + +#if defined(ARCH_CPU_ARM_FAMILY) +constexpr char kOpusSmallCodecDelayHash_2[] = "0.29,0.15,-0.19,0.25,0.68,0.83,"; +constexpr char kOpusMonoOutputHash[] = "-2.39,-1.66,0.81,1.54,1.48,-0.91,"; + +#if defined(ARCH_CPU_32BITS) +constexpr char kOpusEndTrimmingHash_1[] = + "-4.58,-5.68,-6.53,-6.29,-4.35,-3.59,"; +constexpr char kOpusEndTrimmingHash_2[] = + "-11.93,-11.12,-8.26,-7.11,-7.85,-10.01,"; +constexpr char kOpusEndTrimmingHash_3[] = + "-13.33,-14.39,-13.69,-11.68,-10.19,-10.50,"; +#else // Assume 64-bits for arm-generic configurations. constexpr char kOpusEndTrimmingHash_1[] = "-4.58,-5.68,-6.53,-6.28,-4.35,-3.59,"; constexpr char kOpusEndTrimmingHash_2[] = "-11.92,-11.11,-8.25,-7.10,-7.84,-10.00,"; constexpr char kOpusEndTrimmingHash_3[] = "-13.33,-14.38,-13.68,-11.66,-10.18,-10.49,"; -constexpr char kOpusSmallCodecDelayHash_1[] = - "-0.48,-0.09,1.27,1.06,1.54,-0.22,"; -constexpr char kOpusSmallCodecDelayHash_2[] = "0.29,0.15,-0.19,0.25,0.68,0.83,"; -constexpr char kOpusMonoOutputHash[] = "-2.39,-1.66,0.81,1.54,1.48,-0.91,"; -#else +#endif // defined(ARCH_CPU_32BITS) + +#else // Assume X86 hashes: constexpr char kOpusEndTrimmingHash_1[] = "-4.57,-5.66,-6.52,-6.30,-4.37,-3.61,"; constexpr char kOpusEndTrimmingHash_2[] = "-11.91,-11.11,-8.27,-7.13,-7.86,-10.00,"; constexpr char kOpusEndTrimmingHash_3[] = "-13.31,-14.38,-13.70,-11.71,-10.21,-10.49,"; -constexpr char kOpusSmallCodecDelayHash_1[] = - "-0.48,-0.09,1.27,1.06,1.54,-0.22,"; constexpr char kOpusSmallCodecDelayHash_2[] = "0.29,0.14,-0.20,0.24,0.68,0.83,"; constexpr char kOpusMonoOutputHash[] = "-2.41,-1.66,0.79,1.53,1.46,-0.91,"; -#endif // defined(ARCH_CPU_ARM64) +#endif // defined(ARCH_CPU_ARM_FAMILY) -#else +#else // Use non-fixed point hashes: // Hash for a full playthrough of "opus-trimming-test.(webm|ogg)". constexpr char kOpusEndTrimmingHash_1[] = "-4.57,-5.67,-6.52,-6.28,-4.34,-3.58,";
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc index 159f81f..ef3afeaa 100644 --- a/media/video/video_encode_accelerator_adapter.cc +++ b/media/video/video_encode_accelerator_adapter.cc
@@ -710,17 +710,21 @@ input_coded_size_ = input_coded_size; - output_handle_holder_ = output_pool_->MaybeAllocateBuffer(output_buffer_size); - if (!output_handle_holder_) { - InitCompleted(EncoderStatus::Codes::kEncoderInitializationError); - return; + constexpr int kOutputBufferNumber = 2; + output_buffer_handles_.clear(); + for (int id = 0; id < kOutputBufferNumber; id++) { + auto handle = output_pool_->MaybeAllocateBuffer(output_buffer_size); + if (!handle) { + InitCompleted(EncoderStatus::Codes::kEncoderInitializationError); + return; + } + + const base::UnsafeSharedMemoryRegion& region = handle->GetRegion(); + accelerator_->UseOutputBitstreamBuffer( + BitstreamBuffer(id, region.Duplicate(), region.GetSize())); + output_buffer_handles_.push_back(std::move(handle)); } - const base::UnsafeSharedMemoryRegion& region = - output_handle_holder_->GetRegion(); - // There is always one output buffer. - accelerator_->UseOutputBitstreamBuffer( - BitstreamBuffer(0, region.Duplicate(), region.GetSize())); InitCompleted(EncoderStatus::Codes::kOk); } @@ -746,10 +750,18 @@ if (metadata.encoded_size) result.encoded_size = metadata.encoded_size; - DCHECK_EQ(buffer_id, 0); - // There is always one output buffer. + if (buffer_id < 0 || + buffer_id >= static_cast<int>(output_buffer_handles_.size())) { + DLOG(ERROR) << "Buffer id is out of bounds: " << buffer_id; + NotifyError(VideoEncodeAccelerator::kPlatformFailureError); + } + if (!output_buffer_handles_[buffer_id]) { + DLOG(ERROR) << "Invalid output buffer."; + NotifyError(VideoEncodeAccelerator::kPlatformFailureError); + } + const base::WritableSharedMemoryMapping& mapping = - output_handle_holder_->GetMapping(); + output_buffer_handles_[buffer_id]->GetMapping(); DCHECK_LE(result.size, mapping.size()); if (result.size > 0) { @@ -780,7 +792,6 @@ } if (!status.is_ok()) { - LOG(ERROR) << status.message(); NotifyError(VideoEncodeAccelerator::kPlatformFailureError); return; } @@ -814,7 +825,6 @@ } if (!status.is_ok()) { - LOG(ERROR) << status.message(); NotifyError(VideoEncodeAccelerator::kPlatformFailureError); return; } @@ -843,7 +853,7 @@ // Give the buffer back to |accelerator_| const base::UnsafeSharedMemoryRegion& region = - output_handle_holder_->GetRegion(); + output_buffer_handles_[buffer_id]->GetRegion(); accelerator_->UseOutputBitstreamBuffer( BitstreamBuffer(buffer_id, region.Duplicate(), region.GetSize()));
diff --git a/media/video/video_encode_accelerator_adapter.h b/media/video/video_encode_accelerator_adapter.h index 1f02e38..4274e92 100644 --- a/media/video/video_encode_accelerator_adapter.h +++ b/media/video/video_encode_accelerator_adapter.h
@@ -131,7 +131,8 @@ scoped_refptr<ReadOnlyRegionPool> input_pool_; scoped_refptr<base::UnsafeSharedMemoryPool> output_pool_; - std::unique_ptr<base::UnsafeSharedMemoryPool::Handle> output_handle_holder_; + std::vector<std::unique_ptr<base::UnsafeSharedMemoryPool::Handle>> + output_buffer_handles_; scoped_refptr<GpuMemoryBufferVideoFramePool> gmb_frame_pool_; std::unique_ptr<VideoEncodeAccelerator> accelerator_;
diff --git a/mojo/core/embedder/features.cc b/mojo/core/embedder/features.cc index a3b2ae1..22906450 100644 --- a/mojo/core/embedder/features.cc +++ b/mojo/core/embedder/features.cc
@@ -39,5 +39,11 @@ BASE_FEATURE(kMojoIpcz, "MojoIpcz", base::FEATURE_ENABLED_BY_DEFAULT); #endif +#if BUILDFLAG(IS_ANDROID) +BASE_FEATURE(kMojoDirectSharedMemoryAndroid, + "MojoDirectSharedMemoryAndroid", + base::FEATURE_DISABLED_BY_DEFAULT); +#endif + } // namespace core } // namespace mojo
diff --git a/mojo/core/embedder/features.h b/mojo/core/embedder/features.h index a7fb3c8..c5f9376d 100644 --- a/mojo/core/embedder/features.h +++ b/mojo/core/embedder/features.h
@@ -41,6 +41,11 @@ COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES) BASE_DECLARE_FEATURE(kMojoIpcz); +#if BUILDFLAG(IS_ANDROID) +COMPONENT_EXPORT(MOJO_CORE_EMBEDDER_FEATURES) +BASE_DECLARE_FEATURE(kMojoDirectSharedMemoryAndroid); +#endif + } // namespace core } // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization_forward.h b/mojo/public/cpp/bindings/lib/serialization_forward.h index e91ea6d7..fac9ba0 100644 --- a/mojo/public/cpp/bindings/lib/serialization_forward.h +++ b/mojo/public/cpp/bindings/lib/serialization_forward.h
@@ -10,6 +10,7 @@ #include "mojo/public/cpp/bindings/array_traits.h" #include "mojo/public/cpp/bindings/enum_traits.h" #include "mojo/public/cpp/bindings/lib/buffer.h" +#include "mojo/public/cpp/bindings/lib/default_construct_tag_internal.h" #include "mojo/public/cpp/bindings/lib/message_fragment.h" #include "mojo/public/cpp/bindings/lib/template_util.h" #include "mojo/public/cpp/bindings/map_traits.h" @@ -63,8 +64,14 @@ *output = absl::nullopt; return true; } - if (!*output) - output->emplace(); + if (!*output) { + if constexpr (std::is_constructible_v<typename InputUserType::value_type, + ::mojo::DefaultConstruct::Tag>) { + output->emplace(mojo::internal::DefaultConstructTag()); + } else { + output->emplace(); + } + } return Deserialize<MojomType>(std::forward<DataType>(input), &output->value(), std::forward<Args>(args)...);
diff --git a/mojo/public/rust/BUILD.gn b/mojo/public/rust/BUILD.gn index ca460997..c3d422a0 100644 --- a/mojo/public/rust/BUILD.gn +++ b/mojo/public/rust/BUILD.gn
@@ -5,26 +5,32 @@ import("//build/config/rust.gni") import("//build/rust/rust_bindgen.gni") import("//build/rust/rust_static_library.gni") -import("//build/rust/rust_unit_test.gni") -import("//build/rust/rust_unit_tests_group.gni") +import("//testing/test.gni") # Meta target to build everything group("rust") { deps = [ ":mojo_rust" ] } -# Build combined test runner, if Rust-native tests are supported. -if (can_build_rust_unit_tests) { - rust_unit_tests_group("mojo_rust_tests") { - deps = [ - "//mojo/public/rust/tests:mojo_rust_encoding_tests", - "//mojo/public/rust/tests:mojo_rust_integration_tests", - "//mojo/public/rust/tests:mojo_rust_system_tests", - ] - } -} else { - group("mojo_rust_tests") { - } +# These tests require real mojo and can't be mixed with test-only mojo. Mojo can +# only be initialized once per process, and can't change modes. +test("mojo_rust_integration_unittests") { + deps = [ + "//base/test:run_all_unittests", + "//mojo/public/rust/tests:mojo_rust_integration_tests", + "//mojo/public/rust/tests:mojo_rust_system_tests", + "//testing/gtest", + ] +} + +# These tests use stubbed out test-only mojo and can't be mixed with real mojo. +# Mojo can only be initialized once per process, and can't change modes. +test("mojo_rust_unittests") { + deps = [ + "//base/test:run_all_unittests", + "//mojo/public/rust/tests:mojo_rust_encoding_tests", + "//testing/gtest", + ] } source_set("mojo_c_system_wrapper") {
diff --git a/mojo/public/rust/tests/BUILD.gn b/mojo/public/rust/tests/BUILD.gn index e556252..646b91cb 100644 --- a/mojo/public/rust/tests/BUILD.gn +++ b/mojo/public/rust/tests/BUILD.gn
@@ -4,12 +4,8 @@ import("//build/config/rust.gni") import("//build/rust/rust_static_library.gni") -import("//build/rust/rust_unit_test.gni") -import("//build/rust/rust_unit_tests_group.gni") -assert(can_build_rust_unit_tests) - -rust_unit_test("mojo_rust_system_tests") { +rust_static_library("mojo_rust_system_tests") { testonly = true allow_unsafe = true crate_root = "system/lib.rs" @@ -21,12 +17,14 @@ ":c_test_support", ":test_util", "//mojo/public/rust:mojo_rust", + "//testing/rust_gtest_interop", "//third_party/rust/lazy_static/v1:test_support", ] } -rust_unit_test("mojo_rust_encoding_tests") { +rust_static_library("mojo_rust_encoding_tests") { testonly = true + allow_unsafe = true crate_root = "encoding/lib.rs" sources = [ "encoding/encoding.rs", @@ -41,10 +39,11 @@ "//mojo/public/c/system", "//mojo/public/rust:mojo_rust", "//mojo/public/rust:mojo_rust_system_test_support", + "//testing/rust_gtest_interop", ] } -rust_unit_test("mojo_rust_integration_tests") { +rust_static_library("mojo_rust_integration_tests") { testonly = true allow_unsafe = true crate_root = "integration/lib.rs" @@ -53,6 +52,7 @@ ":c_test_support", ":test_util", "//mojo/public/rust:mojo_rust", + "//testing/rust_gtest_interop", ] } @@ -62,6 +62,7 @@ crate_root = "util/lib.rs" edition = "2021" sources = [ "util/lib.rs" ] + deps = [ "//testing/rust_gtest_interop" ] } static_library("c_test_support") {
diff --git a/mojo/public/rust/tests/encoding/encoding.rs b/mojo/public/rust/tests/encoding/encoding.rs index 2056e81..cf13306 100644 --- a/mojo/public/rust/tests/encoding/encoding.rs +++ b/mojo/public/rust/tests/encoding/encoding.rs
@@ -13,9 +13,8 @@ use mojo::bindings::encoding::Context; use mojo::bindings::message::MessageHeader; use mojo::bindings::mojom::{MojomInterface, MojomPointer, MojomStruct}; - -use mojo::system; -use mojo::system::Handle; +use mojo::system::{self, Handle}; +use rust_gtest_interop::prelude::*; use std::collections::HashMap; @@ -39,7 +38,7 @@ macro_rules! encoding_tests { ($($name:ident { MessageHeader => $header_cls:expr, $req_type:ident => $cls:expr } )*) => { $( - stubbed_mojo_test!($name, { + stubbed_mojo_test!(MojoEncodingTest, $name, { let data = include_str!(concat!("../../../interfaces/bindings/tests/data/validation/", stringify!($name), ".data")); @@ -69,7 +68,7 @@ println!("{}: Verifying decoded payload again", stringify!($name)); cls(&redecoded_payload); }, - Err(msg) => panic!("Error: {}", msg), + Err(msg) => expect_true!(false, "Error: {}", msg), } }); )* @@ -80,57 +79,57 @@ conformance_mthd0_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 0); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 0); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod0Request => { |payload: &ConformanceTestInterfaceMethod0Request| { - assert_eq!(payload.param0, -1.0); + expect_eq!(payload.param0, -1.0); } } } conformance_mthd1_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 1); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 1); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod1Request => { |payload: &ConformanceTestInterfaceMethod1Request| { - assert_eq!(payload.param0.i, 1234); + expect_eq!(payload.param0.i, 1234); } } } conformance_mthd2_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 2); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 2); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod2Request => { |payload: &ConformanceTestInterfaceMethod2Request| { - assert_eq!(payload.param0.struct_a.i, 12345); - assert_eq!(payload.param1.i, 67890); + expect_eq!(payload.param0.struct_a.i, 12345); + expect_eq!(payload.param1.i, 67890); } } } conformance_mthd3_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 3); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 3); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod3Request => { |payload: &ConformanceTestInterfaceMethod3Request| { - assert_eq!(payload.param0, vec![true, false, true, false, + expect_eq!(payload.param0, vec![true, false, true, false, true, false, true, false, true, true, true, true]); } @@ -139,77 +138,77 @@ conformance_mthd4_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 4); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 4); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod4Request => { |payload: &ConformanceTestInterfaceMethod4Request| { - assert_eq!(payload.param0.data, vec![0, 1, 2]); - assert_eq!(payload.param1, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); + expect_eq!(payload.param0.data, vec![0, 1, 2]); + expect_eq!(payload.param1, vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]); } } } conformance_mthd5_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 5); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 5); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod5Request => { |payload: &ConformanceTestInterfaceMethod5Request| { - assert_eq!(payload.param0.struct_d.message_pipes.len(), 2); + expect_eq!(payload.param0.struct_d.message_pipes.len(), 2); for h in payload.param0.struct_d.message_pipes.iter() { - assert_eq!(h.get_native_handle(), 0); + expect_eq!(h.get_native_handle(), 0); } - assert_eq!(payload.param0.data_pipe_consumer.get_native_handle(), 0); - assert_eq!(payload.param1.get_native_handle(), 0); + expect_eq!(payload.param0.data_pipe_consumer.get_native_handle(), 0); + expect_eq!(payload.param1.get_native_handle(), 0); } } } conformance_mthd6_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 6); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 6); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod6Request => { |payload: &ConformanceTestInterfaceMethod6Request| { - assert_eq!(payload.param0, vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]); + expect_eq!(payload.param0, vec![vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]); } } } conformance_mthd7_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 7); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 7); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod7Request => { |payload: &ConformanceTestInterfaceMethod7Request| { - assert_eq!(payload.param0.fixed_size_array, [0, 1, 2]); - assert_eq!(payload.param1, [None, Some([0, 1, 2])]); + expect_eq!(payload.param0.fixed_size_array, [0, 1, 2]); + expect_eq!(payload.param1, [None, Some([0, 1, 2])]); } } } conformance_mthd8_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 8); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 8); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod8Request => { |payload: &ConformanceTestInterfaceMethod8Request| { - assert_eq!(payload.param0, + expect_eq!(payload.param0, vec![None, Some(vec![String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap()]), None]); } } @@ -217,26 +216,26 @@ conformance_mthd9_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 9); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 9); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod9Request => { |payload: &ConformanceTestInterfaceMethod9Request| { - assert!(payload.param0.is_some()); + expect_true!(payload.param0.is_some()); if let Some(ref v) = payload.param0 { - assert_eq!(v.len(), 2); - assert_eq!(v[0].len(), 2); - assert_eq!(v[1].len(), 3); - assert!(v[0][0].is_some()); - assert!(v[0][1].is_none()); - assert!(v[1][0].is_some()); - assert!(v[1][1].is_none()); - assert!(v[1][2].is_some()); - assert_eq!(v[0][0].as_ref().unwrap().get_native_handle(), 0); - assert_eq!(v[1][0].as_ref().unwrap().get_native_handle(), 0); - assert_eq!(v[1][2].as_ref().unwrap().get_native_handle(), 0); + expect_eq!(v.len(), 2); + expect_eq!(v[0].len(), 2); + expect_eq!(v[1].len(), 3); + expect_true!(v[0][0].is_some()); + expect_true!(v[0][1].is_none()); + expect_true!(v[1][0].is_some()); + expect_true!(v[1][1].is_none()); + expect_true!(v[1][2].is_some()); + expect_eq!(v[0][0].as_ref().unwrap().get_native_handle(), 0); + expect_eq!(v[1][0].as_ref().unwrap().get_native_handle(), 0); + expect_eq!(v[1][2].as_ref().unwrap().get_native_handle(), 0); } } } @@ -244,23 +243,23 @@ conformance_mthd9_good_null_array { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 9); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 9); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod9Request => { |payload: &ConformanceTestInterfaceMethod9Request| { - assert!(payload.param0.is_none()); + expect_true!(payload.param0.is_none()); } } } conformance_mthd10_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 10); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 10); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod10Request => { @@ -268,7 +267,7 @@ let mut map = HashMap::with_capacity(2); map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); map.insert(String::from_utf8(vec![5, 6, 7, 8, 9]).unwrap(), 2); - assert_eq!(payload.param0, map); + expect_eq!(payload.param0, map); } } } @@ -280,9 +279,9 @@ conformance_mthd10_good_non_unique_keys { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 10); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 10); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod10Request => { @@ -290,173 +289,173 @@ let mut map = HashMap::with_capacity(2); map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 2); - assert_eq!(payload.param0, map); + expect_eq!(payload.param0, map); } } } conformance_mthd11_good_version0 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, false); - assert!(payload.param0.struct_a.is_none()); - assert!(payload.param0.str.is_none()); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, false); + expect_true!(payload.param0.struct_a.is_none()); + expect_true!(payload.param0.str.is_none()); } } } conformance_mthd11_good_version1 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, false); - assert!(payload.param0.struct_a.is_none()); - assert!(payload.param0.str.is_none()); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, false); + expect_true!(payload.param0.struct_a.is_none()); + expect_true!(payload.param0.str.is_none()); } } } conformance_mthd11_good_version2 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, false); - assert!(payload.param0.struct_a.is_none()); - assert!(payload.param0.str.is_none()); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, false); + expect_true!(payload.param0.struct_a.is_none()); + expect_true!(payload.param0.str.is_none()); } } } conformance_mthd11_good_version3 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, true); - assert!(payload.param0.struct_a.is_none()); - assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, true); + expect_true!(payload.param0.struct_a.is_none()); + expect_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); } } } conformance_mthd11_good_version_newer_than_known_1 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, true); - assert!(payload.param0.struct_a.is_none()); - assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, true); + expect_true!(payload.param0.struct_a.is_none()); + expect_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); } } } conformance_mthd11_good_version_newer_than_known_2 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 11); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 11); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod11Request => { |payload: &ConformanceTestInterfaceMethod11Request| { - assert_eq!(payload.param0.i, 123); - assert_eq!(payload.param0.b, true); - assert!(payload.param0.struct_a.is_none()); - assert_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); + expect_eq!(payload.param0.i, 123); + expect_eq!(payload.param0.b, true); + expect_true!(payload.param0.struct_a.is_none()); + expect_eq!(payload.param0.str, Some(String::from_utf8(vec![0, 1]).unwrap())); } } } conformance_mthd13_good_1 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 13); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 13); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod13Request => { |payload: &ConformanceTestInterfaceMethod13Request| { - assert!(payload.param0.is_none()); - assert_eq!(payload.param1, 65535); - assert!(payload.param2.is_none()); + expect_true!(payload.param0.is_none()); + expect_eq!(payload.param1, 65535); + expect_true!(payload.param2.is_none()); } } } conformance_mthd13_good_2 { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 0); - assert_eq!(header.name, 13); - assert_eq!(header.flags, 0); + expect_eq!(header.version, 0); + expect_eq!(header.name, 13); + expect_eq!(header.flags, 0); } }, ConformanceTestInterfaceMethod13Request => { |payload: &ConformanceTestInterfaceMethod13Request| { - assert!(payload.param0.is_some()); - assert_eq!(payload.param0.as_ref().unwrap().pipe().get_native_handle(), 0); - assert_eq!(payload.param1, 65535); - assert!(payload.param2.is_some()); - assert_eq!(payload.param2.as_ref().unwrap().pipe().get_native_handle(), 0); + expect_true!(payload.param0.is_some()); + expect_eq!(payload.param0.as_ref().unwrap().pipe().get_native_handle(), 0); + expect_eq!(payload.param1, 65535); + expect_true!(payload.param2.is_some()); + expect_eq!(payload.param2.as_ref().unwrap().pipe().get_native_handle(), 0); } } } integration_intf_rqst_mthd0_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 1); - assert_eq!(header.name, 0); - assert_eq!(header.flags, 1); - assert_eq!(header.request_id, 7); + expect_eq!(header.version, 1); + expect_eq!(header.name, 0); + expect_eq!(header.flags, 1); + expect_eq!(header.request_id, 7); } }, IntegrationTestInterfaceMethod0Request => { |payload: &IntegrationTestInterfaceMethod0Request| { - assert_eq!(payload.param0.a, -1); + expect_eq!(payload.param0.a, -1); } } } integration_intf_resp_mthd0_good { MessageHeader => { |header: MessageHeader| { - assert_eq!(header.version, 1); - assert_eq!(header.name, 0); - assert_eq!(header.flags, 2); - assert_eq!(header.request_id, 1); + expect_eq!(header.version, 1); + expect_eq!(header.name, 0); + expect_eq!(header.flags, 2); + expect_eq!(header.request_id, 1); } }, IntegrationTestInterfaceMethod0Response => { |payload: &IntegrationTestInterfaceMethod0Response| { - assert_eq!(payload.param0, vec![0]); + expect_eq!(payload.param0, vec![0]); } } } @@ -466,16 +465,17 @@ // conformance_mthd14_good_1 { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { - // UnionA::a(ref val) => assert_eq!(*val, 54), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::a(ref val) => expect_eq!(*val, 54), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -483,16 +483,17 @@ // conformance_mthd14_good_array_in_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { - // UnionA::d(ref val) => assert_eq!(*val, Some(vec![0, 1, 2])), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::d(ref val) => expect_eq!(*val, Some(vec![0, 1, 2])), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -500,9 +501,9 @@ // conformance_mthd14_good_map_in_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { @@ -511,8 +512,9 @@ // map.insert(String::from_utf8(vec![0, 1, 2, 3, 4]).unwrap(), 1); // map.insert(String::from_utf8(vec![5, 6, 7, 8, 9]).unwrap(), 2); // match payload.param0 { - // UnionA::e(ref val) => assert_eq!(*val, Some(map)), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::e(ref val) => expect_eq!(*val, Some(map)), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -520,23 +522,28 @@ // conformance_mthd14_good_nested_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { // UnionA::f(ref val) => { - // assert!(val.is_some()); + // expect_true!(val.is_some()); // let inner = val.as_ref().unwrap(); // match *inner { - // UnionB::b(inner_val) => assert_eq!(inner_val, 10), - // _ => panic!("Incorrect inner union variant! Tag found: {}", inner.get_tag()), + // UnionB::b(inner_val) => expect_eq!(inner_val, 10), + // _ => expect_true!( + // false, + // "Incorrect inner union variant! Tag found: {}", + // inner.get_tag() + // ), // } // }, - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -544,16 +551,17 @@ // conformance_mthd14_good_null_array_in_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { - // UnionA::d(ref val) => assert_eq!(*val, None), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::d(ref val) => expect_eq!(*val, None), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -561,16 +569,17 @@ // conformance_mthd14_good_null_map_in_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { - // UnionA::e(ref val) => assert_eq!(*val, None), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::e(ref val) => expect_eq!(*val, None), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -578,9 +587,9 @@ // conformance_mthd14_good_struct_in_union { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { @@ -588,9 +597,10 @@ // match payload.param0 { // UnionA::c(ref val) => { // let struct_val = val.as_ref().unwrap(); - // assert_eq!(struct_val.i, 20); + // expect_eq!(struct_val.i, 20); // }, - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -598,16 +608,17 @@ // conformance_mthd14_good_unknown_union_tag { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 14); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 14); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod14Request => { // |payload: &ConformanceTestInterfaceMethod14Request| { // match payload.param0 { - // UnionA::_Unknown(ref val) => assert_eq!(*val, 54), - // _ => panic!("Incorrect union variant! Tag found: {}", payload.param0.get_tag()), + // UnionA::_Unknown(ref val) => expect_eq!(*val, 54), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // payload.param0.get_tag()), // } // } // } @@ -615,24 +626,25 @@ // conformance_mthd15_good_union_in_array { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 15); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 15); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod15Request => { // |payload: &ConformanceTestInterfaceMethod15Request| { - // assert_eq!(payload.param0.a, true); - // assert_eq!(payload.param0.b, 22); - // assert!(payload.param0.c.is_none()); - // assert!(payload.param0.d.is_some()); - // assert!(payload.param0.e.is_none()); + // expect_eq!(payload.param0.a, true); + // expect_eq!(payload.param0.b, 22); + // expect_true!(payload.param0.c.is_none()); + // expect_true!(payload.param0.d.is_some()); + // expect_true!(payload.param0.e.is_none()); // let array = payload.param0.d.as_ref().unwrap(); - // assert_eq!(array.len(), 3); + // expect_eq!(array.len(), 3); // for u in array.iter() { // match *u { - // UnionA::b(ref val) => assert_eq!(*val, 10), - // _ => panic!("Incorrect union variant! Tag found: {}", u.get_tag()), + // UnionA::b(ref val) => expect_eq!(*val, 10), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // u.get_tag()), // } // } // } @@ -641,20 +653,20 @@ // conformance_mthd15_good_union_in_map { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 15); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 15); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod15Request => { // |payload: &ConformanceTestInterfaceMethod15Request| { - // assert_eq!(payload.param0.a, true); - // assert_eq!(payload.param0.b, 22); - // assert!(payload.param0.c.is_none()); - // assert!(payload.param0.d.is_none()); - // assert!(payload.param0.e.is_some()); + // expect_eq!(payload.param0.a, true); + // expect_eq!(payload.param0.b, 22); + // expect_true!(payload.param0.c.is_none()); + // expect_true!(payload.param0.d.is_none()); + // expect_true!(payload.param0.e.is_some()); // let map = payload.param0.e.as_ref().unwrap(); - // assert_eq!(map.len(), 3); + // expect_eq!(map.len(), 3); // let mut expect_keys = HashMap::with_capacity(3); // expect_keys.insert(8, false); // expect_keys.insert(7, false); @@ -662,13 +674,14 @@ // for (key, value) in map.iter() { // expect_keys.insert(*key, true); // match *value { - // UnionA::b(ref val) => assert_eq!(*val, 10), - // _ => panic!("Incorrect union variant! Tag found: {}", value.get_tag()), + // UnionA::b(ref val) => expect_eq!(*val, 10), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // value.get_tag()), // } // } // for (key, value) in expect_keys.iter() { // if *value == false { - // panic!("Expected key `{}`, but not found!", *key); + // expect_true!(false, "Expected key `{}`, but not found!", *key); // } // } // } @@ -677,22 +690,23 @@ // conformance_mthd15_good_union_in_struct { // MessageHeader => { // |header: MessageHeader| { - // assert_eq!(header.version, 0); - // assert_eq!(header.name, 15); - // assert_eq!(header.flags, 0); + // expect_eq!(header.version, 0); + // expect_eq!(header.name, 15); + // expect_eq!(header.flags, 0); // } // }, // ConformanceTestInterfaceMethod15Request => { // |payload: &ConformanceTestInterfaceMethod15Request| { - // assert_eq!(payload.param0.a, true); - // assert_eq!(payload.param0.b, 22); - // assert!(payload.param0.c.is_some()); - // assert!(payload.param0.d.is_none()); - // assert!(payload.param0.e.is_none()); + // expect_eq!(payload.param0.a, true); + // expect_eq!(payload.param0.b, 22); + // expect_true!(payload.param0.c.is_some()); + // expect_true!(payload.param0.d.is_none()); + // expect_true!(payload.param0.e.is_none()); // let union_val = payload.param0.c.as_ref().unwrap(); // match *union_val { - // UnionA::b(ref val) => assert_eq!(*val, 54), - // _ => panic!("Incorrect union variant! Tag found: {}", union_val.get_tag()), + // UnionA::b(ref val) => expect_eq!(*val, 54), + // _ => expect_true!(false, "Incorrect union variant! Tag found: {}", + // union_val.get_tag()), // } // } // }
diff --git a/mojo/public/rust/tests/encoding/lib.rs b/mojo/public/rust/tests/encoding/lib.rs index a15cdcac..07db13f 100644 --- a/mojo/public/rust/tests/encoding/lib.rs +++ b/mojo/public/rust/tests/encoding/lib.rs
@@ -3,18 +3,19 @@ // found in the LICENSE file. extern crate mojo_system_test_support as test_support; +extern crate rust_gtest_interop; extern crate test_util as util; /// Macro to produce a test which uses the stub Mojo backend. This is used /// instead of the macro from `test_util`, which initializes the full Mojo /// implementation. macro_rules! stubbed_mojo_test { - {$i: ident, $(#[$attr:meta])* $b:block} => { - #[test] + {$suite: ident, $t: ident, $(#[$attr:meta])* $b:block} => { + #[::rust_gtest_interop::prelude::gtest($suite, $t)] $( #[ $attr ] )* - fn $i() { + fn test() { crate::init(); $b }
diff --git a/mojo/public/rust/tests/encoding/regression.rs b/mojo/public/rust/tests/encoding/regression.rs index f1f1dbd..d968fb1 100644 --- a/mojo/public/rust/tests/encoding/regression.rs +++ b/mojo/public/rust/tests/encoding/regression.rs
@@ -13,6 +13,7 @@ use mojo::bindings::impl_encodable_for_pointer; use mojo::bindings::mojom::{MojomEncodable, MojomPointer, MojomStruct}; use mojo::system::{self, UntypedHandle}; +use rust_gtest_interop::prelude::*; const STRUCT_A_VERSIONS: [(u32, u32); 1] = [(0, 16)]; @@ -59,7 +60,7 @@ // Fixed size arrays have complex and unsafe semantics to ensure // there are no memory leaks. We test this behavior here to make // sure memory isn't becoming corrupted. -stubbed_mojo_test!(regression_fixed_size_array_error_propagates_safely, { +stubbed_mojo_test!(MojoRegressionTest, RegressionFixedSizeArrayErrorPropagatesSafely, { let handle1 = unsafe { system::acquire(0) }; let handle2 = unsafe { system::acquire(0) }; let handle3 = unsafe { system::acquire(0) }; @@ -68,8 +69,8 @@ handles.truncate(1); let new_val = <StructA<UntypedHandle>>::deserialize(&mut buffer[..], handles); match new_val { - Ok(_) => panic!("Value should not be okay!"), - Err(err) => assert_eq!(err, ValidationError::IllegalHandle), + Ok(_) => expect_true!(false, "Value should not be okay!"), + Err(err) => expect_eq!(err, ValidationError::IllegalHandle), } }); @@ -77,22 +78,16 @@ // For the only handle that should drop, we make the handle some // random number which is potentially a valid handle. When on // drop() we try to close it, we should panic. -stubbed_mojo_test!( - regression_fixed_size_array_verify_drop, - // Ignore this test, it panics while panicking - #[ignore] - #[should_panic] - { - let handle1 = unsafe { system::acquire(42) }; - let handle2 = unsafe { system::acquire(0) }; - let handle3 = unsafe { system::acquire(0) }; - let val = StructA { param0: [handle1, handle2, handle3] }; - let (mut buffer, mut handles) = val.auto_serialize(); - handles.truncate(1); - let new_val = <StructA<UntypedHandle>>::deserialize(&mut buffer[..], handles); - match new_val { - Ok(_) => panic!("Value should not be okay!"), - Err(err) => assert_eq!(err, ValidationError::IllegalHandle), - } +stubbed_mojo_test!(MojoRegressionTest, RegressionFixedSizeArrayVerifyDrop, { + let handle1 = unsafe { system::acquire(42) }; + let handle2 = unsafe { system::acquire(0) }; + let handle3 = unsafe { system::acquire(0) }; + let val = StructA { param0: [handle1, handle2, handle3] }; + let (mut buffer, mut handles) = val.auto_serialize(); + handles.truncate(1); + let new_val = <StructA<UntypedHandle>>::deserialize(&mut buffer[..], handles); + match new_val { + Ok(_) => expect_true!(false, "Value should not be okay!"), + Err(err) => expect_eq!(err, ValidationError::IllegalHandle), } -); +});
diff --git a/mojo/public/rust/tests/encoding/validation.rs b/mojo/public/rust/tests/encoding/validation.rs index 3db83eef..f5a28c8 100644 --- a/mojo/public/rust/tests/encoding/validation.rs +++ b/mojo/public/rust/tests/encoding/validation.rs
@@ -12,6 +12,7 @@ use mojo::bindings::mojom::MojomMessageOption; use mojo::system; +use rust_gtest_interop::prelude::*; /// This macro is a wrapper for the tests! macro as it takes advantage of the /// shared code between tests. @@ -24,7 +25,7 @@ macro_rules! validation_tests { ($($name:ident => $req_type:ident;)*) => { $( - stubbed_mojo_test!($name, { + stubbed_mojo_test!(MojoValidationTest, $name, { let data = include_str!(concat!("../../../interfaces/bindings/tests/data/validation/", stringify!($name), ".data")); @@ -38,8 +39,8 @@ mock_handles.push(unsafe { system::acquire(0) }); } match $req_type::decode_message(data, mock_handles) { - Ok(_) => panic!("Should not be valid!"), - Err(err) => assert_eq!(err.as_str(), expected), + Ok(_) => expect_true!(false, "Should not be valid!"), + Err(err) => expect_eq!(err.as_str(), expected), } }, Err(msg) => panic!("Error: {}", msg),
diff --git a/mojo/public/rust/tests/integration/lib.rs b/mojo/public/rust/tests/integration/lib.rs index 1d2d99d..37d789b 100644 --- a/mojo/public/rust/tests/integration/lib.rs +++ b/mojo/public/rust/tests/integration/lib.rs
@@ -4,11 +4,11 @@ //! Tests for system + encoding that use a real Mojo implementation. -extern crate test_util as util; - use mojo::bindings::mojom::{MojomInterface, MojomInterfaceRecv, MojomInterfaceSend}; use mojo::system::message_pipe; use mojo::system::{Handle, HandleSignals}; +use rust_gtest_interop::prelude::*; +use test_util::init; use std::thread; @@ -21,9 +21,9 @@ use mojom_validation::*; // Tests basic client and server interaction over a thread -#[test] -fn send_and_recv() { - util::init(); +#[gtest(MojoIntegrationTest, SendAndReceive)] +fn test() { + init(); let (endpt0, endpt1) = message_pipe::create().unwrap(); // Client and server handles @@ -43,10 +43,10 @@ client.pipe().wait(HandleSignals::READABLE); // Decode response let (req_id, options) = client.recv_response().unwrap(); - assert_eq!(req_id, 5); + expect_eq!(req_id, 5); match options { IntegrationTestInterfaceResponseOption::IntegrationTestInterfaceMethod0(msg) => { - assert_eq!(msg.param0, vec![1, 2, 3]); + expect_eq!(msg.param0, vec![1, 2, 3]); } } }); @@ -54,10 +54,10 @@ server.pipe().wait(HandleSignals::READABLE); // Decode request let (req_id, options) = server.recv_response().unwrap(); - assert_eq!(req_id, 5); + expect_eq!(req_id, 5); match options { IntegrationTestInterfaceRequestOption::IntegrationTestInterfaceMethod0(msg) => { - assert_eq!(msg.param0.a, -1); + expect_eq!(msg.param0.a, -1); } } // Send response
diff --git a/mojo/public/rust/tests/system/lib.rs b/mojo/public/rust/tests/system/lib.rs index 25f944cfc..f56ef13 100644 --- a/mojo/public/rust/tests/system/lib.rs +++ b/mojo/public/rust/tests/system/lib.rs
@@ -11,19 +11,18 @@ #![feature(assert_matches)] #![feature(maybe_uninit_write_slice)] -#[macro_use] -extern crate test_util as util; - mod run_loop; -use mojo::system::data_pipe; -use mojo::system::message_pipe; use mojo::system::shared_buffer::{self, SharedBuffer}; use mojo::system::trap::{ ArmResult, Trap, TrapEvent, TriggerCondition, UnsafeTrap, UnsafeTrapEvent, }; -use mojo::system::wait_set; -use mojo::system::{self, CastHandle, Handle, HandleSignals, MojoResult, SignalsState}; +use mojo::system::{ + self, data_pipe, message_pipe, wait_set, CastHandle, Handle, HandleSignals, MojoResult, + SignalsState, +}; +use rust_gtest_interop::prelude::*; +use test_util::init; use std::assert_matches::assert_matches; use std::mem::drop; @@ -32,20 +31,26 @@ use std::thread; use std::vec::Vec; -mojo_test!(handle, { +#[gtest(MojoSystemTest, Handle)] +fn test() { + init(); + let sb = SharedBuffer::new(1).unwrap(); let handle = sb.as_untyped(); unsafe { - assert_ne!(handle.get_native_handle(), 0); - assert!(handle.is_valid()); + expect_ne!(handle.get_native_handle(), 0); + expect_true!(handle.is_valid()); let mut h2 = system::acquire(handle.get_native_handle()); - assert!(h2.is_valid()); + expect_true!(h2.is_valid()); h2.invalidate(); - assert!(!h2.is_valid()); + expect_true!(!h2.is_valid()); } -}); +} -mojo_test!(shared_buffer, { +#[gtest(MojoSystemTest, SharedBuffer)] +fn test() { + init(); + let bufsize = 100; // Create a shared buffer and test round trip through `UntypedHandle`. @@ -54,17 +59,17 @@ let sb_native_handle = sb_first.get_native_handle(); let sb_untyped = sb_first.as_untyped(); - assert_eq!(sb_untyped.get_native_handle(), sb_native_handle); + expect_eq!(sb_untyped.get_native_handle(), sb_native_handle); let sb = unsafe { SharedBuffer::from_untyped(sb_untyped) }; - assert_eq!(sb.get_native_handle(), sb_native_handle); + expect_eq!(sb.get_native_handle(), sb_native_handle); // Check the reported size is the same as our requested size. let size = sb.get_info().unwrap(); - assert_eq!(size, bufsize); + expect_eq!(size, bufsize); // Map the buffer. let mut buf = sb.map(0, bufsize).unwrap(); - assert_eq!(buf.len(), bufsize as usize); + expect_eq!(buf.len(), bufsize as usize); buf.write(50, 34); // Duplicate it and drop the original handle, which should maintain the @@ -79,55 +84,61 @@ // Create a new mapping and check for what we wrote. let buf1 = sb1.map(50, 50).unwrap(); - assert_eq!(buf1.len(), 50); + expect_eq!(buf1.len(), 50); // verify buffer contents - assert_eq!(buf1.read(0), 34); - assert_eq!(buf1.read(1), 35); -}); + expect_eq!(buf1.read(0), 34); + expect_eq!(buf1.read(1), 35); +} -mojo_test!(message_pipe, { +#[gtest(MojoSystemTest, MessagePipe)] +fn test() { + init(); + let (end_a, end_b) = message_pipe::create().unwrap(); // Extract original handle to check against. let end_a_native_handle = end_a.get_native_handle(); // Test casting of handle types. let end_a_untyped = end_a.as_untyped(); - assert_eq!(end_a_untyped.get_native_handle(), end_a_native_handle); + expect_eq!(end_a_untyped.get_native_handle(), end_a_native_handle); // Test after UntypedHandle round trip. let end_a = unsafe { message_pipe::MessageEndpoint::from_untyped(end_a_untyped) }; - assert_eq!(end_a.get_native_handle(), end_a_native_handle); + expect_eq!(end_a.get_native_handle(), end_a_native_handle); let s: SignalsState = end_a.wait(HandleSignals::WRITABLE).satisfied().unwrap(); - assert!(s.satisfied().is_writable()); - assert!(s.satisfiable().is_readable()); - assert!(s.satisfiable().is_writable()); - assert!(s.satisfiable().is_peer_closed()); + expect_true!(s.satisfied().is_writable()); + expect_true!(s.satisfiable().is_readable()); + expect_true!(s.satisfiable().is_writable()); + expect_true!(s.satisfiable().is_peer_closed()); assert_matches!(end_a.read(), Err(mojo::MojoResult::ShouldWait)); let hello = "hello".to_string().into_bytes(); let write_result = end_b.write(&hello, Vec::new()); - assert_eq!(write_result, mojo::MojoResult::Okay); + expect_eq!(write_result, mojo::MojoResult::Okay); let s: SignalsState = end_a.wait(HandleSignals::READABLE).satisfied().unwrap(); - assert!(s.satisfied().is_readable()); - assert!(s.satisfied().is_writable()); - assert!(s.satisfiable().is_readable()); - assert!(s.satisfiable().is_writable()); - assert!(s.satisfiable().is_peer_closed()); + expect_true!(s.satisfied().is_readable()); + expect_true!(s.satisfied().is_writable()); + expect_true!(s.satisfiable().is_readable()); + expect_true!(s.satisfiable().is_writable()); + expect_true!(s.satisfiable().is_peer_closed()); let (hello_data, _handles) = end_a.read().expect("failed to read from end_a"); - assert_eq!(String::from_utf8(hello_data), Ok("hello".to_string())); + expect_eq!(String::from_utf8(hello_data), Ok("hello".to_string())); // Closing one endpoint should be seen by the other. drop(end_a); let s: SignalsState = end_b.wait(HandleSignals::READABLE | HandleSignals::WRITABLE).unsatisfiable().unwrap(); - assert!(s.satisfied().is_peer_closed()); + expect_true!(s.satisfied().is_peer_closed()); // For some reason QuotaExceeded is also set. TOOD(collinbaker): investigate. - assert!(s.satisfiable().is_peer_closed()); -}); + expect_true!(s.satisfiable().is_peer_closed()); +} -mojo_test!(data_pipe, { +#[gtest(MojoSystemTest, DataPipe)] +fn test() { + init(); + let (consumer, producer) = data_pipe::create_default().unwrap(); // Extract original handle to check against let consumer_native_handle = consumer.get_native_handle(); @@ -135,12 +146,12 @@ // Test casting of handle types let consumer_untyped = consumer.as_untyped(); let producer_untyped = producer.as_untyped(); - assert_eq!(consumer_untyped.get_native_handle(), consumer_native_handle); - assert_eq!(producer_untyped.get_native_handle(), producer_native_handle); + expect_eq!(consumer_untyped.get_native_handle(), consumer_native_handle); + expect_eq!(producer_untyped.get_native_handle(), producer_native_handle); let consumer = unsafe { data_pipe::Consumer::<u8>::from_untyped(consumer_untyped) }; let producer = unsafe { data_pipe::Producer::<u8>::from_untyped(producer_untyped) }; - assert_eq!(consumer.get_native_handle(), consumer_native_handle); - assert_eq!(producer.get_native_handle(), producer_native_handle); + expect_eq!(consumer.get_native_handle(), consumer_native_handle); + expect_eq!(producer.get_native_handle(), producer_native_handle); // Ensure the producer is writable, and check that we can wait on this // (which should return immediately). @@ -149,19 +160,19 @@ // Try writing a message. let hello = "hello".to_string().into_bytes(); let bytes_written = producer.write(&hello, data_pipe::WriteFlags::empty()).unwrap(); - assert_eq!(bytes_written, hello.len()); + expect_eq!(bytes_written, hello.len()); // Try reading our message. consumer.wait(HandleSignals::READABLE).satisfied().unwrap(); let data_string = String::from_utf8(consumer.read(data_pipe::ReadFlags::empty()).unwrap()).unwrap(); - assert_eq!(data_string, "hello".to_string()); + expect_eq!(data_string, "hello".to_string()); // Test two-phase read/write, where we acquire a buffer to use then // commit the read/write when done. let goodbye = "goodbye".to_string().into_bytes(); let mut write_buf = producer.begin().expect("error on write begin"); - assert!(write_buf.len() >= goodbye.len()); + expect_ge!(write_buf.len(), goodbye.len()); std::mem::MaybeUninit::write_slice(&mut write_buf[0..goodbye.len()], &goodbye); // SAFETY: we wrote `goodbye.len()` valid elements to `write_buf`, // so they are initialized. @@ -180,35 +191,41 @@ let data = read_buf.to_vec(); read_buf.commit(data.len()); - assert_eq!(data, goodbye); -}); + expect_eq!(data, goodbye); +} -mojo_test!(wait_set, { +#[gtest(MojoSystemTest, WaitSet)] +fn test() { + init(); + let mut set = wait_set::WaitSet::new().unwrap(); let (endpt0, endpt1) = message_pipe::create().unwrap(); let cookie1 = wait_set::WaitSetCookie(245); let cookie2 = wait_set::WaitSetCookie(123); let signals = HandleSignals::READABLE; - assert_eq!(set.add(&endpt0, signals, cookie1), mojo::MojoResult::Okay); - assert_eq!(set.add(&endpt0, signals, cookie1), mojo::MojoResult::AlreadyExists); - assert_eq!(set.remove(cookie1), mojo::MojoResult::Okay); - assert_eq!(set.remove(cookie1), mojo::MojoResult::NotFound); - assert_eq!(set.add(&endpt0, signals, cookie2), mojo::MojoResult::Okay); + expect_eq!(set.add(&endpt0, signals, cookie1), mojo::MojoResult::Okay); + expect_eq!(set.add(&endpt0, signals, cookie1), mojo::MojoResult::AlreadyExists); + expect_eq!(set.remove(cookie1), mojo::MojoResult::Okay); + expect_eq!(set.remove(cookie1), mojo::MojoResult::NotFound); + expect_eq!(set.add(&endpt0, signals, cookie2), mojo::MojoResult::Okay); thread::spawn(move || { let hello = "hello".to_string().into_bytes(); let write_result = endpt1.write(&hello, Vec::new()); - assert_eq!(write_result, mojo::MojoResult::Okay); + expect_eq!(write_result, mojo::MojoResult::Okay); }); let mut output = Vec::with_capacity(2); let result = set.wait_on_set(&mut output); - assert_eq!(result, mojo::MojoResult::Okay); - assert_eq!(output.len(), 1); - assert_eq!(output[0].cookie, cookie2); - assert_eq!(output[0].wait_result, mojo::MojoResult::Okay); - assert!(output[0].signals_state.satisfied().is_readable()); -}); + expect_eq!(result, mojo::MojoResult::Okay); + expect_eq!(output.len(), 1); + expect_eq!(output[0].cookie, cookie2); + expect_eq!(output[0].wait_result, mojo::MojoResult::Okay); + expect_true!(output[0].signals_state.satisfied().is_readable()); +} -mojo_test!(trap_signals_on_readable, { +#[gtest(MojoSystemTest, TrapSignalsOnReadable)] +fn test() { + init(); + // These tests unfortunately need global state, so we have to ensure // exclusive access (generally Rust tests run on multiple threads). let _test_lock = TRAP_TEST_LOCK.lock().unwrap(); @@ -216,7 +233,7 @@ let trap = UnsafeTrap::new(test_trap_event_handler).unwrap(); let (cons, prod) = data_pipe::create_default().unwrap(); - assert_eq!( + expect_eq!( MojoResult::Okay, trap.add_trigger( cons.get_native_handle(), @@ -225,7 +242,7 @@ 1 ) ); - assert_eq!( + expect_eq!( MojoResult::Okay, trap.add_trigger( prod.get_native_handle(), @@ -240,24 +257,34 @@ // triggered yet. match trap.arm(Some(&mut blocking_events_buf)) { ArmResult::Armed => (), - ArmResult::Blocked(events) => panic!("unexpected blocking events {:?}", events), - ArmResult::Failed(e) => panic!("unexpected mojo error {:?}", e), + ArmResult::Blocked(events) => { + expect_true!(false, "unexpected blocking events {:?}", events) + } + ArmResult::Failed(e) => expect_true!(false, "unexpected mojo error {:?}", e), } // Check that there are no events in the list (though of course this // check is uncertain if a race condition bug exists). - assert_eq!(TRAP_EVENT_LIST.lock().unwrap().len(), 0); + expect_eq!(TRAP_EVENT_LIST.lock().unwrap().len(), 0); // Write to `prod` making `cons` readable. - assert_eq!(prod.write(&[128u8], data_pipe::WriteFlags::empty()).unwrap(), 1); + expect_eq!(prod.write(&[128u8], data_pipe::WriteFlags::empty()).unwrap(), 1); { let list = wait_for_trap_events(TRAP_EVENT_LIST.lock().unwrap(), 1); - assert_eq!(list.len(), 1); + expect_eq!(list.len(), 1); let event = list[0]; - assert_eq!(event.trigger_context(), 1); - assert_eq!(event.result(), MojoResult::Okay); - assert!(event.signals_state().satisfiable().is_readable(), "{:?}", event.signals_state()); - assert!(event.signals_state().satisfied().is_readable(), "{:?}", event.signals_state()); + expect_eq!(event.trigger_context(), 1); + expect_eq!(event.result(), MojoResult::Okay); + expect_true!( + event.signals_state().satisfiable().is_readable(), + "{:?}", + event.signals_state() + ); + expect_true!( + event.signals_state().satisfied().is_readable(), + "{:?}", + event.signals_state() + ); } // Once the above event has fired, `trap` is disarmed. @@ -266,11 +293,11 @@ match trap.arm(Some(&mut blocking_events_buf)) { ArmResult::Blocked(events) => { let event: &UnsafeTrapEvent = events.get(0).unwrap(); - assert_eq!(event.trigger_context(), 1); - assert_eq!(event.result(), MojoResult::Okay); + expect_eq!(event.trigger_context(), 1); + expect_eq!(event.result(), MojoResult::Okay); } - ArmResult::Armed => panic!("expected event did not arrive"), - ArmResult::Failed(e) => panic!("unexpected Mojo error {:?}", e), + ArmResult::Armed => expect_true!(false, "expected event did not arrive"), + ArmResult::Failed(e) => expect_true!(false, "unexpected Mojo error {:?}", e), } clear_trap_events(1); @@ -279,8 +306,10 @@ cons.read(data_pipe::ReadFlags::DISCARD).unwrap(); match trap.arm(Some(&mut blocking_events_buf)) { ArmResult::Armed => (), - ArmResult::Blocked(events) => panic!("unexpected blocking events {:?}", events), - ArmResult::Failed(e) => panic!("unexpected Mojo error {:?}", e), + ArmResult::Blocked(events) => { + expect_true!(false, "unexpected blocking events {:?}", events) + } + ArmResult::Failed(e) => expect_true!(false, "unexpected Mojo error {:?}", e), } // Close `prod` making `cons` permanently unreadable. @@ -291,20 +320,20 @@ // and removed from the trap. { let list = wait_for_trap_events(TRAP_EVENT_LIST.lock().unwrap(), 1); - assert_eq!(list.len(), 2); + expect_eq!(list.len(), 2); let (event1, event2) = (list[0], list[1]); // Sort the events since the ordering isn't deterministic. let (cons_event, prod_event) = if event1.trigger_context() == 1 { (event1, event2) } else { (event2, event1) }; // 1. `cons` can no longer be readable. - assert_eq!(cons_event.trigger_context(), 1); - assert_eq!(cons_event.result(), MojoResult::FailedPrecondition); - assert!(!cons_event.signals_state().satisfiable().is_readable()); + expect_eq!(cons_event.trigger_context(), 1); + expect_eq!(cons_event.result(), MojoResult::FailedPrecondition); + expect_true!(!cons_event.signals_state().satisfiable().is_readable()); // 2. `prod` was closed, yielding a `Cancelled` event. - assert_eq!(prod_event.trigger_context(), 2); - assert_eq!(prod_event.result(), MojoResult::Cancelled); + expect_eq!(prod_event.trigger_context(), 2); + expect_eq!(prod_event.result(), MojoResult::Cancelled); }; drop(trap); @@ -313,15 +342,18 @@ // event for `prod` corresponding to removing `prod` from `trap` (which // happens automatically on `Trap` closure). clear_trap_events(3); -}); +} -mojo_test!(trap_handle_closed_before_arm, { +#[gtest(MojoSystemTest, TrapHandleClosedBeforeArm)] +fn test() { + init(); + let _test_lock = TRAP_TEST_LOCK.lock().unwrap(); let trap = UnsafeTrap::new(test_trap_event_handler).unwrap(); let (cons, _prod) = data_pipe::create_default().unwrap(); - assert_eq!( + expect_eq!( MojoResult::Okay, trap.add_trigger( cons.get_native_handle(), @@ -336,17 +368,20 @@ // A cancelled event will be reported even without arming. { let events = wait_for_trap_events(TRAP_EVENT_LIST.lock().unwrap(), 1); - assert_eq!(events.len(), 1, "unexpected events {:?}", *events); + expect_eq!(events.len(), 1, "unexpected events {:?}", *events); let event = events[0]; - assert_eq!(event.trigger_context(), 1); - assert_eq!(event.result(), MojoResult::Cancelled); + expect_eq!(event.trigger_context(), 1); + expect_eq!(event.result(), MojoResult::Cancelled); } drop(trap); clear_trap_events(1); -}); +} -mojo_test!(safe_trap, { +#[gtest(MojoSystemTest, SafeTrap)] +fn test() { + init(); + struct SharedContext { events: Mutex<Vec<TrapEvent>>, cond: Condvar, @@ -376,18 +411,22 @@ context.clone(), ); - assert_eq!(trap.arm(), MojoResult::Okay); + expect_eq!(trap.arm(), MojoResult::Okay); // Make `cons` readable. - assert_eq!(prod.write(&[128u8], data_pipe::WriteFlags::empty()), Ok(1)); + expect_eq!(prod.write(&[128u8], data_pipe::WriteFlags::empty()), Ok(1)); { let mut events = context.cond.wait_while(context.events.lock().unwrap(), |e| e.is_empty()).unwrap(); - assert_eq!(events.len(), 1, "unexpected events {:?}", events); + expect_eq!(events.len(), 1, "unexpected events {:?}", events); let event = events[0]; - assert_eq!(event.handle(), cons.get_native_handle()); - assert_eq!(event.result(), MojoResult::Okay); - assert!(event.signals_state().satisfied().is_readable(), "{:?}", event.signals_state()); + expect_eq!(event.handle(), cons.get_native_handle()); + expect_eq!(event.result(), MojoResult::Okay); + expect_true!( + event.signals_state().satisfied().is_readable(), + "{:?}", + event.signals_state() + ); events.clear(); } @@ -399,30 +438,34 @@ // We get the Cancelled event while unarmed. let mut events = context.cond.wait_while(context.events.lock().unwrap(), |e| e.is_empty()).unwrap(); - assert_eq!(events.len(), 1, "unexpected events {:?}", events); + expect_eq!(events.len(), 1, "unexpected events {:?}", events); let event = events[0]; - assert_eq!(event.handle(), cons_native); - assert_eq!(event.result(), MojoResult::Cancelled); + expect_eq!(event.handle(), cons_native); + expect_eq!(event.result(), MojoResult::Cancelled); events.clear(); } // When we try to arm, we'll get the `prod` event. - assert_eq!(trap.arm(), MojoResult::FailedPrecondition); + expect_eq!(trap.arm(), MojoResult::FailedPrecondition); { let mut events = context.cond.wait_while(context.events.lock().unwrap(), |e| e.is_empty()).unwrap(); - assert_eq!(events.len(), 1, "unexpected events {:?}", events); + expect_eq!(events.len(), 1, "unexpected events {:?}", events); let event = events[0]; - assert_eq!(event.handle(), prod.get_native_handle()); - assert_eq!(event.result(), MojoResult::Okay); - assert!(event.signals_state().satisfied().is_peer_closed(), "{:?}", event.signals_state()); + expect_eq!(event.handle(), prod.get_native_handle()); + expect_eq!(event.result(), MojoResult::Okay); + expect_true!( + event.signals_state().satisfied().is_peer_closed(), + "{:?}", + event.signals_state() + ); events.clear(); } -}); +} fn clear_trap_events(expected_len: usize) { let mut list = TRAP_EVENT_LIST.lock().unwrap(); - assert_eq!(list.len(), expected_len, "unexpected events {:?}", *list); + expect_eq!(list.len(), expected_len, "unexpected events {:?}", *list); list.clear(); }
diff --git a/mojo/public/rust/tests/system/run_loop.rs b/mojo/public/rust/tests/system/run_loop.rs index 9a82bf0c..a7ee54bd 100644 --- a/mojo/public/rust/tests/system/run_loop.rs +++ b/mojo/public/rust/tests/system/run_loop.rs
@@ -8,9 +8,10 @@ //! and the result being caught in the test! macro. If a test function //! returns without panicking, it is assumed to pass. -use mojo::bindings::run_loop; -use mojo::bindings::run_loop::{Handler, RunLoop, Token, WaitError}; +use mojo::bindings::run_loop::{self, Handler, RunLoop, Token, WaitError}; use mojo::system::{message_pipe, HandleSignals, MOJO_INDEFINITE}; +use rust_gtest_interop::prelude::*; +use test_util::init; use std::cell::Cell; use std::rc::Rc; @@ -22,10 +23,10 @@ runloop.deregister(token); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected ready"); + expect_true!(false, "Timed-out when expected ready"); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, _error: WaitError) { - panic!("Error when expected ready"); + expect_true!(false, "Error when expected ready"); } } @@ -33,13 +34,13 @@ impl Handler for HandlerExpectTimeout { fn on_ready(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Ready when expected timeout"); + expect_true!(false, "Ready when expected timeout"); } fn on_timeout(&mut self, runloop: &mut RunLoop, token: Token) { runloop.deregister(token); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, _error: WaitError) { - panic!("Error when expected timeout"); + expect_true!(false, "Error when expected timeout"); } } @@ -49,13 +50,13 @@ impl Handler for HandlerExpectError { fn on_ready(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Ready when expected error"); + expect_true!(false, "Ready when expected error"); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, runloop: &mut RunLoop, token: Token, error: WaitError) { - assert_eq!(error, WaitError::Unsatisfiable); + expect_eq!(error, WaitError::Unsatisfiable); runloop.deregister(token); self.was_called.set(true); } @@ -68,10 +69,10 @@ runloop.quit(); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, error: WaitError) { - assert_eq!(error, WaitError::HandleClosed); + expect_eq!(error, WaitError::HandleClosed); } } @@ -88,10 +89,10 @@ ); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, _error: WaitError) { - panic!("Error when expected ready"); + expect_true!(false, "Error when expected ready"); } } @@ -101,13 +102,13 @@ impl Handler for HandlerDeregisterOther { fn on_ready(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Ready when expected error"); + expect_true!(false, "Ready when expected error"); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, runloop: &mut RunLoop, token: Token, error: WaitError) { - assert_eq!(error, WaitError::HandleClosed); + expect_eq!(error, WaitError::HandleClosed); runloop.deregister(token); runloop.deregister(self.other.clone()); } @@ -130,7 +131,7 @@ } } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, _error: WaitError) { - panic!("Error when expected ready"); + expect_true!(false, "Error when expected ready"); } } @@ -140,7 +141,7 @@ impl Handler for HandlerNesting { fn on_ready(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Ready when expected timeout"); + expect_true!(false, "Ready when expected timeout"); } fn on_timeout(&mut self, runloop: &mut RunLoop, token: Token) { let mut nested_runloop = run_loop::RunLoop::new(); @@ -158,8 +159,8 @@ runloop.deregister(token); } fn on_error(&mut self, runloop: &mut RunLoop, token: Token, error: WaitError) { - assert_eq!(error, WaitError::Unsatisfiable); - assert_eq!(self.count, 11); + expect_eq!(error, WaitError::Unsatisfiable); + expect_eq!(self.count, 11); runloop.deregister(token); } } @@ -197,10 +198,10 @@ } } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, _error: WaitError) { - panic!("Error when expected ready"); + expect_true!(false, "Error when expected ready"); } } @@ -236,16 +237,19 @@ ); } fn on_timeout(&mut self, _runloop: &mut RunLoop, _token: Token) { - panic!("Timed-out when expected error"); + expect_true!(false, "Timed-out when expected error"); } fn on_error(&mut self, _runloop: &mut RunLoop, _token: Token, error: WaitError) { - assert_eq!(error, WaitError::HandleClosed); + expect_eq!(error, WaitError::HandleClosed); } } // Verifies that after adding and removing, we can run, exit and be left in a // consistent state. -mojo_test!(add_remove, { +#[gtest(MojoRunLoopTest, AddRemove)] +fn test() { + init(); + run_loop::with_current(|runloop| { let (endpt0, endpt1) = message_pipe::create().unwrap(); let token0 = runloop.register(&endpt0, HandleSignals::WRITABLE, 0, HandlerExpectReady {}); @@ -254,10 +258,18 @@ runloop.deregister(token0); runloop.run(); }) -}); +} // Verifies that generated tokens are unique. -mojo_test!(tokens, { +// +// Disabled because it interferes with later tests, leaving things in an Error +// state: +// panicked at 'Error when expected ready', +// ../../mojo/public/rust/tests/system/run_loop.rs:29:9 +#[gtest(MojoRunLoopTest, DISABLED_Tokens)] +fn test() { + init(); + let mut vec = Vec::new(); run_loop::with_current(|runloop| { for _ in 0..10 { @@ -267,15 +279,18 @@ for i in 0..10 { for j in 0..10 { if i != j { - assert!(vec[i] != vec[j]); + expect_ne!(vec[i], vec[j]); } } } }); -}); +} // Verifies that the handler's "on_ready" function is called. -mojo_test!(notify_results, { +#[gtest(MojoRunLoopTest, NotifyResults)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { let _ = runloop.register( @@ -286,10 +301,13 @@ ); runloop.run(); }); -}); +} // Verifies that the handler's "on_error" function is called. -mojo_test!(notify_error, { +#[gtest(MojoRunLoopTest, NotifyError)] +fn test() { + init(); + // Drop the first endpoint immediately let (_, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { @@ -301,77 +319,80 @@ HandlerExpectError { was_called: was_called.clone() }, ); runloop.run(); - assert!(was_called.get(), "on_error was not called"); + expect_true!(was_called.get(), "on_error was not called"); }); -}); +} // Verifies that the handler's "on_ready" function is called which only quits. -mojo_test!(notify_ready_quit, { +#[gtest(MojoRunLoopTest, NotifyReadyQuit)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { let _ = runloop.register(&endpt1, HandleSignals::WRITABLE, MOJO_INDEFINITE, HandlerQuit {}); runloop.run(); }); -}); +} // Tests more complex behavior, i.e. the interaction between two handlers. -mojo_test!(register_deregister, { +#[gtest(MojoRunLoopTest, RegisterDeregister)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { let _ = runloop.register(&endpt1, HandleSignals::WRITABLE, MOJO_INDEFINITE, HandlerRegister {}); runloop.run(); }); -}); +} // Tests reregistering. -mojo_test!( - reregister, - #[ignore] - { - let (_endpt0, endpt1) = message_pipe::create().unwrap(); - run_loop::with_current(|runloop| { - let _ = runloop.register( - &endpt1, - HandleSignals::READABLE, - 0, - HandlerReregister { count: 0 }, - ); - runloop.run(); - }); - } -); +#[gtest(MojoRunLoopTest, DISABLED_Reregister)] +fn test() { + init(); + + let (_endpt0, endpt1) = message_pipe::create().unwrap(); + run_loop::with_current(|runloop| { + let _ = + runloop.register(&endpt1, HandleSignals::READABLE, 0, HandlerReregister { count: 0 }); + runloop.run(); + }); +} // Tests nesting run loops by having a handler create a new one. -mojo_test!( - nesting, - #[ignore] - { - let (_endpt0, endpt1) = message_pipe::create().unwrap(); - run_loop::with_current(|runloop| { - let _ = - runloop.register(&endpt1, HandleSignals::READABLE, 0, HandlerNesting { count: 0 }); - runloop.run(); - }); - } -); +#[gtest(MojoRunLoopTest, DISABLED_Nesting)] +fn test() { + init(); + + let (_endpt0, endpt1) = message_pipe::create().unwrap(); + run_loop::with_current(|runloop| { + let _ = runloop.register(&endpt1, HandleSignals::READABLE, 0, HandlerNesting { count: 0 }); + runloop.run(); + }); +} // Tests to make sure nesting with the SAME runloop fails. -mojo_test!( - bad_nesting, - #[should_panic] - #[ignore] - { +#[gtest(MojoRunLoopTest, DISABLED_BadNesting)] +fn test() { + init(); + + let r = std::panic::catch_unwind(|| { let (_endpt0, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { let _ = runloop.register(&endpt1, HandleSignals::READABLE, 0, HandlerBadNesting {}); runloop.run(); }); - } -); + }); + expect_true!(r.is_err()); +} // Tests adding a simple task that adds a handler. -mojo_test!(simple_task, { +#[gtest(MojoRunLoopTest, SimpleTask)] +fn test() { + init(); + run_loop::with_current(|runloop| { let was_called = Rc::new(Cell::new(false)); // The inner closure cannot take `was_called` by reference since we @@ -401,12 +422,15 @@ runloop.run(); // Ensure we got the `on_error` call for the unsatisfiable signal. - assert!(was_called.get(), "on_error was not called"); + expect_true!(was_called.get(), "on_error was not called"); }); -}); +} // Tests using a handler that adds a bunch of tasks. -mojo_test!(handler_tasks, { +#[gtest(MojoRunLoopTest, HandlerTasks)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); let r = Rc::new(Cell::new(0)); run_loop::with_current(|runloop| { @@ -417,12 +441,15 @@ HandlerTasks { count: r.clone() }, ); runloop.run(); - assert!((*r).get() >= 11); + expect_ge!((*r).get(), 11); }); -}); +} // Tests using a handler that adds a bunch of tasks. -mojo_test!(nested_tasks, { +#[gtest(MojoRunLoopTest, NestedTasks)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); let r = Rc::new(Cell::new(0)); run_loop::with_current(|runloop| { @@ -433,46 +460,51 @@ NestedTasks { count: r.clone(), quitter: false }, ); runloop.run(); - assert!((*r).get() >= 10); + expect_ge!((*r).get(), 10); }); -}); +} // Tests using a handler that adds a bunch of tasks. // // This test is disabled because it posts tasks which call `RunLoop::quit`, some // of which get left on the `RunLoop` after the test ends. These interfere with // later tests on the same thread. -mojo_test!( - nested_tasks_quit, - #[ignore] - { - let (_endpt0, endpt1) = message_pipe::create().unwrap(); - let r = Rc::new(Cell::new(0)); - run_loop::with_current(|runloop| { - let _ = runloop.register( - &endpt1, - HandleSignals::WRITABLE, - 0, - NestedTasks { count: r.clone(), quitter: true }, - ); - runloop.run(); - assert!((*r).get() >= 10); - }); - } -); +#[gtest(MojoRunLoopTest, DISABLED_NestedTasksQuit)] +fn test() { + init(); -mojo_test!(close_handle, { + let (_endpt0, endpt1) = message_pipe::create().unwrap(); + let r = Rc::new(Cell::new(0)); + run_loop::with_current(|runloop| { + let _ = runloop.register( + &endpt1, + HandleSignals::WRITABLE, + 0, + NestedTasks { count: r.clone(), quitter: true }, + ); + runloop.run(); + expect_ge!((*r).get(), 10); + }); +} + +#[gtest(MojoRunLoopTest, CloseHandle)] +fn test() { + init(); + let (_endpt0, endpt1) = message_pipe::create().unwrap(); run_loop::with_current(|runloop| { let _ = runloop.register(&endpt1, HandleSignals::WRITABLE, 0, HandlerQuit {}); drop(endpt1); runloop.run(); }) -}); +} // Tests that `RunLoop::run` will run posted tasks even if there's no handles to // wait on. -mojo_test!(post_tasks_without_handles, { +#[gtest(MojoRunLoopTest, PostTasksWithoutHandles)] +fn test() { + init(); + let outer_called = Rc::new(Cell::new(false)); let outer_called_clone = outer_called.clone(); let inner_called = Rc::new(Cell::new(false)); @@ -500,6 +532,6 @@ runloop.run(); }); - assert!(outer_called.get()); - assert!(inner_called.get()); -}); + expect_true!(outer_called.get()); + expect_true!(inner_called.get()); +}
diff --git a/mojo/public/rust/tests/util/lib.rs b/mojo/public/rust/tests/util/lib.rs index ca4b72c..801434b 100644 --- a/mojo/public/rust/tests/util/lib.rs +++ b/mojo/public/rust/tests/util/lib.rs
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -//! This module contains useful functions and macros for testing. +//! This module contains useful functions for testing. use std::env; use std::ffi::{CStr, CString}; @@ -11,25 +11,6 @@ use std::slice; use std::vec::Vec; -/// This macro sets up tests by adding in Mojo embedder initialization. -/// -/// Note: this macro is quite delicate because of rustmt's inconsistent handling -/// of macro invocations. Slight changes to macro syntax can make rustfmt ignore -/// the inside of an invocation, which is not what we want. -#[macro_export] -macro_rules! mojo_test { - {$i: ident, $(#[$attr:meta])* $b:block} => { - #[test] - $( - #[ $attr ] - )* - fn $i() { - $crate::init(); - $b - } - } -} - /// Calls Mojo initialization code on first call. Can be called multiple times. /// Has no effect after the first call. pub fn init() {
diff --git a/net/BUILD.gn b/net/BUILD.gn index b345040e..20e4a00 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -3067,7 +3067,6 @@ "websockets/websocket_deflate_predictor_impl_test.cc", "websockets/websocket_deflate_stream_test.cc", "websockets/websocket_deflater_test.cc", - "websockets/websocket_end_to_end_test.cc", "websockets/websocket_errors_test.cc", "websockets/websocket_extension_parser_test.cc", "websockets/websocket_extension_test.cc", @@ -3083,6 +3082,14 @@ "websockets/websocket_test_util.cc", "websockets/websocket_test_util.h", ] + + if (!is_ios) { + # TODO(crbug.com/1281277): iOS does not have support for the spawned test + # server, which is used by this test. The long term plan is to add + # websocket support to the embedded test server and when that happens, + # this test could be enabled. + sources += [ "websockets/websocket_end_to_end_test.cc" ] + } } if (!disable_file_support) {
diff --git a/net/cookies/cookie_monster_change_dispatcher.cc b/net/cookies/cookie_monster_change_dispatcher.cc index e1eb9d0f..36dd9f9 100644 --- a/net/cookies/cookie_monster_change_dispatcher.cc +++ b/net/cookies/cookie_monster_change_dispatcher.cc
@@ -36,14 +36,15 @@ std::string domain_key, std::string name_key, GURL url, - absl::optional<CookiePartitionKey> cookie_partition_key, + CookiePartitionKeyCollection cookie_partition_key_collection, bool same_party_attribute_enabled, net::CookieChangeCallback callback) : change_dispatcher_(std::move(change_dispatcher)), domain_key_(std::move(domain_key)), name_key_(std::move(name_key)), url_(std::move(url)), - cookie_partition_key_(std::move(cookie_partition_key)), + cookie_partition_key_collection_( + std::move(cookie_partition_key_collection)), callback_(std::move(callback)), same_party_attribute_enabled_(same_party_attribute_enabled), task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()) { @@ -87,14 +88,22 @@ } } - if (!change.cookie.IsPartitioned() && - net::CookiePartitionKey::HasNonce(cookie_partition_key_)) { - return; - } - - if (change.cookie.IsPartitioned() && - change.cookie.PartitionKey() != cookie_partition_key_) { - return; + if (!cookie_partition_key_collection_.ContainsAllKeys()) { + if (cookie_partition_key_collection_.PartitionKeys().empty()) { + if (cookie.IsPartitioned()) { + return; + } + } else { + DCHECK_EQ(1u, cookie_partition_key_collection_.PartitionKeys().size()); + const CookiePartitionKey& key = + *cookie_partition_key_collection_.PartitionKeys().begin(); + if (CookiePartitionKey::HasNonce(key) && !cookie.IsPartitioned()) { + return; + } + if (cookie.IsPartitioned() && key != *cookie.PartitionKey()) { + return; + } + } } // TODO(mmenke, pwnall): Run callbacks synchronously? @@ -155,7 +164,8 @@ std::unique_ptr<Subscription> subscription = std::make_unique<Subscription>( weak_ptr_factory_.GetWeakPtr(), DomainKey(url), NameKey(name), url, - cookie_partition_key, same_party_attribute_enabled_, std::move(callback)); + CookiePartitionKeyCollection::FromOptional(cookie_partition_key), + same_party_attribute_enabled_, std::move(callback)); LinkSubscription(subscription.get()); return subscription; @@ -170,7 +180,8 @@ std::unique_ptr<Subscription> subscription = std::make_unique<Subscription>( weak_ptr_factory_.GetWeakPtr(), DomainKey(url), - std::string(kGlobalNameKey), url, cookie_partition_key, + std::string(kGlobalNameKey), url, + CookiePartitionKeyCollection::FromOptional(cookie_partition_key), same_party_attribute_enabled_, std::move(callback)); LinkSubscription(subscription.get()); @@ -184,7 +195,8 @@ std::unique_ptr<Subscription> subscription = std::make_unique<Subscription>( weak_ptr_factory_.GetWeakPtr(), std::string(kGlobalDomainKey), - std::string(kGlobalNameKey), GURL(""), absl::nullopt, + std::string(kGlobalNameKey), GURL(""), + CookiePartitionKeyCollection::ContainsAll(), same_party_attribute_enabled_, std::move(callback)); LinkSubscription(subscription.get());
diff --git a/net/cookies/cookie_monster_change_dispatcher.h b/net/cookies/cookie_monster_change_dispatcher.h index dd022ad..31ca1e9 100644 --- a/net/cookies/cookie_monster_change_dispatcher.h +++ b/net/cookies/cookie_monster_change_dispatcher.h
@@ -18,6 +18,7 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_checker.h" #include "net/cookies/cookie_change_dispatcher.h" +#include "net/cookies/cookie_partition_key_collection.h" #include "url/gurl.h" namespace net { @@ -77,7 +78,7 @@ std::string domain_key, std::string name_key, GURL url, - absl::optional<CookiePartitionKey> cookie_partition_key, + CookiePartitionKeyCollection cookie_partition_key_collection, bool same_party_attribute_enabled, net::CookieChangeCallback callback); @@ -104,8 +105,7 @@ const std::string domain_key_; // kGlobalDomainKey means no filtering. const std::string name_key_; // kGlobalNameKey means no filtering. const GURL url_; // empty() means no URL-based filtering. - // nullopt means all Partitioned cookies will be ignored. - const absl::optional<CookiePartitionKey> cookie_partition_key_; + const CookiePartitionKeyCollection cookie_partition_key_collection_; const net::CookieChangeCallback callback_; bool same_party_attribute_enabled_;
diff --git a/net/cookies/cookie_store_change_unittest.h b/net/cookies/cookie_store_change_unittest.h index 08b0d064..a1b06fc5 100644 --- a/net/cookies/cookie_store_change_unittest.h +++ b/net/cookies/cookie_store_change_unittest.h
@@ -707,6 +707,38 @@ cookie_changes[3].access_result.access_semantics)); } +TYPED_TEST_P(CookieStoreChangeGlobalTest, PartitionedCookies) { + if (!TypeParam::supports_named_cookie_tracking || + !TypeParam::supports_partitioned_cookies) { + return; + } + + CookieStore* cs = this->GetCookieStore(); + + // Test that all partitioned cookies are visible to global change listeners. + std::vector<CookieChangeInfo> all_cookie_changes; + std::unique_ptr<CookieChangeSubscription> global_subscription = + cs->GetChangeDispatcher().AddCallbackForAllChanges(base::BindRepeating( + &CookieStoreChangeTestBase<TypeParam>::OnCookieChange, + base::Unretained(&all_cookie_changes))); + // Set two cookies in two separate partitions, one with nonce. + this->CreateAndSetCookie( + cs, GURL("https://www.example2.com"), + "__Host-a=1; Secure; Path=/; Partitioned", + CookieOptions::MakeAllInclusive(), absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"))); + this->CreateAndSetCookie( + cs, GURL("https://www.example2.com"), + "__Host-a=2; Secure; Path=/; Partitioned; Max-Age=7200", + CookieOptions::MakeAllInclusive(), absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting(GURL("https://www.bar.com"), + base::UnguessableToken::Create())); + this->DeliverChangeNotifications(); + ASSERT_EQ(2u, all_cookie_changes.size()); +} + TYPED_TEST_P(CookieStoreChangeUrlTest, NoCookie) { if (!TypeParam::supports_url_cookie_tracking) return; @@ -1793,6 +1825,54 @@ ASSERT_LT(2u, cookie_changes.size()); } +TYPED_TEST_P(CookieStoreChangeUrlTest, PartitionedCookies_WithNonce) { + if (!TypeParam::supports_named_cookie_tracking || + !TypeParam::supports_partitioned_cookies) { + return; + } + + CookieStore* cs = this->GetCookieStore(); + base::UnguessableToken nonce = base::UnguessableToken::Create(); + + std::vector<CookieChangeInfo> cookie_changes; + std::unique_ptr<CookieChangeSubscription> subscription = + cs->GetChangeDispatcher().AddCallbackForUrl( + GURL("https://www.example.com"), + CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"), + nonce), + base::BindRepeating( + &CookieStoreChangeTestBase<TypeParam>::OnCookieChange, + base::Unretained(&cookie_changes))); + + // Should not see changes to an unpartitioned cookie. + this->CreateAndSetCookie(cs, GURL("https://www.example.com"), + "__Host-a=1; Secure; Path=/", + CookieOptions::MakeAllInclusive()); + this->DeliverChangeNotifications(); + ASSERT_EQ(0u, cookie_changes.size()); + + // Set partitioned cookie without nonce. Should not see the change. + this->CreateAndSetCookie( + cs, GURL("https://www.example.com"), + "__Host-a=2; Secure; Path=/; Partitioned", + CookieOptions::MakeAllInclusive(), absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"))); + this->DeliverChangeNotifications(); + ASSERT_EQ(0u, cookie_changes.size()); + + // Set partitioned cookie with nonce. + this->CreateAndSetCookie(cs, GURL("https://www.example.com"), + "__Host-a=3; Secure; Path=/; Partitioned", + CookieOptions::MakeAllInclusive(), + absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting( + GURL("https://www.foo.com"), nonce)); + this->DeliverChangeNotifications(); + ASSERT_EQ(1u, cookie_changes.size()); +} + TYPED_TEST_P(CookieStoreChangeNamedTest, NoCookie) { if (!TypeParam::supports_named_cookie_tracking) return; @@ -3031,6 +3111,54 @@ ASSERT_LT(2u, cookie_changes.size()); } +TYPED_TEST_P(CookieStoreChangeNamedTest, PartitionedCookies_WithNonce) { + if (!TypeParam::supports_named_cookie_tracking || + !TypeParam::supports_partitioned_cookies) { + return; + } + + CookieStore* cs = this->GetCookieStore(); + base::UnguessableToken nonce = base::UnguessableToken::Create(); + + std::vector<CookieChangeInfo> cookie_changes; + std::unique_ptr<CookieChangeSubscription> subscription = + cs->GetChangeDispatcher().AddCallbackForCookie( + GURL("https://www.example.com"), "__Host-a", + CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"), + nonce), + base::BindRepeating( + &CookieStoreChangeTestBase<TypeParam>::OnCookieChange, + base::Unretained(&cookie_changes))); + + // Should not see changes to an unpartitioned cookie. + this->CreateAndSetCookie(cs, GURL("https://www.example.com"), + "__Host-a=1; Secure; Path=/", + CookieOptions::MakeAllInclusive()); + this->DeliverChangeNotifications(); + ASSERT_EQ(0u, cookie_changes.size()); + + // Set partitioned cookie without nonce. Should not see the change. + this->CreateAndSetCookie( + cs, GURL("https://www.example.com"), + "__Host-a=2; Secure; Path=/; Partitioned", + CookieOptions::MakeAllInclusive(), absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting(GURL("https://www.foo.com"))); + this->DeliverChangeNotifications(); + ASSERT_EQ(0u, cookie_changes.size()); + + // Set partitioned cookie with nonce. + this->CreateAndSetCookie(cs, GURL("https://www.example.com"), + "__Host-a=3; Secure; Path=/; Partitioned", + CookieOptions::MakeAllInclusive(), + absl::nullopt /* server_time */, + absl::nullopt /* system_time */, + CookiePartitionKey::FromURLForTesting( + GURL("https://www.foo.com"), nonce)); + this->DeliverChangeNotifications(); + ASSERT_EQ(1u, cookie_changes.size()); +} + REGISTER_TYPED_TEST_SUITE_P(CookieStoreChangeGlobalTest, NoCookie, InitialCookie, @@ -3046,7 +3174,8 @@ DeregisterRace, DeregisterRaceMultiple, MultipleSubscriptions, - ChangeIncludesCookieAccessSemantics); + ChangeIncludesCookieAccessSemantics, + PartitionedCookies); REGISTER_TYPED_TEST_SUITE_P(CookieStoreChangeUrlTest, NoCookie, @@ -3071,7 +3200,8 @@ DifferentSubscriptionsFiltering, MultipleSubscriptions, ChangeIncludesCookieAccessSemantics, - PartitionedCookies); + PartitionedCookies, + PartitionedCookies_WithNonce); REGISTER_TYPED_TEST_SUITE_P(CookieStoreChangeNamedTest, NoCookie, @@ -3098,7 +3228,8 @@ MultipleSubscriptions, SubscriptionOutlivesStore, ChangeIncludesCookieAccessSemantics, - PartitionedCookies); + PartitionedCookies, + PartitionedCookies_WithNonce); } // namespace net
diff --git a/net/first_party_sets/addition_overlaps_union_find.h b/net/first_party_sets/addition_overlaps_union_find.h index eeabb6e..cd92802d 100644 --- a/net/first_party_sets/addition_overlaps_union_find.h +++ b/net/first_party_sets/addition_overlaps_union_find.h
@@ -28,7 +28,7 @@ // Unions the two given sets together if they are in disjoint sets, and does // nothing if they are non-disjoint. // Unions are non-commutative for First-Party Sets; this method always chooses - // the set with the lesser index as the owner. + // the set with the lesser index as the primary. // Both set indices (set_x, set_y) must be in the range [0, num_sets) where // num_sets is the argument given to the constructor. // If Union is called when num_sets = 0, then this will crash.
diff --git a/net/first_party_sets/global_first_party_sets.cc b/net/first_party_sets/global_first_party_sets.cc index ad5d30f..51cb3422 100644 --- a/net/first_party_sets/global_first_party_sets.cc +++ b/net/first_party_sets/global_first_party_sets.cc
@@ -275,21 +275,22 @@ FlattenedSets flattened_additions = SetListToFlattenedSets(normalized_additions); - // All of the custom sets are automatically inserted into site_to_owner. + // All of the custom sets are automatically inserted into site_to_entry. UpdateCustomizations(replacement_sets, site_to_entry); UpdateCustomizations(normalized_additions, site_to_entry); - // Maps old owner to new entry. - base::flat_map<SchemefulSite, FirstPartySetEntry> addition_intersected_owners; + // Maps old primary site to new entry. + base::flat_map<SchemefulSite, FirstPartySetEntry> + addition_intersected_primaries; for (const auto& [new_member, new_entry] : flattened_additions) { if (const auto entry = FindEntry(new_member, /*config=*/nullptr); entry.has_value()) { // Found an overlap with the existing list of sets. - addition_intersected_owners.emplace(entry->primary(), new_entry); + addition_intersected_primaries.emplace(entry->primary(), new_entry); } } - // Maps an existing owner to the members it lost due to replacement. + // Maps an existing primary site to the members it lost due to replacement. base::flat_map<SchemefulSite, base::flat_set<SchemefulSite>> potential_singletons; for (const auto& [member, set_entry] : flattened_replacements) { @@ -297,30 +298,30 @@ continue; if (const auto existing_entry = FindEntry(member, /*config=*/nullptr); existing_entry.has_value() && existing_entry->primary() != member && - !addition_intersected_owners.contains(existing_entry->primary()) && + !addition_intersected_primaries.contains(existing_entry->primary()) && !flattened_additions.contains(existing_entry->primary()) && !flattened_replacements.contains(existing_entry->primary())) { potential_singletons[existing_entry->primary()].insert(member); } } - // Find the existing owners that have left their existing sets, and whose - // existing members should be removed from their set (excluding any custom - // sets that those members are involved in). - base::flat_set<SchemefulSite> replaced_existing_owners; - for (const auto& [site, unused_owner] : flattened_replacements) { + // Find the existing primary sites that have left their existing sets, and + // whose existing members should be removed from their set (excluding any + // custom sets that those members are involved in). + base::flat_set<SchemefulSite> replaced_existing_primaries; + for (const auto& [site, unused_primary] : flattened_replacements) { if (const auto entry = FindEntry(site, /*config=*/nullptr); entry.has_value() && entry->primary() == site) { - // Site was an owner in the existing sets. - bool inserted = replaced_existing_owners.emplace(site).second; + // Site was an primary in the existing sets. + bool inserted = replaced_existing_primaries.emplace(site).second; CHECK(inserted); } } - if (!addition_intersected_owners.empty() || !potential_singletons.empty() || - !replaced_existing_owners.empty()) { + if (!addition_intersected_primaries.empty() || + !potential_singletons.empty() || !replaced_existing_primaries.empty()) { // Find out which potential singletons are actually singletons; delete - // members whose owners left; and reparent the sets that intersected with + // members whose primaries left; and reparent the sets that intersected with // an addition set. // Note: use a null config here, to avoid taking unrelated policy sets into // account. @@ -329,8 +330,8 @@ [&](const SchemefulSite& member, const FirstPartySetEntry& set_entry) { // Reparent all sites in any intersecting addition sets. if (const auto entry = - addition_intersected_owners.find(set_entry.primary()); - entry != addition_intersected_owners.end() && + addition_intersected_primaries.find(set_entry.primary()); + entry != addition_intersected_primaries.end() && !flattened_replacements.contains(member)) { site_to_entry.emplace_back( member, FirstPartySetEntry(entry->second.primary(), @@ -345,24 +346,24 @@ if (const auto entry = potential_singletons.find(set_entry.primary()); entry != potential_singletons.end() && !entry->second.contains(member)) { - // This owner lost members, but it still has at least one + // This primary lost members, but it still has at least one // (`member`), so it's not a singleton. potential_singletons.erase(entry); } - // Remove members from sets whose owner left. - if (replaced_existing_owners.contains(set_entry.primary()) && + // Remove members from sets whose primary left. + if (replaced_existing_primaries.contains(set_entry.primary()) && !flattened_replacements.contains(member) && - !addition_intersected_owners.contains(set_entry.primary())) { + !addition_intersected_primaries.contains(set_entry.primary())) { site_to_entry.emplace_back(member, FirstPartySetEntryOverride()); } return true; }); - // Any owner remaining in `potential_singleton` is a real singleton, so + // Any primary remaining in `potential_singleton` is a real singleton, so // delete it: - for (const auto& [owner, members] : potential_singletons) { - site_to_entry.emplace_back(owner, FirstPartySetEntryOverride()); + for (const auto& [primary, members] : potential_singletons) { + site_to_entry.emplace_back(primary, FirstPartySetEntryOverride()); } }
diff --git a/net/first_party_sets/global_first_party_sets.h b/net/first_party_sets/global_first_party_sets.h index fdac238..cc2b42c 100644 --- a/net/first_party_sets/global_first_party_sets.h +++ b/net/first_party_sets/global_first_party_sets.h
@@ -168,8 +168,8 @@ addition_sets) const; // Returns whether `site` is same-party with `party_context`, and - // `top_frame_site` (if it is not nullptr). That is, is `site`'s owner the - // same as the owners of every member of `party_context` and of + // `top_frame_site` (if it is not nullptr). That is, is `site`'s primary the + // same as the primaries of every member of `party_context` and of // `top_frame_site`? Note: if `site` is not a member of a First-Party Set, // then this returns false. If `top_frame_site` is nullptr, then it is // ignored.
diff --git a/net/http/http_status_code_list.h b/net/http/http_status_code_list.h index 49ccb19..b954fbe 100644 --- a/net/http/http_status_code_list.h +++ b/net/http/http_status_code_list.h
@@ -70,6 +70,7 @@ HTTP_STATUS_ENUM_VALUE(EXPECTATION_FAILED, 417, "Expectation Failed") // 418 returned by Cloud Print. HTTP_STATUS_ENUM_VALUE(INVALID_XPRIVET_TOKEN, 418, "Invalid XPrivet Token") +HTTP_STATUS_ENUM_VALUE(UNPROCESSABLE_CONTENT, 422, "Unprocessable Content") HTTP_STATUS_ENUM_VALUE(TOO_EARLY, 425, "Too Early") HTTP_STATUS_ENUM_VALUE(TOO_MANY_REQUESTS, 429, "Too Many Requests")
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index abfd01ff..b1839b5e 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-04-11 12:55 UTC +# Last updated: 2023-04-12 12:57 UTC PinsListTimestamp -1681217727 +1681304243 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h index 36ed21a..c35221a4 100644 --- a/net/log/net_log_event_type_list.h +++ b/net/log/net_log_event_type_list.h
@@ -4306,18 +4306,27 @@ // Oblivious HTTP // ------------------------------------------------------------------------ -// OBLIVIOUS_HTTP_REQUEST_START is emitted when an oblivious HTTP request is -// started. -EVENT_TYPE(OBLIVIOUS_HTTP_REQUEST_START) +// OBLIVIOUS_HTTP_REQUEST measures the time between when Oblivoius HTTP +// has begun and when Oblivious HTTP has ended (either success or failure). +// The following parameters are attached: +// { +// "net_error": <The net error code integer, can be a failure or a success>, +// "outer_response_error_code": <The HTTP error code of the outer relay HTTP +// response, set iff the result fails because the outer HTTP response status +// code is not HTTP_OK>, +// "inner_response_code": <The HTTP code of the inner gateway HTTP response, +// parsed out from the binary HTTP structure> +// } +EVENT_TYPE(OBLIVIOUS_HTTP_REQUEST) -// OBLIVIOUS_HTTP_REQUEST_END is emitted when an oblivious HTTP request ends. -// The net error "status" code for the request is attached. -EVENT_TYPE(OBLIVIOUS_HTTP_REQUEST_END) - -// OBLIVIOUS_HTTP_REQUEST_DATA logs either just the headers of the request or +// OBLIVIOUS_HTTP_REQUEST_DATA logs either just the byte count of the request or // the entire request (depending on capture settings), before encryption. EVENT_TYPE(OBLIVIOUS_HTTP_REQUEST_DATA) -// OBLIVIOUS_HTTP_RESPONSE_DATA logs either just the headers of the response or -// the entire response (depending on capture settings), after decryption. +// OBLIVIOUS_HTTP_RESPONSE_DATA logs either just the byte count of the response +// or the entire response (depending on capture settings), after decryption. EVENT_TYPE(OBLIVIOUS_HTTP_RESPONSE_DATA) + +// OBLIVIOUS_HTTP_RESPONSE_HEADERS logs headers of the response, after +// decryption. +EVENT_TYPE(OBLIVIOUS_HTTP_RESPONSE_HEADERS)
diff --git a/pdf/loader/url_loader_unittest.cc b/pdf/loader/url_loader_unittest.cc index ea1d4bc..20f528a 100644 --- a/pdf/loader/url_loader_unittest.cc +++ b/pdf/loader/url_loader_unittest.cc
@@ -579,8 +579,9 @@ } TEST_F(UrlLoaderTest, DidFailWithWebSecurityViolationError) { - blink::WebURLError error(network::CorsErrorStatus(), - blink::WebURLError::HasCopyInCache::kFalse, GURL()); + blink::WebURLError error( + network::CorsErrorStatus(network::mojom::CorsError::kDisallowedByMode), + blink::WebURLError::HasCopyInCache::kFalse, GURL()); ASSERT_TRUE(error.is_web_security_violation()); int32_t result = DidFailWithError(error);
diff --git a/remoting/base/typed_buffer.h b/remoting/base/typed_buffer.h index 6e7d7cbc..2a03a9e 100644 --- a/remoting/base/typed_buffer.h +++ b/remoting/base/typed_buffer.h
@@ -21,10 +21,10 @@ template <typename T> class TypedBuffer { public: - TypedBuffer() : TypedBuffer(0) {} + TypedBuffer() = default; // Creates an instance of the object allocating a buffer of the given size. - explicit TypedBuffer(uint32_t length) : buffer_(nullptr), length_(length) { + explicit TypedBuffer(uint32_t length) : length_(length) { if (length_ > 0) { buffer_ = reinterpret_cast<T*>(new uint8_t[length_]); } @@ -37,8 +37,7 @@ ~TypedBuffer() { if (buffer_) { - delete[] reinterpret_cast<uint8_t*>(buffer_.get()); - buffer_ = nullptr; + delete[] reinterpret_cast<uint8_t*>(buffer_.ExtractAsDangling().get()); } } @@ -79,10 +78,10 @@ private: // Points to the owned buffer. - raw_ptr<T> buffer_; + raw_ptr<T> buffer_ = nullptr; // Length of the owned buffer in bytes. - uint32_t length_; + uint32_t length_ = 0; }; } // namespace remoting
diff --git a/remoting/host/linux/linux_me2me_host.py b/remoting/host/linux/linux_me2me_host.py index 29f402a0..6f7dca4b 100755 --- a/remoting/host/linux/linux_me2me_host.py +++ b/remoting/host/linux/linux_me2me_host.py
@@ -1245,7 +1245,7 @@ if self.randr_add_sizes: refresh_rates = ["60"] try: - proc_num = subprocess.check_output("nproc", text=True) + proc_num = subprocess.check_output("nproc", universal_newlines=True) # Keep the proc_num logic in sync with desktop_resizer_x11.cc if (int(proc_num) > 16):
diff --git a/sandbox/policy/mac/common.sb b/sandbox/policy/mac/common.sb index a0f12aae..93c37254 100644 --- a/sandbox/policy/mac/common.sb +++ b/sandbox/policy/mac/common.sb
@@ -231,6 +231,9 @@ (sysctl-name "hw.logicalcpu_max") (sysctl-name "hw.machine") (sysctl-name "hw.ncpu") + (sysctl-name "hw.nperflevels") + (sysctl-name "hw.optional.arm.FEAT_SHA512") + (sysctl-name "hw.optional.armv8_2_sha512") (sysctl-name "hw.pagesize_compat") (sysctl-name "hw.physicalcpu_max") (sysctl-name "hw.tbfrequency_compat") @@ -246,6 +249,7 @@ (sysctl-name "kern.usrstack64") (sysctl-name "kern.version") (sysctl-name "sysctl.proc_cputype") + (sysctl-name-prefix "hw.perflevel") ) (allow network-outbound
diff --git a/sandbox/win/src/process_mitigations.cc b/sandbox/win/src/process_mitigations.cc index 9226fd41..b31b832 100644 --- a/sandbox/win/src/process_mitigations.cc +++ b/sandbox/win/src/process_mitigations.cc
@@ -60,30 +60,17 @@ } // Returns true if this is 32-bit Chrome running on ARM64 with emulation. -// Needed because ACG does not work with emulated code. +// Needed because ACG does not work with emulated code. This is not needed for +// x64 Chrome running on ARM64 with emulation. // See -// https://docs.microsoft.com/en-us/windows/uwp/porting/apps-on-arm-troubleshooting-x86. +// https://learn.microsoft.com/en-us/windows/arm/apps-on-arm-troubleshooting-x86 // See https://crbug.com/977723. -// TODO(wfh): Move this code into base. See https://crbug.com/978257. bool IsRunning32bitEmulatedOnArm64() { #if defined(ARCH_CPU_X86) - using IsWow64Process2Function = decltype(&IsWow64Process2); - - IsWow64Process2Function is_wow64_process2 = - reinterpret_cast<IsWow64Process2Function>(::GetProcAddress( - ::GetModuleHandleA("kernel32.dll"), "IsWow64Process2")); - if (!is_wow64_process2) - return false; - USHORT process_machine; - USHORT native_machine; - bool retval = is_wow64_process2(::GetCurrentProcess(), &process_machine, - &native_machine); - if (!retval) - return false; - if (native_machine == IMAGE_FILE_MACHINE_ARM64) - return true; -#endif // defined(ARCH_CPU_X86) + return base::win::OSInfo::IsRunningEmulatedOnArm64(); +#else return false; +#endif // defined(ARCH_CPU_X86) } bool SetProcessMitigationPolicyInternal(PROCESS_MITIGATION_POLICY policy,
diff --git a/services/metrics/ukm_api.md b/services/metrics/ukm_api.md index 7ca2894..7f5db83 100644 --- a/services/metrics/ukm_api.md +++ b/services/metrics/ukm_api.md
@@ -274,7 +274,7 @@ Build Chromium and run it with flags `--force-enable-metrics-reporting --metrics-upload-interval=N`. The first flag overrides metrics collection to be ON. The second flag means that locally collected metrics will be populated in a UKM report and uploaded every `N` seconds; You may want some small `N` if you are interested in seeing this behavior. -Then in the browser, go to `chrome://settings/syncSetup` and toggle "Make searches and browsing better" to be ON. +Then in the browser, go to `chrome://settings/syncSetup` and toggle "Make searches and browsing better" to be ON. If you're unabled to do this, you can pass the command line flag `--force-msbb-setting-on-for-ukm` instead. You should now be seeing "Metrics Collection is ENABLED. MSBB consent is ENABLED" at the top of the `chrome://ukm` debugging page:
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn index e33448f..cccc7ab 100644 --- a/services/network/BUILD.gn +++ b/services/network/BUILD.gn
@@ -133,6 +133,8 @@ "shared_dictionary/shared_dictionary_constants.h", "shared_dictionary/shared_dictionary_data_pipe_writer.cc", "shared_dictionary/shared_dictionary_data_pipe_writer.h", + "shared_dictionary/shared_dictionary_disk_cache.cc", + "shared_dictionary/shared_dictionary_disk_cache.h", "shared_dictionary/shared_dictionary_in_memory.cc", "shared_dictionary/shared_dictionary_in_memory.h", "shared_dictionary/shared_dictionary_manager.cc", @@ -410,6 +412,7 @@ "sec_header_helpers_unittest.cc", "session_cleanup_cookie_store_unittest.cc", "shared_dictionary/shared_dictionary_data_pipe_writer_unittest.cc", + "shared_dictionary/shared_dictionary_disk_cache_unittest.cc", "shared_dictionary/shared_dictionary_manager_unittest.cc", "socket_data_pump_unittest.cc", "ssl_config_service_mojo_unittest.cc",
diff --git a/services/network/cors/cors_url_loader_unittest.cc b/services/network/cors/cors_url_loader_unittest.cc index b43e0b9..cad16a3d 100644 --- a/services/network/cors/cors_url_loader_unittest.cc +++ b/services/network/cors/cors_url_loader_unittest.cc
@@ -2004,7 +2004,7 @@ EXPECT_TRUE(devtools_observer.cors_error_params()); const network::MockDevToolsObserver::OnCorsErrorParams& params = *devtools_observer.cors_error_params(); - EXPECT_EQ(mojom::CorsError::kDisallowedByMode, params.status.cors_error); + EXPECT_EQ(mojom::CorsError::kDisallowedByMode, params.status->cors_error); EXPECT_EQ(initiator_origin, params.initiator_origin); EXPECT_EQ(url, params.url); }
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc index 4d5d23f..f863989 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc
@@ -44,13 +44,17 @@ namespace { -const net::SchemefulSite kSet1Owner(GURL("https://set1owner.test")); -const net::SchemefulSite kSet1Member1(GURL("https://set1member1.test")); -const net::SchemefulSite kSet1Member2(GURL("https://set1member2.test")); -const net::SchemefulSite kSet2Owner(GURL("https://set2owner.test")); -const net::SchemefulSite kSet2Member1(GURL("https://set2member1.test")); -const net::SchemefulSite kSet3Owner(GURL("https://set3owner.test")); -const net::SchemefulSite kSet3Member1(GURL("https://set3member1.test")); +const net::SchemefulSite kSet1Primary(GURL("https://set1primary.test")); +const net::SchemefulSite kSet1AssociatedSite1( + GURL("https://set1associatedSite1.test")); +const net::SchemefulSite kSet1AssociatedSite2( + GURL("https://set1associatedSite2.test")); +const net::SchemefulSite kSet2Primary(GURL("https://set2primary.test")); +const net::SchemefulSite kSet2AssociatedSite1( + GURL("https://set2associatedSite1.test")); +const net::SchemefulSite kSet3Primary(GURL("https://set3primary.test")); +const net::SchemefulSite kSet3AssociatedSite1( + GURL("https://set3associatedSite1.test")); const int64_t kClearAtRunId(2); const int64_t kBrowserRunId(3); @@ -88,17 +92,20 @@ base::Version("1.2.3"), /*entries=*/ { - {kSet1Member1, net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 0)}, - {kSet1Member2, net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 1)}, - {kSet1Owner, - net::FirstPartySetEntry(kSet1Owner, net::SiteType::kPrimary, + {kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kAssociated, + 0)}, + {kSet1AssociatedSite2, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kAssociated, + 1)}, + {kSet1Primary, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kPrimary, absl::nullopt)}, - {kSet2Member1, net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0)}, - {kSet2Owner, - net::FirstPartySetEntry(kSet2Owner, net::SiteType::kPrimary, + {kSet2AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, net::SiteType::kAssociated, + 0)}, + {kSet2Primary, + net::FirstPartySetEntry(kSet2Primary, net::SiteType::kPrimary, absl::nullopt)}, }, /*aliases=*/{})); @@ -112,30 +119,32 @@ }; TEST_F(NoopFirstPartySetsAccessDelegateTest, ComputeMetadata) { - EXPECT_THAT( - delegate() - .ComputeMetadata(kSet1Member1, &kSet1Owner, - {kSet1Member1, kSet1Owner}, base::NullCallback()) - ->context(), - net::SamePartyContext(Type::kSameParty)); + EXPECT_THAT(delegate() + .ComputeMetadata(kSet1AssociatedSite1, &kSet1Primary, + {kSet1AssociatedSite1, kSet1Primary}, + base::NullCallback()) + ->context(), + net::SamePartyContext(Type::kSameParty)); } TEST_F(NoopFirstPartySetsAccessDelegateTest, FindEntries) { EXPECT_THAT( - delegate().FindEntries({kSet1Member1, kSet2Member1}, + delegate().FindEntries({kSet1AssociatedSite1, kSet2AssociatedSite1}, base::NullCallback()), FirstPartySetsAccessDelegate::EntriesResult({ - {kSet1Member1, - net::FirstPartySetEntry(kSet1Owner, net::SiteType::kAssociated, 0)}, - {kSet2Member1, - net::FirstPartySetEntry(kSet2Owner, net::SiteType::kAssociated, 0)}, + {kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kAssociated, + 0)}, + {kSet2AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, net::SiteType::kAssociated, + 0)}, })); } TEST_F(NoopFirstPartySetsAccessDelegateTest, GetCacheFilterMatchInfo) { - EXPECT_EQ( - delegate().GetCacheFilterMatchInfo(kSet1Member1, base::NullCallback()), - net::FirstPartySetsCacheFilter::MatchInfo()); + EXPECT_EQ(delegate().GetCacheFilterMatchInfo(kSet1AssociatedSite1, + base::NullCallback()), + net::FirstPartySetsCacheFilter::MatchInfo()); } class FirstPartySetsAccessDelegateTest : public ::testing::Test { @@ -149,17 +158,20 @@ base::Version("1.2.3"), /*entries=*/ { - {kSet1Member1, net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 0)}, - {kSet1Member2, net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 1)}, - {kSet1Owner, - net::FirstPartySetEntry(kSet1Owner, net::SiteType::kPrimary, + {kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kAssociated, + 0)}, + {kSet1AssociatedSite2, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kAssociated, + 1)}, + {kSet1Primary, + net::FirstPartySetEntry(kSet1Primary, net::SiteType::kPrimary, absl::nullopt)}, - {kSet2Member1, net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0)}, - {kSet2Owner, - net::FirstPartySetEntry(kSet2Owner, net::SiteType::kPrimary, + {kSet2AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, net::SiteType::kAssociated, + 0)}, + {kSet2Primary, + net::FirstPartySetEntry(kSet2Primary, net::SiteType::kPrimary, absl::nullopt)}, }, /*aliases=*/{})); @@ -220,19 +232,20 @@ /*frame_entry=*/nullptr, /*top_frame_entry=*/nullptr); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), expected_metadata); } TEST_F(FirstPartySetsAccessDelegateDisabledTest, FindEntries) { - EXPECT_THAT(FindEntriesAndWait({kSet1Member1, kSet2Member1}), IsEmpty()); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1, kSet2AssociatedSite1}), + IsEmpty()); } TEST_F(FirstPartySetsAccessDelegateDisabledTest, GetCacheFilterMatchInfo) { - EXPECT_THAT( - delegate().GetCacheFilterMatchInfo(kSet1Member1, base::NullCallback()), - Optional(net::FirstPartySetsCacheFilter::MatchInfo())); + EXPECT_THAT(delegate().GetCacheFilterMatchInfo(kSet1AssociatedSite1, + base::NullCallback()), + Optional(net::FirstPartySetsCacheFilter::MatchInfo())); } // Test fixture that allows precise control over when the instance gets FPS @@ -249,14 +262,15 @@ base::test::TestFuture<net::FirstPartySetMetadata> future; { // Force deallocation to provoke a UAF if the impl just copies the pointer. - net::SchemefulSite local_member1(kSet1Member1); + net::SchemefulSite local_associatedSite1(kSet1AssociatedSite1); EXPECT_FALSE(delegate().ComputeMetadata( - kSet1Member1, &local_member1, {kSet1Member1}, future.GetCallback())); + kSet1AssociatedSite1, &local_associatedSite1, {kSet1AssociatedSite1}, + future.GetCallback())); } delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); - net::FirstPartySetEntry entry(kSet1Owner, net::SiteType::kAssociated, 0); + net::FirstPartySetEntry entry(kSet1Primary, net::SiteType::kAssociated, 0); EXPECT_EQ(future.Get(), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &entry, &entry)); @@ -264,30 +278,31 @@ TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_FindEntries) { base::test::TestFuture<FirstPartySetsAccessDelegate::EntriesResult> future; - EXPECT_FALSE(delegate().FindEntries({kSet1Member1, kSet2Member1}, - future.GetCallback())); + EXPECT_FALSE(delegate().FindEntries( + {kSet1AssociatedSite1, kSet2AssociatedSite1}, future.GetCallback())); delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); - EXPECT_THAT( - future.Get(), - FirstPartySetsAccessDelegate::EntriesResult({ - {kSet1Member1, - net::FirstPartySetEntry(kSet1Owner, net::SiteType::kAssociated, 0)}, - {kSet2Member1, - net::FirstPartySetEntry(kSet2Owner, net::SiteType::kAssociated, 0)}, - })); + EXPECT_THAT(future.Get(), + FirstPartySetsAccessDelegate::EntriesResult({ + {kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, + net::SiteType::kAssociated, 0)}, + {kSet2AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, + net::SiteType::kAssociated, 0)}, + })); } TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_GetCacheFilterMatchInfo) { base::test::TestFuture<net::FirstPartySetsCacheFilter::MatchInfo> future; EXPECT_FALSE( - delegate().GetCacheFilterMatchInfo(kSet1Owner, future.GetCallback())); + delegate().GetCacheFilterMatchInfo(kSet1Primary, future.GetCallback())); delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( /*config=*/absl::nullopt, - net::FirstPartySetsCacheFilter({{kSet1Owner, kClearAtRunId}}, + net::FirstPartySetsCacheFilter({{kSet1Primary, kClearAtRunId}}, kBrowserRunId))); net::FirstPartySetsCacheFilter::MatchInfo match_info; @@ -299,20 +314,21 @@ TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_ComputeMetadata) { delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( net::FirstPartySetsContextConfig({ - {kSet1Member1, + {kSet1AssociatedSite1, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet3Owner, net::SiteType::kAssociated, 0))}, - {kSet3Owner, + kSet3Primary, net::SiteType::kAssociated, 0))}, + {kSet3Primary, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet3Owner, net::SiteType::kPrimary, absl::nullopt))}, + kSet3Primary, net::SiteType::kPrimary, absl::nullopt))}, }), /*cache_filter-*/ absl::nullopt)); - net::FirstPartySetEntry primary_entry(kSet3Owner, net::SiteType::kPrimary, + net::FirstPartySetEntry primary_entry(kSet3Primary, net::SiteType::kPrimary, absl::nullopt); - net::FirstPartySetEntry associated_entry(kSet3Owner, + net::FirstPartySetEntry associated_entry(kSet3Primary, net::SiteType::kAssociated, 0); - EXPECT_EQ(ComputeMetadataAndWait(kSet3Owner, &kSet1Member1, {kSet1Member1}), + EXPECT_EQ(ComputeMetadataAndWait(kSet3Primary, &kSet1AssociatedSite1, + {kSet1AssociatedSite1}), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &primary_entry, &associated_entry)); } @@ -320,14 +336,14 @@ TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindEntries) { delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( net::FirstPartySetsContextConfig({ - {kSet3Owner, + {kSet3Primary, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet3Owner, net::SiteType::kPrimary, absl::nullopt))}, + kSet3Primary, net::SiteType::kPrimary, absl::nullopt))}, }), /*cache_filter-*/ absl::nullopt)); - EXPECT_THAT(FindEntriesAndWait({kSet3Owner}), - UnorderedElementsAre(Pair(kSet3Owner, _))); + EXPECT_THAT(FindEntriesAndWait({kSet3Primary}), + UnorderedElementsAre(Pair(kSet3Primary, _))); } class SyncFirstPartySetsAccessDelegateTest @@ -336,43 +352,47 @@ SyncFirstPartySetsAccessDelegateTest() { delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( net::FirstPartySetsContextConfig({ - {kSet3Member1, + {kSet3AssociatedSite1, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet3Owner, net::SiteType::kAssociated, 0))}, - {kSet3Owner, + kSet3Primary, net::SiteType::kAssociated, 0))}, + {kSet3Primary, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet3Owner, net::SiteType::kPrimary, absl::nullopt))}, + kSet3Primary, net::SiteType::kPrimary, absl::nullopt))}, }), - net::FirstPartySetsCacheFilter({{kSet1Owner, kClearAtRunId}}, + net::FirstPartySetsCacheFilter({{kSet1Primary, kClearAtRunId}}, kBrowserRunId))); } }; TEST_F(SyncFirstPartySetsAccessDelegateTest, ComputeMetadata) { - net::FirstPartySetEntry entry(kSet1Owner, net::SiteType::kAssociated, 0); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, {kSet1Member1}), + net::FirstPartySetEntry entry(kSet1Primary, net::SiteType::kAssociated, 0); + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1}), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &entry, &entry)); } TEST_F(SyncFirstPartySetsAccessDelegateTest, FindEntries) { - EXPECT_THAT( - FindEntriesAndWait({kSet1Member1, kSet2Member1, kSet3Member1}), - FirstPartySetsAccessDelegate::EntriesResult({ - {kSet1Member1, - net::FirstPartySetEntry(kSet1Owner, net::SiteType::kAssociated, 0)}, - {kSet2Member1, - net::FirstPartySetEntry(kSet2Owner, net::SiteType::kAssociated, 0)}, - {kSet3Member1, - net::FirstPartySetEntry(kSet3Owner, net::SiteType::kAssociated, 0)}, - })); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1, kSet2AssociatedSite1, + kSet3AssociatedSite1}), + FirstPartySetsAccessDelegate::EntriesResult({ + {kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, + net::SiteType::kAssociated, 0)}, + {kSet2AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, + net::SiteType::kAssociated, 0)}, + {kSet3AssociatedSite1, + net::FirstPartySetEntry(kSet3Primary, + net::SiteType::kAssociated, 0)}, + })); } TEST_F(SyncFirstPartySetsAccessDelegateTest, GetCacheFilterMatchInfo) { net::FirstPartySetsCacheFilter::MatchInfo match_info; match_info.clear_at_run_id = kClearAtRunId; match_info.browser_run_id = kBrowserRunId; - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Owner), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Primary), match_info); } // Verifies the behaviors of the delegate when First-Party Sets are initially @@ -393,15 +413,15 @@ /*top_frame_entry=*/nullptr); base::test::TestFuture<net::FirstPartySetMetadata> future; - EXPECT_FALSE(delegate().ComputeMetadata(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}, - future.GetCallback())); + EXPECT_FALSE(delegate().ComputeMetadata( + kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}, future.GetCallback())); delegate().SetEnabled(false); // All queries received when the delegate is disabled receive empty responses. - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); @@ -410,8 +430,8 @@ // once the config is ready. EXPECT_NE(future.Take(), empty_metadata); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); } @@ -420,12 +440,13 @@ base::test::TestFuture< base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>> future; - EXPECT_FALSE(delegate().FindEntries({kSet1Member1}, future.GetCallback())); + EXPECT_FALSE( + delegate().FindEntries({kSet1AssociatedSite1}, future.GetCallback())); delegate().SetEnabled(false); // All queries received when the delegate is disabled receive empty responses. - EXPECT_THAT(FindEntriesAndWait({kSet1Member1}), IsEmpty()); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1}), IsEmpty()); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); @@ -433,7 +454,7 @@ // once the config is ready. EXPECT_THAT(future.Take(), Not(IsEmpty())); - EXPECT_THAT(FindEntriesAndWait({kSet1Member1}), IsEmpty()); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1}), IsEmpty()); } TEST_F(FirstPartySetsAccessDelegateSetToDisabledTest, @@ -441,41 +462,41 @@ net::FirstPartySetsCacheFilter::MatchInfo match_info; base::test::TestFuture<net::FirstPartySetsCacheFilter::MatchInfo> future; - EXPECT_FALSE( - delegate().GetCacheFilterMatchInfo(kSet1Member1, future.GetCallback())); + EXPECT_FALSE(delegate().GetCacheFilterMatchInfo(kSet1AssociatedSite1, + future.GetCallback())); delegate().SetEnabled(false); // All queries received when the delegate is disabled receive empty responses. - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Member1), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1AssociatedSite1), match_info); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); EXPECT_TRUE(future.Wait()); - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Member1), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1AssociatedSite1), match_info); } TEST_F(FirstPartySetsAccessDelegateSetToDisabledTest, ReadyThenDisabled_ComputeMetadata) { base::test::TestFuture<net::FirstPartySetMetadata> future; - EXPECT_FALSE(delegate().ComputeMetadata(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}, - future.GetCallback())); + EXPECT_FALSE(delegate().ComputeMetadata( + kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}, future.GetCallback())); delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); - net::FirstPartySetEntry entry(kSet1Owner, net::SiteType::kAssociated, 0); + net::FirstPartySetEntry entry(kSet1Primary, net::SiteType::kAssociated, 0); EXPECT_EQ(future.Get(), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &entry, &entry)); - ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}); + ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}); delegate().SetEnabled(false); net::FirstPartySetMetadata empty_metadata(net::SamePartyContext(), /*frame_entry=*/nullptr, /*top_frame_entry=*/nullptr); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); } @@ -483,31 +504,32 @@ ReadyThenDisabled_FindEntries) { base::test::TestFuture<FirstPartySetsAccessDelegate::EntriesResult> future; - EXPECT_FALSE(delegate().FindEntries({kSet1Member1}, future.GetCallback())); + EXPECT_FALSE( + delegate().FindEntries({kSet1AssociatedSite1}, future.GetCallback())); delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); - EXPECT_THAT( - future.Get(), - FirstPartySetsAccessDelegate::EntriesResult( - {{kSet1Member1, net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 0)}})); - FindEntriesAndWait({kSet1Member1}); + EXPECT_THAT(future.Get(), + FirstPartySetsAccessDelegate::EntriesResult( + {{kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet1Primary, + net::SiteType::kAssociated, 0)}})); + FindEntriesAndWait({kSet1AssociatedSite1}); delegate().SetEnabled(false); - EXPECT_THAT(FindEntriesAndWait({kSet1Member1}), IsEmpty()); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1}), IsEmpty()); } TEST_F(FirstPartySetsAccessDelegateSetToDisabledTest, ReadyThenDisabled_GetCacheFilterMatchInfo) { net::FirstPartySetsCacheFilter::MatchInfo match_info; base::test::TestFuture<net::FirstPartySetsCacheFilter::MatchInfo> future; - EXPECT_FALSE( - delegate().GetCacheFilterMatchInfo(kSet1Member1, future.GetCallback())); + EXPECT_FALSE(delegate().GetCacheFilterMatchInfo(kSet1AssociatedSite1, + future.GetCallback())); delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); EXPECT_EQ(future.Get(), match_info); delegate().SetEnabled(false); - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Member1), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1AssociatedSite1), match_info); } // Verifies the behaviors of the delegate when First-Party Sets are initially @@ -529,53 +551,55 @@ net::FirstPartySetMetadata empty_metadata(net::SamePartyContext(), /*frame_entry=*/nullptr, /*top_frame_entry=*/nullptr); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); delegate().SetEnabled(true); base::test::TestFuture<net::FirstPartySetMetadata> future; - net::FirstPartySetEntry primary_entry(kSet2Owner, net::SiteType::kPrimary, + net::FirstPartySetEntry primary_entry(kSet2Primary, net::SiteType::kPrimary, absl::nullopt); - net::FirstPartySetEntry associated_entry(kSet2Owner, + net::FirstPartySetEntry associated_entry(kSet2Primary, net::SiteType::kAssociated, 0); - EXPECT_FALSE(delegate().ComputeMetadata( - kSet2Owner, &kSet1Member1, {kSet1Member1}, future.GetCallback())); + EXPECT_FALSE(delegate().ComputeMetadata(kSet2Primary, &kSet1AssociatedSite1, + {kSet1AssociatedSite1}, + future.GetCallback())); delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( net::FirstPartySetsContextConfig( - {{kSet1Member1, + {{kSet1AssociatedSite1, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0))}}), + kSet2Primary, net::SiteType::kAssociated, 0))}}), /*cache_filter-*/ absl::nullopt)); EXPECT_EQ(future.Get(), net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), &primary_entry, &associated_entry)); - ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}); + ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}); } TEST_F(FirstPartySetsAccessDelegateSetToEnabledTest, EnabledThenReady_FindEntries) { - EXPECT_EQ(FindEntriesAndWait({kSet1Member1}), + EXPECT_EQ(FindEntriesAndWait({kSet1AssociatedSite1}), FirstPartySetsAccessDelegate::EntriesResult()); delegate().SetEnabled(true); base::test::TestFuture<FirstPartySetsAccessDelegate::EntriesResult> future; - EXPECT_FALSE(delegate().FindEntries({kSet1Member1}, future.GetCallback())); + EXPECT_FALSE( + delegate().FindEntries({kSet1AssociatedSite1}, future.GetCallback())); delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent( net::FirstPartySetsContextConfig( - {{kSet1Member1, + {{kSet1AssociatedSite1, net::FirstPartySetEntryOverride(net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0))}}), + kSet2Primary, net::SiteType::kAssociated, 0))}}), /*cache_filter-*/ absl::nullopt)); - EXPECT_EQ( - future.Get(), - FirstPartySetsAccessDelegate::EntriesResult( - {{kSet1Member1, net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0)}})); - FindEntriesAndWait({kSet1Member1}); + EXPECT_EQ(future.Get(), + FirstPartySetsAccessDelegate::EntriesResult( + {{kSet1AssociatedSite1, + net::FirstPartySetEntry(kSet2Primary, + net::SiteType::kAssociated, 0)}})); + FindEntriesAndWait({kSet1AssociatedSite1}); } TEST_F(FirstPartySetsAccessDelegateSetToEnabledTest, @@ -583,36 +607,36 @@ net::FirstPartySetMetadata empty_metadata(net::SamePartyContext(), /*frame_entry=*/nullptr, /*top_frame_entry=*/nullptr); - EXPECT_EQ(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_EQ(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); delegate().SetEnabled(true); - EXPECT_NE(ComputeMetadataAndWait(kSet1Member1, &kSet1Member1, - {kSet1Member1, kSet1Owner}), + EXPECT_NE(ComputeMetadataAndWait(kSet1AssociatedSite1, &kSet1AssociatedSite1, + {kSet1AssociatedSite1, kSet1Primary}), empty_metadata); } TEST_F(FirstPartySetsAccessDelegateSetToEnabledTest, ReadyThenEnabled_FindEntries) { - EXPECT_EQ(FindEntriesAndWait({kSet1Member1}), + EXPECT_EQ(FindEntriesAndWait({kSet1AssociatedSite1}), FirstPartySetsAccessDelegate::EntriesResult()); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); delegate().SetEnabled(true); - EXPECT_THAT(FindEntriesAndWait({kSet1Member1}), - UnorderedElementsAre(Pair(kSet1Member1, _))); + EXPECT_THAT(FindEntriesAndWait({kSet1AssociatedSite1}), + UnorderedElementsAre(Pair(kSet1AssociatedSite1, _))); } TEST_F(FirstPartySetsAccessDelegateSetToEnabledTest, ReadyThenEnabled_GetCacheFilterMatchInfo) { net::FirstPartySetsCacheFilter::MatchInfo match_info; - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Member1), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1AssociatedSite1), match_info); delegate().NotifyReady(mojom::FirstPartySetsReadyEvent::New()); delegate().SetEnabled(true); - EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1Member1), match_info); + EXPECT_EQ(GetCacheFilterMatchInfoAndWait(kSet1AssociatedSite1), match_info); } } // namespace network
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc index 175e8292..1034e415 100644 --- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -180,28 +180,29 @@ // /*content=*/ R"( // [ // { - // "owner": "https://example.test", - // "members": ["https://member1.test", "https://member3.test"] + // "primary": "https://example.test", + // "associatedSites": ["https://associatedSite1.test", + // "https://associatedSite3.test"] // }, // { - // "owner": "https://foo.test", - // "members": ["https://member2.test"] + // "primary": "https://foo.test", + // "associatedSites": ["https://associatedSite2.test"] // } // ] // )"; SetCompleteSets( { - {net::SchemefulSite(GURL("https://member1.test")), + {net::SchemefulSite(GURL("https://associatedSite1.test")), net::FirstPartySetEntry(example_test, net::SiteType::kAssociated, 0)}, - {net::SchemefulSite(GURL("https://member3.test")), + {net::SchemefulSite(GURL("https://associatedSite3.test")), net::FirstPartySetEntry(example_test, net::SiteType::kAssociated, 0)}, {example_test, net::FirstPartySetEntry(example_test, net::SiteType::kPrimary, absl::nullopt)}, - {net::SchemefulSite(GURL("https://member2.test")), + {net::SchemefulSite(GURL("https://associatedSite2.test")), net::FirstPartySetEntry(foo, net::SiteType::kAssociated, 0)}, {foo, net::FirstPartySetEntry(foo, net::SiteType::kPrimary, absl::nullopt)}, @@ -218,18 +219,19 @@ base::test::TestFuture<net::FirstPartySetMetadata> future; { // Force deallocation to provoke a UAF if the impl just copies the pointer. - net::SchemefulSite member(GURL("https://member1.test")); + net::SchemefulSite associatedSite(GURL("https://associatedSite1.test")); - EXPECT_FALSE(manager().ComputeMetadata(member, &member, {member}, - net::FirstPartySetsContextConfig(), - future.GetCallback())); + EXPECT_FALSE(manager().ComputeMetadata( + associatedSite, &associatedSite, {associatedSite}, + net::FirstPartySetsContextConfig(), future.GetCallback())); } Populate(); { - net::SchemefulSite owner(GURL("https://example.test")); - net::FirstPartySetEntry entry(owner, net::SiteType::kAssociated, 0); + net::FirstPartySetEntry entry( + net::SchemefulSite(GURL("https://example.test")), + net::SiteType::kAssociated, 0); EXPECT_EQ(future.Get(), net::FirstPartySetMetadata( @@ -240,29 +242,30 @@ } TEST_F(AsyncPopulatedFirstPartySetsManagerTest, QueryBeforeReady_FindEntries) { - net::SchemefulSite member1(GURL("https://member1.test")); - net::SchemefulSite member2(GURL("https://member2.test")); + net::SchemefulSite associatedSite1(GURL("https://associatedSite1.test")); + net::SchemefulSite associatedSite2(GURL("https://associatedSite2.test")); net::SchemefulSite example(GURL("https://example.test")); net::SchemefulSite example_cctld(GURL("https://example.cctld")); base::test::TestFuture<FirstPartySetsManager::EntriesResult> future; - EXPECT_FALSE(manager().FindEntries({member1, member2, example_cctld}, - net::FirstPartySetsContextConfig(), - future.GetCallback())); + EXPECT_FALSE(manager().FindEntries( + {associatedSite1, associatedSite2, example_cctld}, + net::FirstPartySetsContextConfig(), future.GetCallback())); Populate(); EXPECT_THAT( future.Get(), UnorderedElementsAre( - Pair(member1, + Pair(associatedSite1, net::FirstPartySetEntry(example, net::SiteType::kAssociated, 0)), Pair(example_cctld, net::FirstPartySetEntry(example, net::SiteType::kPrimary, absl::nullopt)), - Pair(member2, net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://foo.test")), - net::SiteType::kAssociated, 0)))); + Pair(associatedSite2, + net::FirstPartySetEntry( + net::SchemefulSite(GURL("https://foo.test")), + net::SiteType::kAssociated, 0)))); } } // namespace network
diff --git a/services/network/oblivious_http_request_handler.cc b/services/network/oblivious_http_request_handler.cc index c38af5a0..4c480bc 100644 --- a/services/network/oblivious_http_request_handler.cc +++ b/services/network/oblivious_http_request_handler.cc
@@ -11,6 +11,7 @@ #include "base/ranges/algorithm.h" #include "mojo/public/cpp/bindings/remote_set.h" #include "net/base/load_flags.h" +#include "net/http/http_log_util.h" #include "net/http/http_request_headers.h" #include "net/http/http_status_code.h" #include "net/http/http_util.h" @@ -37,7 +38,7 @@ constexpr size_t kMaxResponseSize = 5 * 1024 * 1024; // Response size limit is 5MB -constexpr base::TimeDelta kRequestTimeout = base::Minutes(1); +constexpr base::TimeDelta kDefaultRequestTimeout = base::Minutes(1); constexpr char kObliviousHttpRequestMimeType[] = "message/ohttp-req"; constexpr size_t kMaxMethodSize = 16; @@ -212,7 +213,7 @@ state->net_log = net::NetLogWithSource::Make( net::NetLog::Get(), net::NetLogSourceType::URL_REQUEST); - state->net_log.BeginEvent(net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST_START); + state->net_log.BeginEvent(net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST); if (state->request->trust_token_params) { state->trust_token_helper_factory = @@ -372,7 +373,9 @@ state->loader->AttachStringForUpload(*maybe_encrypted_blob, kObliviousHttpRequestMimeType); - state->loader->SetTimeoutDuration(kRequestTimeout); + state->loader->SetTimeoutDuration(state->request->timeout_duration + ? *state->request->timeout_duration + : kDefaultRequestTimeout); state->loader->DownloadToString( GetURLLoaderFactory(), base::BindOnce(&ObliviousHttpRequestHandler::OnRequestComplete, @@ -389,8 +392,15 @@ DCHECK(client); DCHECK(state_iter != client_state_.end()); RequestState* state = state_iter->second.get(); - state->net_log.EndEventWithIntParams( - net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST_END, "status", error_code); + state->net_log.EndEvent(net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST, [&] { + base::Value::Dict params; + params.Set("net_error", error_code); + if (outer_response_error_code) { + params.Set("outer_response_error_code", + outer_response_error_code.value()); + } + return params; + }); network::mojom::ObliviousHttpCompletionResultPtr response_result; if (outer_response_error_code) { @@ -500,7 +510,19 @@ scoped_refptr<net::HttpResponseHeaders> headers, std::string body) { mojom::ObliviousHttpClient* client = clients_.Get(id); + auto state_iter = client_state_.find(id); DCHECK(client); + DCHECK(state_iter != client_state_.end()); + RequestState* state = state_iter->second.get(); + net::NetLogResponseHeaders( + state->net_log, net::NetLogEventType::OBLIVIOUS_HTTP_RESPONSE_HEADERS, + headers.get()); + state->net_log.EndEvent(net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST, [&] { + base::Value::Dict params; + params.Set("net_error", net::OK); + params.Set("inner_response_code", inner_response_code); + return params; + }); network::mojom::ObliviousHttpResponsePtr response = network::mojom::ObliviousHttpResponse::New();
diff --git a/services/network/oblivious_http_request_handler_unittest.cc b/services/network/oblivious_http_request_handler_unittest.cc index 708b034..b07e904 100644 --- a/services/network/oblivious_http_request_handler_unittest.cc +++ b/services/network/oblivious_http_request_handler_unittest.cc
@@ -6,9 +6,12 @@ #include <cstdint> #include "base/test/task_environment.h" +#include "base/time/time.h" #include "mojo/public/cpp/test_support/fake_message_dispatch_context.h" #include "mojo/public/cpp/test_support/test_utils.h" #include "net/http/http_status_code.h" +#include "net/log/test_net_log.h" +#include "net/log/test_net_log_util.h" #include "net/third_party/quiche/src/quiche/binary_http/binary_http_message.h" #include "net/third_party/quiche/src/quiche/common/quiche_data_writer.h" #include "net/third_party/quiche/src/quiche/oblivious_http/oblivious_http_gateway.h" @@ -98,6 +101,7 @@ void OnCompleted( network::mojom::ObliviousHttpCompletionResultPtr status) override { + is_on_completed_called_ = true; switch (expected_response_type_) { case ResponseType::kSuccess: { ASSERT_TRUE(status->is_inner_response()); @@ -134,6 +138,8 @@ void WaitForCall() { run_loop_.Run(); } + bool IsOnCompletedCalled() { return is_on_completed_called_; } + private: ResponseType expected_response_type_; int expected_inner_response_code_ = 0; @@ -141,6 +147,7 @@ std::multimap<std::string, std::string> expected_headers_; int expected_outer_response_error_code_ = 0; int expected_net_error_ = 0; + bool is_on_completed_called_ = false; mojo::Receiver<network::mojom::ObliviousHttpClient> receiver_; base::RunLoop run_loop_; }; @@ -150,7 +157,9 @@ class TestObliviousHttpRequestHandler : public testing::Test { public: TestObliviousHttpRequestHandler() - : task_environment_(base::test::TaskEnvironment::MainThreadType::IO), + : task_environment_( + base::test::TaskEnvironment::MainThreadType::IO, + base::test::SingleThreadTaskEnvironment::TimeSource::MOCK_TIME), network_service_(network::NetworkService::CreateForTesting()), loader_factory_receiver_(&loader_factory_) { network::mojom::NetworkContextParamsPtr context_params = @@ -269,6 +278,54 @@ return request; } + void FastForward(base::TimeDelta delta) { + task_environment_.FastForwardBy(delta); + task_environment_.RunUntilIdle(); + } + + void VerifyNetLog(const net::RecordingNetLogObserver& net_log_observer, + bool expected_has_response_data_and_headers, + int expected_net_error, + absl::optional<int> expected_outer_response_error_code, + absl::optional<int> expected_inner_response_code) { + auto entries = net_log_observer.GetEntries(); + size_t pos = net::ExpectLogContainsSomewhereAfter( + entries, /*start_offset=*/0, + net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST, + net::NetLogEventPhase::BEGIN); + pos = net::ExpectLogContainsSomewhere( + entries, /*start_offset=*/pos + 1, + net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST_DATA, + net::NetLogEventPhase::NONE); + EXPECT_TRUE( + net::GetOptionalIntegerValueFromParams(entries[pos], "byte_count")); + if (expected_has_response_data_and_headers) { + pos = net::ExpectLogContainsSomewhereAfter( + entries, /*start_offset=*/pos + 1, + net::NetLogEventType::OBLIVIOUS_HTTP_RESPONSE_DATA, + net::NetLogEventPhase::NONE); + EXPECT_TRUE( + net::GetOptionalIntegerValueFromParams(entries[pos], "byte_count")); + pos = net::ExpectLogContainsSomewhereAfter( + entries, /*start_offset=*/pos + 1, + net::NetLogEventType::OBLIVIOUS_HTTP_RESPONSE_HEADERS, + net::NetLogEventPhase::NONE); + EXPECT_TRUE(entries[pos].params.FindList("headers")); + } + pos = net::ExpectLogContainsSomewhereAfter( + entries, /*start_offset=*/pos + 1, + net::NetLogEventType::OBLIVIOUS_HTTP_REQUEST, + net::NetLogEventPhase::END); + EXPECT_EQ(expected_net_error, + net::GetOptionalNetErrorCodeFromParams(entries[pos])); + EXPECT_EQ(expected_outer_response_error_code, + net::GetOptionalIntegerValueFromParams( + entries[pos], "outer_response_error_code")); + EXPECT_EQ(expected_inner_response_code, + net::GetOptionalIntegerValueFromParams(entries[pos], + "inner_response_code")); + } + private: absl::optional<quiche::ObliviousHttpGateway> ohttp_gateway_; base::test::TaskEnvironment task_environment_; @@ -401,6 +458,7 @@ std::unique_ptr<network::ObliviousHttpRequestHandler> handler = CreateHandler(); { + net::RecordingNetLogObserver net_log_observer; TestOhttpClient client; client.SetExpectedInnerResponse( /*expected_inner_response_code=*/net::HTTP_OK, @@ -450,6 +508,51 @@ "response body", {{"cache-control", "s-maxage=3600"}, {"content-type", "text/html"}}); client.WaitForCall(); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/true, + /*expected_net_error=*/net::OK, + /*expected_outer_response_error_code=*/absl::nullopt, + /*expected_inner_response_code=*/net::HTTP_OK); + } +} + +TEST_F(TestObliviousHttpRequestHandler, TestTimeout) { + std::unique_ptr<network::ObliviousHttpRequestHandler> handler = + CreateHandler(); + // Default timeout. + { + net::RecordingNetLogObserver net_log_observer; + TestOhttpClient client; + client.SetExpectedNetError(net::ERR_TIMED_OUT); + + handler->StartRequest(CreateRequest(), client.CreatePendingRemote()); + + FastForward(base::Seconds(59)); + EXPECT_FALSE(client.IsOnCompletedCalled()); + FastForward(base::Seconds(1)); + EXPECT_TRUE(client.IsOnCompletedCalled()); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/false, + /*expected_net_error=*/net::ERR_TIMED_OUT, + /*expected_outer_response_error_code=*/absl::nullopt, + /*expected_inner_response_code=*/absl::nullopt); + } + // Configured timeout. + { + TestOhttpClient client; + client.SetExpectedNetError(net::ERR_TIMED_OUT); + + network::mojom::ObliviousHttpRequestPtr request = CreateRequest(); + request->timeout_duration = base::Seconds(3); + + handler->StartRequest(std::move(request), client.CreatePendingRemote()); + + FastForward(base::Seconds(2)); + EXPECT_FALSE(client.IsOnCompletedCalled()); + FastForward(base::Seconds(1)); + EXPECT_TRUE(client.IsOnCompletedCalled()); } } @@ -457,14 +560,22 @@ std::unique_ptr<network::ObliviousHttpRequestHandler> handler = CreateHandler(); { + net::RecordingNetLogObserver net_log_observer; loader_factory()->AddResponse(kRelayURL, "", net::HTTP_NOT_FOUND); TestOhttpClient client; client.SetExpectedOuterResponseErrorCode(net::HTTP_NOT_FOUND); handler->StartRequest(CreateRequest(), client.CreatePendingRemote()); client.WaitForCall(); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/false, + /*expected_net_error=*/net::ERR_HTTP_RESPONSE_CODE_FAILURE, + /*expected_outer_response_error_code=*/net::HTTP_NOT_FOUND, + /*expected_inner_response_code=*/absl::nullopt); } { + net::RecordingNetLogObserver net_log_observer; loader_factory()->AddResponse( GURL(kRelayURL), network::CreateURLResponseHead(net::HTTP_OK), "", network::URLLoaderCompletionStatus(net::ERR_CONNECTION_RESET), @@ -478,6 +589,12 @@ handler->StartRequest(CreateRequest(), client.CreatePendingRemote()); client.WaitForCall(); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/false, + /*expected_net_error=*/net::ERR_CONNECTION_RESET, + /*expected_outer_response_error_code=*/absl::nullopt, + /*expected_inner_response_code=*/absl::nullopt); } } @@ -485,6 +602,7 @@ std::unique_ptr<network::ObliviousHttpRequestHandler> handler = CreateHandler(); { + net::RecordingNetLogObserver net_log_observer; TestOhttpClient client; client.SetExpectedInnerResponse( /*expected_inner_response_code=*/net::HTTP_NOT_FOUND, @@ -496,8 +614,15 @@ RespondToPendingRequest("", {{"cache-control", "s-maxage=60"}}, GURL(kRelayURL), net::HTTP_NOT_FOUND); client.WaitForCall(); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/true, + /*expected_net_error=*/net::OK, + /*expected_outer_response_error_code=*/absl::nullopt, + /*expected_inner_response_code=*/net::HTTP_NOT_FOUND); } { + net::RecordingNetLogObserver net_log_observer; TestOhttpClient client; client.SetExpectedNetError(net::ERR_INVALID_RESPONSE); @@ -509,6 +634,12 @@ /*response_head=*/network::CreateURLResponseHead(net::HTTP_OK), /*content=*/"malformed inner response")); client.WaitForCall(); + + VerifyNetLog(net_log_observer, + /*expected_has_response_data_and_headers=*/false, + /*expected_net_error=*/net::ERR_INVALID_RESPONSE, + /*expected_outer_response_error_code=*/absl::nullopt, + /*expected_inner_response_code=*/absl::nullopt); } }
diff --git a/services/network/public/cpp/cors/cors_error_status.cc b/services/network/public/cpp/cors/cors_error_status.cc index fb12dba..abe2e2aa 100644 --- a/services/network/public/cpp/cors/cors_error_status.cc +++ b/services/network/public/cpp/cors/cors_error_status.cc
@@ -13,7 +13,7 @@ namespace network { -CorsErrorStatus::CorsErrorStatus() = default; +CorsErrorStatus::CorsErrorStatus(mojo::DefaultConstruct::Tag) {} CorsErrorStatus::CorsErrorStatus(const CorsErrorStatus&) = default; CorsErrorStatus& CorsErrorStatus::operator=(const CorsErrorStatus&) = default;
diff --git a/services/network/public/cpp/cors/cors_error_status.h b/services/network/public/cpp/cors/cors_error_status.h index 87ef3dcd..7e73fb6 100644 --- a/services/network/public/cpp/cors/cors_error_status.h +++ b/services/network/public/cpp/cors/cors_error_status.h
@@ -10,6 +10,7 @@ #include "base/component_export.h" #include "base/unguessable_token.h" +#include "mojo/public/cpp/bindings/default_construct_tag.h" #include "services/network/public/mojom/cors.mojom-shared.h" #include "services/network/public/mojom/ip_address_space.mojom-shared.h" @@ -17,12 +18,6 @@ // Type-mapped to `network::mojom::CorsErrorStatus`. struct COMPONENT_EXPORT(NETWORK_CPP_BASE) CorsErrorStatus { - // This constructor is used by generated IPC serialization code. - // Should not use this explicitly. - // TODO(toyoshim, yhirano): Exploring a way to make this private, and allows - // only serialization code for mojo can access. - CorsErrorStatus(); - // Instances of this type are copyable and efficiently movable. CorsErrorStatus(const CorsErrorStatus&); CorsErrorStatus& operator=(const CorsErrorStatus&); @@ -43,6 +38,9 @@ bool operator==(const CorsErrorStatus& rhs) const; bool operator!=(const CorsErrorStatus& rhs) const { return !(*this == rhs); } + // This constructor is used by generated IPC serialization code. + explicit CorsErrorStatus(mojo::DefaultConstruct::Tag); + // NOTE: This value is meaningless and should be overridden immediately either // by a constructor or by Mojo deserialization code. mojom::CorsError cors_error = mojom::CorsError::kMaxValue;
diff --git a/services/network/public/cpp/cors/cors_mojom_traits_unittest.cc b/services/network/public/cpp/cors/cors_mojom_traits_unittest.cc index f726710..c118b46 100644 --- a/services/network/public/cpp/cors/cors_mojom_traits_unittest.cc +++ b/services/network/public/cpp/cors/cors_mojom_traits_unittest.cc
@@ -13,14 +13,13 @@ namespace { TEST(CorsMojomTraitsTest, CorsErrorStatusMojoRoundTrip) { - CorsErrorStatus original; - original.cors_error = mojom::CorsError::kInsecurePrivateNetwork; + CorsErrorStatus original(mojom::CorsError::kInsecurePrivateNetwork, + mojom::IPAddressSpace::kLoopback, + mojom::IPAddressSpace::kLocal); original.failed_parameter = "bleep"; - original.target_address_space = mojom::IPAddressSpace::kLocal; - original.resource_address_space = mojom::IPAddressSpace::kLoopback; original.has_authorization_covered_by_wildcard_on_preflight = true; - CorsErrorStatus copy; + CorsErrorStatus copy(mojom::CorsError::kInvalidResponse); EXPECT_TRUE(mojo::test::SerializeAndDeserialize<mojom::CorsErrorStatus>( original, copy)); EXPECT_EQ(original, copy);
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn index 13e7e7c..496ccda 100644 --- a/services/network/public/mojom/BUILD.gn +++ b/services/network/public/mojom/BUILD.gn
@@ -664,6 +664,7 @@ { mojom = "network.mojom.CorsErrorStatus" cpp = "::network::CorsErrorStatus" + default_constructible = false }, ] traits_headers =
diff --git a/services/network/public/mojom/oblivious_http_request.mojom b/services/network/public/mojom/oblivious_http_request.mojom index 24a40c9..71c1519 100644 --- a/services/network/public/mojom/oblivious_http_request.mojom +++ b/services/network/public/mojom/oblivious_http_request.mojom
@@ -4,6 +4,7 @@ module network.mojom; +import "mojo/public/mojom/base/time.mojom"; import "services/network/public/mojom/isolation_info.mojom"; import "services/network/public/mojom/mutable_network_traffic_annotation_tag.mojom"; @@ -63,6 +64,10 @@ url.mojom.Url relay_url; MutableNetworkTrafficAnnotationTag traffic_annotation; + // How long the URL loader should wait before timing out the request. The + // handler will use a default timeout if not set. + mojo_base.mojom.TimeDelta? timeout_duration; + // The key config contains the public key of the `resource_url` server, which // is the only reassurance we have that we are talking to the `resource_url` // server, so care should be taken when getting the key config.
diff --git a/services/network/shared_dictionary/shared_dictionary_disk_cache.cc b/services/network/shared_dictionary/shared_dictionary_disk_cache.cc new file mode 100644 index 0000000..4b4ff62 --- /dev/null +++ b/services/network/shared_dictionary/shared_dictionary_disk_cache.cc
@@ -0,0 +1,146 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/shared_dictionary/shared_dictionary_disk_cache.h" + +#include "base/trace_event/trace_event.h" +#include "base/trace_event/trace_id_helper.h" + +namespace network { +namespace { + +void RunTaksAndCallback( + base::OnceCallback<int(net::CompletionOnceCallback)> task, + net::CompletionOnceCallback callback) { + auto split_callback = base::SplitOnceCallback(std::move(callback)); + int result = std::move(task).Run(std::move(split_callback.first)); + if (result != net::ERR_IO_PENDING) { + std::move(split_callback.second).Run(std::move(result)); + } +} + +void RunTaksAndEntryResultCallback( + base::OnceCallback<disk_cache::EntryResult(disk_cache::EntryResultCallback)> + task, + disk_cache::EntryResultCallback callback) { + auto split_callback = base::SplitOnceCallback(std::move(callback)); + disk_cache::EntryResult result = + std::move(task).Run(std::move(split_callback.first)); + if (result.net_error() != net::ERR_IO_PENDING) { + std::move(split_callback.second).Run(std::move(result)); + } +} + +} // namespace + +SharedDictionaryDiskCache::SharedDictionaryDiskCache( + const base::FilePath& cache_directory_path, +#if BUILDFLAG(IS_ANDROID) + base::android::ApplicationStatusListener* app_status_listener, +#endif // BUILDFLAG(IS_ANDROID) + scoped_refptr<disk_cache::BackendFileOperationsFactory> + file_operations_factory) { + // We use APP_CACHE to avoid the auto-eviction. + disk_cache::BackendResult result = disk_cache::CreateCacheBackend( + cache_directory_path.empty() ? net::MEMORY_CACHE : net::APP_CACHE, + net::CACHE_BACKEND_SIMPLE, file_operations_factory.get(), + cache_directory_path, /*max_bytes=*/0, + disk_cache::ResetHandling::kResetOnError, /*net_log=*/nullptr, + base::BindOnce(&SharedDictionaryDiskCache::DidCreateBackend, GetWeakPtr()) +#if BUILDFLAG(IS_ANDROID) + , + app_status_listener +#endif // BUILDFLAG(IS_ANDROID)); + ); + if (result.net_error != net::ERR_IO_PENDING) { + DidCreateBackend(std::move(result)); + } +} + +SharedDictionaryDiskCache::~SharedDictionaryDiskCache() = default; + +disk_cache::EntryResult SharedDictionaryDiskCache::OpenOrCreateEntry( + const std::string& key, + bool create, + disk_cache::EntryResultCallback callback) { + switch (state_) { + case State::kInitializing: + // It is safe to use Unretained() below because + // `pending_disk_cache_tasks_` is owned by `this` and the passed task + // `SharedDictionaryDiskCache::OpenOrCreateEntry()` will be called only + // when `this` is available. + pending_disk_cache_tasks_.push_back(base::BindOnce( + &RunTaksAndEntryResultCallback, + base::BindOnce(&SharedDictionaryDiskCache::OpenOrCreateEntry, + base::Unretained(this), key, create), + std::move(callback))); + return disk_cache::EntryResult::MakeError(net::ERR_IO_PENDING); + case State::kInitialized: + DCHECK(backend_); + return create + ? backend_->CreateEntry(key, net::LOW, std::move(callback)) + : backend_->OpenEntry(key, net::HIGHEST, std::move(callback)); + case State::kFailed: + return disk_cache::EntryResult::MakeError(net::ERR_FAILED); + } +} + +int SharedDictionaryDiskCache::DoomEntry(const std::string& key, + net::CompletionOnceCallback callback) { + switch (state_) { + case State::kInitializing: + // It is safe to use Unretained() below because + // `pending_disk_cache_tasks_` is owned by `this` and the passed task + // `SharedDictionaryDiskCache::DoomEntry()` will be called only when + // `this` is available. + pending_disk_cache_tasks_.push_back( + base::BindOnce(&RunTaksAndCallback, + base::BindOnce(&SharedDictionaryDiskCache::DoomEntry, + base::Unretained(this), key), + std::move(callback))); + return net::ERR_IO_PENDING; + case State::kInitialized: + DCHECK(backend_); + return backend_->DoomEntry(key, net::LOW, std::move(callback)); + case State::kFailed: + return net::ERR_FAILED; + } +} + +int SharedDictionaryDiskCache::ClearAll(net::CompletionOnceCallback callback) { + switch (state_) { + case State::kInitializing: + // It is safe to use Unretained() below because + // `pending_disk_cache_tasks_` is owned by `this` and the passed task + // `SharedDictionaryDiskCache::ClearAll()` will be called only when `this` + // is available. + pending_disk_cache_tasks_.push_back( + base::BindOnce(&RunTaksAndCallback, + base::BindOnce(&SharedDictionaryDiskCache::ClearAll, + base::Unretained(this)), + std::move(callback))); + return net::ERR_IO_PENDING; + case State::kInitialized: + DCHECK(backend_); + return backend_->DoomAllEntries(std::move(callback)); + case State::kFailed: + return net::ERR_FAILED; + } +} + +void SharedDictionaryDiskCache::DidCreateBackend( + disk_cache::BackendResult result) { + if (result.net_error != net::OK) { + state_ = State::kFailed; + } else { + state_ = State::kInitialized; + backend_ = std::move(result.backend); + } + auto tasks = std::move(pending_disk_cache_tasks_); + for (auto& task : tasks) { + std::move(task).Run(); + } +} + +} // namespace network
diff --git a/services/network/shared_dictionary/shared_dictionary_disk_cache.h b/services/network/shared_dictionary/shared_dictionary_disk_cache.h new file mode 100644 index 0000000..afbc62e5 --- /dev/null +++ b/services/network/shared_dictionary/shared_dictionary_disk_cache.h
@@ -0,0 +1,70 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_DISK_CACHE_H_ +#define SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_DISK_CACHE_H_ + +#include <memory> +#include <string> +#include <vector> + +#include "base/component_export.h" +#include "base/memory/weak_ptr.h" +#include "build/build_config.h" +#include "net/base/completion_once_callback.h" +#include "net/disk_cache/disk_cache.h" + +namespace base { +namespace android { +class ApplicationStatusListener; +} // namespace android +class FilePath; +} // namespace base + +namespace disk_cache { +class BackendFileOperationsFactory; +} // namespace disk_cache + +namespace network { + +class COMPONENT_EXPORT(NETWORK_SERVICE) SharedDictionaryDiskCache { + public: + SharedDictionaryDiskCache( + const base::FilePath& cache_directory_path, +#if BUILDFLAG(IS_ANDROID) + base::android::ApplicationStatusListener* app_status_listener, +#endif // BUILDFLAG(IS_ANDROID) + scoped_refptr<disk_cache::BackendFileOperationsFactory> + file_operations_factory); + ~SharedDictionaryDiskCache(); + + SharedDictionaryDiskCache(const SharedDictionaryDiskCache&) = delete; + SharedDictionaryDiskCache& operator=(const SharedDictionaryDiskCache&) = + delete; + + disk_cache::EntryResult OpenOrCreateEntry( + const std::string& key, + bool create, + disk_cache::EntryResultCallback callback); + int DoomEntry(const std::string& key, net::CompletionOnceCallback callback); + int ClearAll(net::CompletionOnceCallback callback); + + private: + enum class State { kInitializing, kInitialized, kFailed }; + + void DidCreateBackend(disk_cache::BackendResult result); + + base::WeakPtr<SharedDictionaryDiskCache> GetWeakPtr() { + return weak_factory_.GetWeakPtr(); + } + + State state_ = State::kInitializing; + std::unique_ptr<disk_cache::Backend> backend_; + std::vector<base::OnceClosure> pending_disk_cache_tasks_; + base::WeakPtrFactory<SharedDictionaryDiskCache> weak_factory_{this}; +}; + +} // namespace network + +#endif // SERVICES_NETWORK_SHARED_DICTIONARY_SHARED_DICTIONARY_DISK_CACHE_H_
diff --git a/services/network/shared_dictionary/shared_dictionary_disk_cache_unittest.cc b/services/network/shared_dictionary/shared_dictionary_disk_cache_unittest.cc new file mode 100644 index 0000000..9b9d6d53 --- /dev/null +++ b/services/network/shared_dictionary/shared_dictionary_disk_cache_unittest.cc
@@ -0,0 +1,314 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "services/network/shared_dictionary/shared_dictionary_disk_cache.h" + +#include "base/files/file_util.h" +#include "base/files/scoped_temp_dir.h" +#include "base/numerics/safe_conversions.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "base/test/test_file_util.h" +#include "net/base/io_buffer.h" +#include "net/base/test_completion_callback.h" +#include "net/disk_cache/disk_cache_test_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace network { +namespace { +const std::string kTestKey = "test"; +const std::string kTestData = "Hello world"; +} // namespace + +class SharedDictionaryDiskCacheTest : public testing::Test { + public: + SharedDictionaryDiskCacheTest() = default; + + void SetUp() override { + ASSERT_TRUE(tmp_directory_.CreateUniqueTempDir()); + directory_path_ = + tmp_directory_.GetPath().Append(FILE_PATH_LITERAL("dictionaries")); + } + + void TearDown() override { FlushCacheTasks(); } + + protected: + std::unique_ptr<SharedDictionaryDiskCache> CreateDiskCache() { + return std::make_unique<SharedDictionaryDiskCache>( + directory_path_, +#if BUILDFLAG(IS_ANDROID) + /*app_status_listener=*/nullptr, +#endif // BUILDFLAG(IS_ANDROID) + /*file_operations_factory=*/nullptr); + } + + void FlushCacheTasks() { + disk_cache::FlushCacheThreadForTesting(); + task_environment_.RunUntilIdle(); + } + + disk_cache::EntryResult CreateEntry(SharedDictionaryDiskCache* disk_cache, + const std::string& key) { + TestEntryResultCompletionCallback create_callback; + return create_callback.GetResult(disk_cache->OpenOrCreateEntry( + key, /*create=*/true, create_callback.callback())); + } + + disk_cache::EntryResult OpenEntry(SharedDictionaryDiskCache* disk_cache, + const std::string& key) { + TestEntryResultCompletionCallback create_callback; + return create_callback.GetResult(disk_cache->OpenOrCreateEntry( + key, /*create=*/false, create_callback.callback())); + } + + int DoomEntry(SharedDictionaryDiskCache* disk_cache, const std::string& key) { + net::TestCompletionCallback doom_entry_callback; + return doom_entry_callback.GetResult( + disk_cache->DoomEntry(key, doom_entry_callback.callback())); + } + + int ClearAll(SharedDictionaryDiskCache* disk_cache) { + net::TestCompletionCallback clear_all_callback; + return clear_all_callback.GetResult( + disk_cache->ClearAll(clear_all_callback.callback())); + } + + int WriteData(disk_cache::Entry* entry, const std::string& data) { + scoped_refptr<net::StringIOBuffer> write_buffer = + base::MakeRefCounted<net::StringIOBuffer>(data); + net::TestCompletionCallback write_callback; + return write_callback.GetResult(entry->WriteData( + /*index=*/1, /*offset=*/0, write_buffer.get(), write_buffer->size(), + write_callback.callback(), /*truncate=*/false)); + } + + void CheckEntryDataEquals(disk_cache::Entry* entry, + const std::string& expected_data) { + EXPECT_EQ(base::checked_cast<int32_t>(expected_data.size()), + entry->GetDataSize(/*index=*/1)); + + scoped_refptr<net::IOBufferWithSize> read_buffer = + base::MakeRefCounted<net::IOBufferWithSize>(expected_data.size()); + net::TestCompletionCallback read_callback; + EXPECT_EQ(read_buffer->size(), + read_callback.GetResult(entry->ReadData( + /*index=*/1, /*offset=*/0, read_buffer.get(), + expected_data.size(), read_callback.callback()))); + EXPECT_EQ(expected_data, + std::string(reinterpret_cast<const char*>(read_buffer->data()), + read_buffer->size())); + } + + void PrepareDiskCacheWithTestData() { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + // Create an entry. + disk_cache::EntryResult create_result = + CreateEntry(disk_cache.get(), kTestKey); + EXPECT_EQ(net::OK, create_result.net_error()); + disk_cache::ScopedEntryPtr created_entry; + created_entry.reset(create_result.ReleaseEntry()); + ASSERT_TRUE(created_entry); + + // Write to the entry. + EXPECT_EQ(base::checked_cast<int>(kTestData.size()), + WriteData(created_entry.get(), kTestData)); + } + + void CorruptDiskCache() { + PrepareDiskCacheWithTestData(); + + // Corrupt the fake index file for the populated simple cache. + const base::FilePath index_file_path = + directory_path_.Append(FILE_PATH_LITERAL("index")); + ASSERT_TRUE(base::WriteFile(index_file_path, "corrupted")); + file_permissions_restorer_ = std::make_unique<base::FilePermissionRestorer>( + tmp_directory_.GetPath()); + // Mark the parent directory unwritable, so that we can't restore the dist + ASSERT_TRUE(base::MakeFileUnwritable(tmp_directory_.GetPath())); + } + + private: + base::test::TaskEnvironment task_environment_; + base::ScopedTempDir tmp_directory_; + base::FilePath directory_path_; + // `file_permissions_restorer_` must be below `tmp_directory_` to restore the + // file permission correctly. + std::unique_ptr<base::FilePermissionRestorer> file_permissions_restorer_; +}; + +TEST_F(SharedDictionaryDiskCacheTest, CreateEntry) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::OK, CreateEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, CreateEntryWhileInitializing) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::OK, CreateEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, OpenNonExistentEntryFailure) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, + OpenNonExistentEntryFailureWhileInitializing) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, OpenEntrySuccess) { + { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::OK, CreateEntry(disk_cache.get(), kTestKey).net_error()); + } + { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::OK, OpenEntry(disk_cache.get(), kTestKey).net_error()); + } +} + +TEST_F(SharedDictionaryDiskCacheTest, DoomEntry) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::OK, DoomEntry(disk_cache.get(), kTestKey)); +} + +TEST_F(SharedDictionaryDiskCacheTest, DoomEntryWhileInitializing) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::OK, DoomEntry(disk_cache.get(), kTestKey)); +} + +TEST_F(SharedDictionaryDiskCacheTest, ClearAll) { + PrepareDiskCacheWithTestData(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::OK, ClearAll(disk_cache.get())); + + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, ClearAllWhileInitializing) { + PrepareDiskCacheWithTestData(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::OK, ClearAll(disk_cache.get())); + + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, CreateWriteOpenReadDeleteReopen) { + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + + // Create an entry. + disk_cache::EntryResult create_result = + CreateEntry(disk_cache.get(), kTestKey); + EXPECT_EQ(net::OK, create_result.net_error()); + disk_cache::ScopedEntryPtr created_entry; + created_entry.reset(create_result.ReleaseEntry()); + ASSERT_TRUE(created_entry); + + // Write to the entry. + EXPECT_EQ(base::checked_cast<int>(kTestData.size()), + WriteData(created_entry.get(), kTestData)); + + // Close the written entry. + created_entry.reset(); + + // Open the entry. + disk_cache::EntryResult open_result = OpenEntry(disk_cache.get(), kTestKey); + EXPECT_EQ(net::OK, open_result.net_error()); + disk_cache::ScopedEntryPtr opened_entry; + opened_entry.reset(open_result.ReleaseEntry()); + ASSERT_TRUE(opened_entry); + + // Read the entry. + CheckEntryDataEquals(opened_entry.get(), kTestData); + + // Close the opened entry. + opened_entry.reset(); + + // Doom the entry. + net::TestCompletionCallback doom_callback; + EXPECT_EQ(net::OK, doom_callback.GetResult(disk_cache->DoomEntry( + kTestKey, doom_callback.callback()))); + + // Reopen the entry. + disk_cache::EntryResult reopen_result = OpenEntry(disk_cache.get(), kTestKey); + EXPECT_EQ(net::ERR_FAILED, reopen_result.net_error()); +} + +#if !BUILDFLAG(IS_FUCHSIA) +// CorruptDiskCache() doesn't work on Fuchsia. So disabling the following tests +// on Fuchsia. +TEST_F(SharedDictionaryDiskCacheTest, CreateEntryCorruptedFailure) { + CorruptDiskCache(); + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::ERR_FAILED, + CreateEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, + CreateEntryWhileInitializingCorruptedFailure) { + CorruptDiskCache(); + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::ERR_FAILED, + CreateEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, OpenEntryCorruptedFailure) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, + OpenEntryCorruptedFailureWhileInitializing) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::ERR_FAILED, OpenEntry(disk_cache.get(), kTestKey).net_error()); +} + +TEST_F(SharedDictionaryDiskCacheTest, DoomEntryCorruptedFailure) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::ERR_FAILED, DoomEntry(disk_cache.get(), kTestKey)); +} + +TEST_F(SharedDictionaryDiskCacheTest, + DoomEntryCorruptedFailureWhileInitializing) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::ERR_FAILED, DoomEntry(disk_cache.get(), kTestKey)); +} + +TEST_F(SharedDictionaryDiskCacheTest, ClearAllCorruptedFailure) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + FlushCacheTasks(); + EXPECT_EQ(net::ERR_FAILED, ClearAll(disk_cache.get())); +} + +TEST_F(SharedDictionaryDiskCacheTest, + ClearAllCorruptedFailureWhileInitializing) { + CorruptDiskCache(); + + std::unique_ptr<SharedDictionaryDiskCache> disk_cache = CreateDiskCache(); + EXPECT_EQ(net::ERR_FAILED, ClearAll(disk_cache.get())); +} + +#endif // !BUILDFLAG(IS_FUCHSIA) + +} // namespace network
diff --git a/services/network/test/mock_devtools_observer.h b/services/network/test/mock_devtools_observer.h index 5d86eaa..5264abd9 100644 --- a/services/network/test/mock_devtools_observer.h +++ b/services/network/test/mock_devtools_observer.h
@@ -17,6 +17,7 @@ #include "services/network/public/mojom/http_raw_headers.mojom-forward.h" #include "services/network/public/mojom/ip_address_space.mojom-forward.h" #include "testing/gmock/include/gmock/gmock.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace network { @@ -179,7 +180,7 @@ absl::optional<::url::Origin> initiator_origin; mojom::ClientSecurityStatePtr client_security_state; GURL url; - network::CorsErrorStatus status; + absl::optional<network::CorsErrorStatus> status; bool is_warning = false; };
diff --git a/testing/buildbot/PRESUBMIT.py b/testing/buildbot/PRESUBMIT.py index e987086..be24cc0 100644 --- a/testing/buildbot/PRESUBMIT.py +++ b/testing/buildbot/PRESUBMIT.py
@@ -74,3 +74,27 @@ kwargs={}, message=output_api.PresubmitError), ]) + + +# TODO(gbeaty) pinpoint runs builds against revisions that aren't tip-of-tree, +# so recipe side config can't be updated to refer to +# //infra/config/generated/testing/gn_isolate_map.pyl until all of the revisions +# that pinpoint will run against have that file. To workaround this, we'll copy +# the generated file to //testing/buildbot/gn_isiolate_map.pyl. Once pinpoint is +# only building revisions that contain +# //infra/config/generated/testing/gn_isolate_map.pyl, the recipe configs can be +# updated and we can remove this presubmit check, +# //testing/buildbot/gn_isiolate_map.pyl and +# //infra/config/scripts/sync-isolate-map.py. +def CheckGnIsolateMapPylSynced(input_api, output_api): + if ('testing/buildbot/gn_isolate_map.pyl' in input_api.change.LocalPaths() + and 'infra/config/generated/testing/gn_isolate_map.pyl' + not in input_api.change.LocalPaths()): + return [ + output_api.PresubmitError( + '//testing/buildbot/gn_isolate_map.pyl should not be edited' + ' manually, instead modify //infra/config/targets/targets.star,' + ' run //infra/config/main.star and run' + ' //infra/config/scripts/sync-isolate-map.py') + ] + return []
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 7cb0696..bcdada6 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -9388,7 +9388,6 @@ }, { "args": [ - "--gtest_filter=-*WebSocket*", "--platform", "iPad Pro (12.9-inch) (3rd generation)", "--version", @@ -9440,7 +9439,6 @@ }, { "args": [ - "--gtest_filter=-*WebSocket*", "--platform", "iPhone X", "--version",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 0e08f2fa..b0a284e 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -2172,7 +2172,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -2206,7 +2206,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -2564,7 +2564,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -3041,7 +3041,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -3350,7 +3350,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -3749,7 +3749,7 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "os": "Ubuntu-18.04" + "os": "Ubuntu-22.04" } ], "idempotent": false,
diff --git a/testing/buildbot/chromium.rust.json b/testing/buildbot/chromium.rust.json index 0faa92c..de2db9a 100644 --- a/testing/buildbot/chromium.rust.json +++ b/testing/buildbot/chromium.rust.json
@@ -42,6 +42,44 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -128,6 +166,44 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -214,6 +290,44 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "device_os": "PQ3A.190801.002", + "device_os_flavor": "google", + "device_type": "walleye", + "os": "Android" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -263,7 +377,8 @@ "additional_compile_targets": [ "gnrt_unittests", "mojo_rust", - "mojo_rust_tests", + "mojo_rust_integration_unittests", + "mojo_rust_unittests", "rust_build_tests" ], "gtest_tests": [ @@ -312,6 +427,38 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -368,24 +515,6 @@ }, "test": "build_rust_tests", "test_id_prefix": "ninja://build/rust/tests:build_rust_tests/" - }, - { - "isolate_name": "mojo_rust_tests", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_rust_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_rust_tests", - "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_tests/" } ] }, @@ -393,7 +522,8 @@ "additional_compile_targets": [ "gnrt_unittests", "mojo_rust", - "mojo_rust_tests", + "mojo_rust_integration_unittests", + "mojo_rust_unittests", "rust_build_tests" ], "gtest_tests": [ @@ -442,6 +572,38 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -498,24 +660,6 @@ }, "test": "build_rust_tests", "test_id_prefix": "ninja://build/rust/tests:build_rust_tests/" - }, - { - "isolate_name": "mojo_rust_tests", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_rust_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_rust_tests", - "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_tests/" } ] }, @@ -523,7 +667,8 @@ "additional_compile_targets": [ "gnrt_unittests", "mojo_rust", - "mojo_rust_tests", + "mojo_rust_integration_unittests", + "mojo_rust_unittests", "rust_build_tests" ], "gtest_tests": [ @@ -647,6 +792,88 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "args": [ + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--xctest" + ], + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:5468d28877d7106d8ab4f7e23b784578ffc86aff" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "args": [ + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14c18", + "--xctest" + ], + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:5468d28877d7106d8ab4f7e23b784578ffc86aff" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14c18", + "path": "Xcode.app" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -778,49 +1005,6 @@ }, "test": "build_rust_tests", "test_id_prefix": "ninja://build/rust/tests:build_rust_tests/" - }, - { - "args": [ - "--out-dir", - "${ISOLATED_OUTDIR}", - "--xcode-build-version", - "14c18", - "--xctest" - ], - "isolate_name": "mojo_rust_tests", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_rust_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/mac_toolchain/${platform}", - "location": ".", - "revision": "git_revision:5468d28877d7106d8ab4f7e23b784578ffc86aff" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Mac-12" - } - ], - "named_caches": [ - { - "name": "xcode_ios_14c18", - "path": "Xcode.app" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_rust_tests", - "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_tests/" } ] }, @@ -828,7 +1012,8 @@ "additional_compile_targets": [ "gnrt_unittests", "mojo_rust", - "mojo_rust_tests", + "mojo_rust_integration_unittests", + "mojo_rust_unittests", "rust_build_tests" ], "gtest_tests": [ @@ -880,6 +1065,40 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -939,25 +1158,6 @@ }, "test": "build_rust_tests", "test_id_prefix": "ninja://build/rust/tests:build_rust_tests/" - }, - { - "isolate_name": "mojo_rust_tests", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_rust_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_rust_tests", - "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_tests/" } ] }, @@ -965,7 +1165,8 @@ "additional_compile_targets": [ "gnrt_unittests", "mojo_rust", - "mojo_rust_tests", + "mojo_rust_integration_unittests", + "mojo_rust_unittests", "rust_build_tests" ], "gtest_tests": [ @@ -1017,6 +1218,40 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, + "test": "mojo_rust_integration_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_integration_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_rust_unittests", + "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_unittests/" + }, + { + "merge": { + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, "test": "rust_gtest_interop_unittests", "test_id_prefix": "ninja://testing/rust_gtest_interop:rust_gtest_interop_unittests/" }, @@ -1076,25 +1311,6 @@ }, "test": "build_rust_tests", "test_id_prefix": "ninja://build/rust/tests:build_rust_tests/" - }, - { - "isolate_name": "mojo_rust_tests", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "mojo_rust_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Windows-10" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_rust_tests", - "test_id_prefix": "ninja://mojo/public/rust:mojo_rust_tests/" } ] }
diff --git a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter index 8801ce1c..093593a 100644 --- a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter +++ b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
@@ -11,11 +11,13 @@ DesksTemplatesClientLacrosTest* Dictation* ExtensionKeeplistTest* +NonKioskAcceleratorLacrosTest* SelectToSpeak* SwitchAccess* VpnExtensionObserverBrowserTest* WebAppsCrosapiBrowserTest* WebAppProviderBridgeBrowserTest* +WebKioskAcceleratorLacrosTest* WebKioskAshRequiresLacrosTest* # TODO(b/262789941) Enable more accessibility tests. -ChromeVoxBackgroundTest.TabSwitchAndRefreshRecovery @@ -106,3 +108,15 @@ -ChromeVoxBackgroundTest.NavigationEscapesEdit -ChromeVoxBackgroundTest.NavigationIgnoresLabels -ChromeVoxEditingTest.NonbreakingSpaceNewLineOrSpace +-ChromeVoxEditingTest.MoveByWordSuggestions +-ChromeVoxTutorialTest.ResourcesTest +-ChromeVoxBackgroundTest.EarconsForControls +-ChromeVoxBackgroundTest.NavigationIgnoresDescriptions +-ChromeVoxBackgroundTest.NavigationEscapesEdit +-ChromeVoxBackgroundTest.NavigationIgnoresLabels +-ChromeVoxEditingTest.NonbreakingSpaceNewLineOrSpace +# TODO(crbug.com/1432222): Flaky +-DictationE2ETest.SilencesSpokenFeedbackWhenStarting +-DictationUIE2ETest.HintsTimeoutWithChromeVox +# TODO(b/262789941): Flaky +-MagnifierE2ETest.IgnoresRootNodeFocus
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 60dd35f..06c2644 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1,79 +1,8 @@ -# Copyright 2015 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is a .pyl, or "Python Literal", file. You can treat it just like a -# .json file, with the following exceptions: -# * all keys must be quoted (use single quotes, please); -# * comments are allowed, using '#' syntax; and -# * trailing commas are allowed. - -# gn_isolate_map.pyl - A mapping of Ninja build target names to GN labels and -# test type classifications for the tests that are run on the bots. -# -# This mapping is used by MB so that we can uniformly refer to test binaries -# by their Ninja target names in the recipes and not need to worry about how -# they are referred to in GN or GYP specifically (the GYP target name is pretty -# much always the same as the Ninja target name, since GYP target names are not -# hierarchical). -# -# TODO(crbug.com/816629): Remove the need for this file altogether :). Also, -# see below. -# -# The "label" field specifies the matching GN label for the given ninja -# target. -# -# The "type" field is used to determine what the command line for the test -# needs to be; valid values are: -# -# "windowed_test_launcher" -# : the test is a gtest-based test that uses the parallelizing TestLauncher -# from //base/test:test_support and needs to run under Xvfb if run on -# some platforms (eg. Linux Desktop and Ozone CrOS). -# "console_test_launcher" -# : the test is a gtest-based test that uses the parallelizing TestLauncher -# from //base/test:test_support but does not need Xvfb. -# "additional_compile_target" -# : this isn't actually a test, but we still need a mapping from the -# ninja target to the GN label in order to analyze it. -# "junit_test" -# : this is a JUnit test. -# "script" -# : the test is a python script; the path to the script is specified in -# the "script" field. -# "generated_script" -# : the test is a script generated at build time; the script *must* be -# in output_dir/bin/run_$target (or output_dir\bin\run_$target.bat on -# Windows). -# "unknown" -# : (the default), which indicates that we don't know what the command line -# needs to be (this is a fatal error). - -# The optional "executable" field can be used to override the name -# of the binary to run. If the field is not specified, the binary -# name will be assumed to be the same as the ninja build target name. -# On Windows, ".exe" will be automatically appended if need be, so -# the executable name (and target name) should not contain an ".exe". -# -# The optional "args" field may be specified for "windowed_test_launcher", -# "console_test_launcher", and "script"-type tests, and can be used to -# append extra command line args onto the command line determined by the -# "type". If not specified, it defaults to an empty list (no extra args). -# -# The optional "label_type" field can be used in conjunction with -# "type" == "console_test_launcher" or "type" == "windowed_test_launcher" -# to indicate that even though the command line -# to use follows the test_launcher patterns, the actual GN label refers -# to a different type of thing (usually a "group") and so MB can find -# the generated runtime files in the right place. This is used, for -# example, in content_site_isolation_browsertests . -# -# The optional "script" field is used when "type" == "script", and -# specifies the GN path to the corresponding python file, e.g. -# "//testing/scripts/foo.py". -# -# The optional "skip_usage_check" field indicates that we should skip the check -# that the target is used in at least one buildbot json file. +# THIS IS A GENERATED FILE DO NOT EDIT!!! +# Instead: +# 1. Modify //infra/config/targets/targets.star +# 2. Run //infra/config/main.star +# 3. Run //infra/config/scripts/sync-isolate-map.py { "All_syzygy": { @@ -209,6 +138,10 @@ "type": "generated_script", }, "base_perftests": { + "label": "//base:base_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "base_perftests", "--non-telemetry=true", @@ -216,10 +149,6 @@ "--test-launcher-jobs=1", "--test-launcher-retry-limit=0", ], - "label": "//base:base_perftests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "base_unittests": { "label": "//base:base_unittests", @@ -247,8 +176,8 @@ }, "blink_pytype": { "label": "//third_party/blink/tools:blink_pytype", - "script": "//third_party/blink/tools/run_pytype.py", "type": "script", + "script": "//third_party/blink/tools/run_pytype.py", }, "blink_tests": { "label": "//:blink_tests", @@ -298,12 +227,6 @@ "label": "//chrome/test:browser_tests", "type": "windowed_test_launcher", }, - # TODO(b/246519185) - Py3 incompatible, decide if to keep test. - #"browser_tests_apprtc": { - # "label": "//chrome/test:browser_tests_apprtc", - # "type": "windowed_test_launcher", - # "executable": "browser_tests", - # }, "build_junit_tests": { "label": "//build/android:build_junit_tests", "type": "generated_script", @@ -312,7 +235,7 @@ "label": "//chrome/test:captured_sites_interactive_tests", "type": "windowed_test_launcher", "args": [ - '--disable-extensions', + "--disable-extensions", ], }, "capture_unittests": { @@ -331,7 +254,7 @@ "label": "//fuchsia_web/runners:cast_runner_integration_tests", "type": "console_test_launcher", }, - "cast_runner_pkg":{ + "cast_runner_pkg": { "label": "//fuchsia_web/runners:cast_runner_pkg", "type": "additional_compile_target", }, @@ -428,11 +351,11 @@ }, "chrome_java_test_pagecontroller_junit_tests": { "label": "//chrome/test/android:chrome_java_test_pagecontroller_junit_tests", - "type": "generated_script" + "type": "generated_script", }, "chrome_java_test_pagecontroller_tests": { "label": "//chrome/test/android:chrome_java_test_pagecontroller_tests", - "type": "console_test_launcher" + "type": "console_test_launcher", }, "chrome_java_test_wpr_tests": { "label": "//chrome/test/android:chrome_java_test_wpr_tests", @@ -470,7 +393,6 @@ "label": "//chrome/android:chrome_public_smoke_test", "type": "console_test_launcher", }, - # TODO(crbug.com/1238057): Rename to chrome_public_integration_test_apk "chrome_public_test_apk": { "label": "//chrome/android:chrome_public_test_apk", "type": "console_test_launcher", @@ -508,15 +430,15 @@ "type": "additional_compile_target", }, "chromedriver_py_tests": { + "label": "//chrome/test/chromedriver:chromedriver_py_tests", + "type": "script", + "script": "//testing/xvfb.py", "args": [ "../../testing/scripts/run_chromedriver_tests.py", "../../chrome/test/chromedriver/test/run_py_tests.py", "--chromedriver=chromedriver", "--log-path=${ISOLATED_OUTDIR}/chromedriver.log", ], - "label": "//chrome/test/chromedriver:chromedriver_py_tests", - "script": "//testing/xvfb.py", - "type": "script", }, "chrome_variations_tast_tests": { "label": "//chromeos:chrome_variations_tast_tests", @@ -579,8 +501,8 @@ }, "chromedriver_replay_unittests": { "label": "//chrome/test/chromedriver:chromedriver_replay_unittests", - "script": "//chrome/test/chromedriver/log_replay/client_replay_unittest.py", "type": "script", + "script": "//chrome/test/chromedriver/log_replay/client_replay_unittest.py", }, "chromedriver_unittests": { "label": "//chrome/test/chromedriver:chromedriver_unittests", @@ -611,15 +533,15 @@ "type": "console_test_launcher", }, "command_buffer_perftests": { + "label": "//gpu:command_buffer_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "command_buffer_perftests", "--non-telemetry=true", "--adb-path", "src/third_party/android_sdk/public/platform-tools/adb", ], - "label": "//gpu:command_buffer_perftests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "components/media_router/common/providers/cast/channel": { "label": "//components/media_router/common/providers/cast/channel:cast_channel", @@ -666,14 +588,14 @@ "type": "generated_script", }, "components_perftests": { + "label": "//components:components_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "--xvfb", "--non-telemetry=true", "components_perftests", ], - "label": "//components:components_perftests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "components_unittests": { "label": "//components:components_unittests", @@ -697,8 +619,8 @@ }, "content_shell_crash_test": { "label": "//content/shell:content_shell_crash_test", - "script": "//testing/scripts/content_shell_crash_test.py", "type": "script", + "script": "//testing/scripts/content_shell_crash_test.py", }, "content_shell_test_apk": { "label": "//content/shell/android:content_shell_test_apk", @@ -781,6 +703,9 @@ "type": "windowed_test_launcher", }, "dawn_perf_tests": { + "label": "//third_party/dawn/src/dawn/tests:dawn_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "dawn_perf_tests", "--non-telemetry=true", @@ -788,9 +713,6 @@ "--test-launcher-jobs=1", "--test-launcher-retry-limit=0", ], - "label": "//third_party/dawn/src/dawn/tests:dawn_perf_tests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "dbus_unittests": { "label": "//dbus:dbus_unittests", @@ -853,13 +775,13 @@ }, "flatbuffers_unittests": { "label": "//third_party/flatbuffers:flatbuffers_unittests", - "script": "//testing/scripts/run_flatbuffers_unittests.py", "type": "script", + "script": "//testing/scripts/run_flatbuffers_unittests.py", }, "fuchsia_pytype": { "label": "//testing:fuchsia_pytype", - "script": "//build/fuchsia/test/run_pytype.py", "type": "script", + "script": "//build/fuchsia/test/run_pytype.py", }, "fuchsia_sizes": { "label": "//tools/fuchsia/size_tests:fuchsia_sizes", @@ -886,7 +808,6 @@ "type": "console_test_launcher", }, "gl_tests": { - "args": [], "label": "//gpu:gl_tests", "type": "windowed_test_launcher", }, @@ -895,10 +816,10 @@ "type": "windowed_test_launcher", }, "gl_unittests_ozone": { - "executable": "gl_unittests", "label": "//ui/gl:gl_unittests_ozone", "label_type": "group", "type": "windowed_test_launcher", + "executable": "gl_unittests", }, "gles2_conform_test": { "label": "//gpu/gles2_conform_support:gles2_conform_test", @@ -910,41 +831,41 @@ }, "gold_common_pytype": { "label": "//build:gold_common_pytype", - "script": "//build/skia_gold_common/run_pytype.py", "type": "script", + "script": "//build/skia_gold_common/run_pytype.py", }, "google_apis_unittests": { "label": "//google_apis:google_apis_unittests", "type": "console_test_launcher", }, "gpu_perftests": { + "label": "//gpu:gpu_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "gpu_perftests", "--non-telemetry=true", "--adb-path", "src/third_party/android_sdk/public/platform-tools/adb", ], - "label": "//gpu:gpu_perftests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "gpu_pytype": { "label": "//content/test:gpu_pytype", - "script": "//content/test/gpu/run_pytype.py", "type": "script", + "script": "//content/test/gpu/run_pytype.py", }, "gpu_unittests": { "label": "//gpu:gpu_unittests", "type": "windowed_test_launcher", }, "grit_python_unittests": { + "label": "//tools/grit:grit_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", "args": [ "../../tools/grit/grit/test_suite_all.py", ], - "label": "//tools/grit:grit_python_unittests", - "script": "//testing/scripts/run_isolated_script_test.py", - "type": "script", }, "gwp_asan_unittests": { "label": "//components/gwp_asan:gwp_asan_unittests", @@ -967,11 +888,11 @@ "type": "console_test_launcher", }, "interactive_ui_tests": { + "label": "//chrome/test:interactive_ui_tests", + "type": "windowed_test_launcher", "args": [ "--snapshot-output-dir=${ISOLATED_OUTDIR}", ], - "label": "//chrome/test:interactive_ui_tests", - "type": "windowed_test_launcher", }, "ios/chrome/app:chrome": { "label": "//ios/chrome/app:chrome", @@ -1131,7 +1052,7 @@ "--logs-dir=${ISOLATED_OUTDIR}", ], }, - "lacros_variations_tast_tests" : { + "lacros_variations_tast_tests": { "label": "//chromeos/lacros:lacros_variations_tast_tests", "type": "generated_script", "args": [ @@ -1159,15 +1080,15 @@ "type": "additional_compile_target", }, "load_library_perf_tests": { + "label": "//chrome/test:load_library_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "load_library_perf_tests", "--non-telemetry=true", "--test-launcher-print-test-stdio=always", ], - "label": "//chrome/test:load_library_perf_tests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "mac_signing_tests": { "label": "//chrome/installer/mac:mac_signing_tests", @@ -1178,6 +1099,10 @@ "type": "generated_script", }, "media_perftests": { + "label": "//media:media_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "media_perftests", "--non-telemetry=true", @@ -1185,19 +1110,15 @@ "--test-launcher-retry-limit=0", "--isolated-script-test-filter=*::-*_unoptimized::*_unaligned::*unoptimized_aligned", ], - "label": "//media:media_perftests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "media_router_e2e_tests": { + "label": "//chrome/test/media_router:media_router_e2e_tests", + "type": "script", + "script": "//chrome/test/media_router/internal/media_router_tests.py", "args": [ "--test_binary", "./interactive_ui_tests", ], - "label": "//chrome/test/media_router:media_router_e2e_tests", - "script": "//chrome/test/media_router/internal/media_router_tests.py", - "type": "script", }, "media_unittests": { "label": "//media:media_unittests", @@ -1220,13 +1141,13 @@ "type": "additional_compile_target", }, "mini_installer_tests": { + "label": "//chrome/test/mini_installer:mini_installer_tests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", "args": [ "../../chrome/test/mini_installer/run_mini_installer_tests.py", "--output-dir=${ISOLATED_OUTDIR}", ], - "label": "//chrome/test/mini_installer:mini_installer_tests", - "script": "//testing/scripts/run_isolated_script_test.py", - "type": "script", }, "module_installer_junit_tests": { "label": "//components/module_installer/android:module_installer_junit_tests", @@ -1241,22 +1162,24 @@ "type": "console_test_launcher", }, "mojo_python_unittests": { + "label": "//mojo/public/tools:mojo_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", "args": [ "../../mojo/public/tools/run_all_python_unittests.py", ], - "label": "//mojo/public/tools:mojo_python_unittests", - "script": "//testing/scripts/run_isolated_script_test.py", - "type": "script", }, "mojo_rust": { "label": "//mojo/public/rust:mojo_rust", - # Since we can't build rust tests on Android now, add this for build - # coverage. "type": "additional_compile_target", }, - "mojo_rust_tests": { - "label": "//mojo/public/rust:mojo_rust_tests", - "type": "generated_script", + "mojo_rust_integration_unittests": { + "label": "//mojo/public/rust:mojo_rust_integration_unittests", + "type": "console_test_launcher", + }, + "mojo_rust_unittests": { + "label": "//mojo/public/rust:mojo_rust_unittests", + "type": "console_test_launcher", }, "mojo_test_apk": { "label": "//mojo/public/java/system:mojo_test_apk", @@ -1267,6 +1190,9 @@ "type": "console_test_launcher", }, "monochrome_public_apk_checker": { + "label": "//chrome/android/monochrome:monochrome_public_apk_checker", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", "args": [ "../../chrome/android/monochrome/scripts/monochrome_python_tests.py", "--chrome-apk", @@ -1282,9 +1208,6 @@ "--monochrome-pathmap", "apks/MonochromePublic.apk.pathmap.txt", ], - "label": "//chrome/android/monochrome:monochrome_public_apk_checker", - "script": "//testing/scripts/run_isolated_script_test.py", - "type": "script", }, "monochrome_public_test_ar_apk": { "label": "//chrome/android:monochrome_public_test_ar_apk", @@ -1296,13 +1219,13 @@ }, "nacl_helper": { "label": "//components/nacl/loader:nacl_helper", - "skip_usage_check": True, "type": "additional_compile_target", + "skip_usage_check": True, }, "nacl_helper_bootstrap": { "label": "//native_client/src/trusted/service_runtime/linux:bootstrap", - "skip_usage_check": True, "type": "additional_compile_target", + "skip_usage_check": True, }, "nacl_loader_unittests": { "label": "//components/nacl/loader:nacl_loader_unittests", @@ -1321,14 +1244,14 @@ "type": "generated_script", }, "net_perftests": { + "label": "//net:net_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "net_perftests", "--non-telemetry=true", ], - "label": "//net:net_perftests", - "script": "//testing/scripts/run_performance_tests.py", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "type": "script", }, "net_unittests": { "label": "//net:net_unittests", @@ -1383,6 +1306,10 @@ "type": "console_test_launcher", }, "performance_browser_tests": { + "label": "//chrome/test:performance_browser_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "browser_tests", "--non-telemetry=true", @@ -1390,17 +1317,11 @@ "--test-launcher-jobs=1", "--test-launcher-retry-limit=0", "--test-launcher-print-test-stdio=always", - # Allow the full performance runs to take up to 60 seconds (rather than - # the default of 30 for normal CQ browser test runs). "--ui-test-action-timeout=60000", "--ui-test-action-max-timeout=60000", "--test-launcher-timeout=60000", "--gtest_filter=*/TabCapturePerformanceTest.*:*/CastV2PerformanceTest.*", ], - "label": "//chrome/test:performance_browser_tests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "performance_test_suite": { "label": "//chrome/test:performance_test_suite", @@ -1435,15 +1356,18 @@ "type": "generated_script", }, "performance_web_engine_test_suite": { + "label": "//content/test:performance_web_engine_test_suite", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "../../content/test/gpu/run_telemetry_benchmark_fuchsia.py", "--per-test-logs-dir", ], - "label": "//content/test:performance_web_engine_test_suite", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "performance_webview_test_suite": { + "label": "//chrome/test:performance_webview_test_suite", + "type": "script", + "script": "//third_party/catapult/devil/devil/android/tools/system_app.py", "args": [ "remove", "--package", @@ -1454,17 +1378,14 @@ "../../testing/scripts/run_performance_tests.py", "../../tools/perf/run_benchmark", ], - "label": "//chrome/test:performance_webview_test_suite", - "script": "//third_party/catapult/devil/devil/android/tools/system_app.py", - "type": "script", }, "polymer_tools_python_unittests": { + "label": "//tools/polymer:polymer_tools_python_unittests", + "type": "script", + "script": "//testing/scripts/run_isolated_script_test.py", "args": [ "../../tools/polymer/run_polymer_tools_tests.py", ], - "label": "//tools/polymer:polymer_tools_python_unittests", - "script": "//testing/scripts/run_isolated_script_test.py", - "type": "script", }, "postmortem-metadata": { "label": "//v8:postmortem-metadata", @@ -1472,7 +1393,7 @@ }, "power_sampler_unittests": { "label": "//tools/mac/power:power_sampler_unittests", - "type": "console_test_launcher", + "type": "console_test_launcher", }, "ppapi_unittests": { "label": "//ppapi:ppapi_unittests", @@ -1585,7 +1506,6 @@ "shell_dialogs_unittests": { "label": "//ui/shell_dialogs:shell_dialogs_unittests", "type": "console_test_launcher", - # These tests are more like dialog interactive ui tests. "args": [ "--test-launcher-jobs=1", ], @@ -1619,17 +1539,17 @@ "type": "windowed_test_launcher", }, "sync_performance_tests": { - "args": [ - "sync_performance_tests", - "--non-telemetry=true", - "--test-launcher-print-test-stdio=always", - "--test-launcher-jobs=1", - "--test-launcher-retry-limit=0", - ], - "label": "//chrome/test:sync_performance_tests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", + "label": "//chrome/test:sync_performance_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, + "args": [ + "sync_performance_tests", + "--non-telemetry=true", + "--test-launcher-print-test-stdio=always", + "--test-launcher-jobs=1", + "--test-launcher-retry-limit=0", + ], }, "system_webview_apk": { "label": "//android_webview:system_webview_apk", @@ -1648,103 +1568,99 @@ "type": "generated_script", }, "telemetry_gpu_integration_test": { + "label": "//chrome/test:telemetry_gpu_integration_test", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", "args": [ "../../content/test/gpu/run_gpu_integration_test.py", ], - "label": "//chrome/test:telemetry_gpu_integration_test", - "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", - "type": "script", }, "telemetry_gpu_integration_test_android_chrome": { + "label": "//chrome/test:telemetry_gpu_integration_test_android_chrome", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", "args": [ "../../content/test/gpu/run_gpu_integration_test.py", ], - "label": "//chrome/test:telemetry_gpu_integration_test_android_chrome", - "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", - "type": "script", }, "telemetry_gpu_integration_test_android_webview": { + "label": "//chrome/test:telemetry_gpu_integration_test_android_webview", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", "args": [ "../../content/test/gpu/run_gpu_integration_test.py", ], - "label": "//chrome/test:telemetry_gpu_integration_test_android_webview", - "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", - "type": "script", }, "telemetry_gpu_integration_test_fuchsia": { + "label": "//chrome/test:telemetry_gpu_integration_test_fuchsia", + "type": "script", + "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", "args": [ "../../content/test/gpu/run_gpu_integration_test_fuchsia.py", "--logs-dir", "${ISOLATED_OUTDIR}", ], - "label": "//chrome/test:telemetry_gpu_integration_test_fuchsia", - "script": "//testing/scripts/run_gpu_integration_test_as_googletest.py", - "type": "script", }, "telemetry_gpu_integration_test_scripts_only": { "label": "//chrome/test:telemetry_gpu_integration_test_scripts_only", "type": "additional_compile_target", }, "telemetry_gpu_unittests": { + "label": "//chrome/test:telemetry_gpu_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", "args": [ "../../content/test/gpu/run_unittests.py", "-v", ], - "label": "//chrome/test:telemetry_gpu_unittests", - "script": "//testing/scripts/run_telemetry_as_googletest.py", - "type": "script", }, - # This isolate is used by - # https://www.chromium.org/developers/cluster-telemetry "ct_telemetry_perf_tests_without_chrome": { + "label": "//chrome/test:ct_telemetry_perf_tests_without_chrome", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "../../tools/perf/run_benchmark", ], - "label": "//chrome/test:ct_telemetry_perf_tests_without_chrome", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "telemetry_perf_unittests": { + "label": "//chrome/test:telemetry_perf_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", "args": [ "../../tools/perf/run_tests", "-v", ], - "label": "//chrome/test:telemetry_perf_unittests", - "script": "//testing/scripts/run_telemetry_as_googletest.py", - "type": "script", }, "telemetry_perf_unittests_android_chrome": { + "label": "//chrome/test:telemetry_perf_unittests_android_chrome", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", "args": [ "../../tools/perf/run_tests", "-v", ], - "label": "//chrome/test:telemetry_perf_unittests_android_chrome", - "script": "//testing/scripts/run_telemetry_as_googletest.py", - "type": "script", }, "telemetry_perf_unittests_android_monochrome": { + "label": "//chrome/test:telemetry_perf_unittests_android_monochrome", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", "args": [ "../../tools/perf/run_tests", "-v", ], - "label": "//chrome/test:telemetry_perf_unittests_android_monochrome", - "script": "//testing/scripts/run_telemetry_as_googletest.py", - "type": "script", }, "telemetry_unittests": { + "label": "//chrome/test:telemetry_unittests", + "type": "script", + "script": "//testing/scripts/run_telemetry_as_googletest.py", "args": [ "--xvfb", "../../tools/perf/run_telemetry_tests", "-v", - # TODO(nedn, eyaich): Remove this flag once crbug.com/549140 is fixed & - # Telemetry no longer downloads files in parallel. (crbug.com/661434#c24) "--jobs=1", "--chrome-root", "../../", ], - "label": "//chrome/test:telemetry_unittests", - "script": "//testing/scripts/run_telemetry_as_googletest.py", - "type": "script", }, "test_cpp_including_rust_unittests": { "label": "//build/rust/tests/test_cpp_including_rust:test_cpp_including_rust_unittests", @@ -1754,12 +1670,6 @@ "label": "//build/rust/tests/test_serde_json_lenient:test_serde_json_lenient", "type": "console_test_launcher", }, - # TODO(crbug.com/1080749): Re-add this once the test is fixed and re-enabled. - # "test_buildbucket_api_gpu_use_cases": { - # "label": "//content/test:test_buildbucket_api_gpu_use_cases", - # "script": "//testing/scripts/test_buildbucket_api_gpu_use_cases.py", - # "type": "script", - # }, "touch_to_fill_junit_tests": { "label": "//chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests", "type": "generated_script", @@ -1769,6 +1679,10 @@ "type": "additional_compile_target", }, "tracing_perftests": { + "label": "//components/tracing:tracing_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", + "skip_usage_check": True, "args": [ "tracing_perftests", "--non-telemetry=true", @@ -1776,10 +1690,6 @@ "--adb-path", "src/third_party/android_sdk/public/platform-tools/adb", ], - "label": "//components/tracing:tracing_perftests", - "skip_usage_check": True, # Used by Pinpoint: crbug.com/1042778 - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "traffic_annotation_auditor_dependencies": { "label": "//:traffic_annotation_auditor_dependencies", @@ -1811,18 +1721,13 @@ }, "testing_pytype": { "label": "//testing:testing_pytype", - "script": "//testing/run_pytype.py", "type": "script", + "script": "//testing/run_pytype.py", }, "unit_tests": { "label": "//chrome/test:unit_tests", "type": "windowed_test_launcher", }, - # The test action timeouts for `updater_tests`, `updater_tests_system`, and - # `updater_tests_win_uac` are based on empirical observations of test - # runtimes, 2021-07. The launcher timeout was 90000 but then we increased - # the value to 180000 to work around an unfixable issue in the Windows - # COM runtime class activation crbug.com/1259178. "updater_tests": { "label": "//chrome/updater:updater_tests", "type": "console_test_launcher", @@ -1888,14 +1793,14 @@ "type": "windowed_test_launcher", }, "views_perftests": { + "label": "//ui/views:views_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "--xvfb", "--non-telemetry=true", "views_perftests", ], - "label": "//ui/views:views_perftests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "views_unittests": { "label": "//ui/views:views_unittests", @@ -1910,35 +1815,35 @@ "type": "console_test_launcher", }, "vr_common_perftests": { + "label": "//chrome/browser/vr:vr_common_perftests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "vr_common_perftests", "--non-telemetry=true", "--adb-path", "src/third_party/android_sdk/public/platform-tools/adb", ], - "label": "//chrome/browser/vr:vr_common_perftests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "vr_common_unittests": { "label": "//chrome/browser/vr:vr_common_unittests", "type": "console_test_launcher", }, "vr_perf_tests": { + "label": "//tools/perf/contrib/vr_benchmarks:vr_perf_tests", + "type": "script", + "script": "//testing/scripts/run_performance_tests.py", "args": [ "../../tools/perf/run_benchmark", ], - "label": "//tools/perf/contrib/vr_benchmarks:vr_perf_tests", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", }, "vrcore_fps_test": { + "label": "//chrome/test/vr/perf:vrcore_fps_test", + "type": "script", + "script": "//chrome/test/vr/perf/vrcore_fps/run_vrcore_fps_test.py", "args": [ "-v", ], - "label": "//chrome/test/vr/perf:vrcore_fps_test", - "script": "//chrome/test/vr/perf/vrcore_fps/run_vrcore_fps_test.py", - "type": "script", }, "vulkan_tests": { "label": "//gpu/vulkan:vulkan_tests", @@ -1993,6 +1898,9 @@ "type": "windowed_test_launcher", }, "webview_cts_tests": { + "label": "//android_webview/test:webview_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", "args": [ "--skip-expected-failures", "--use-webview-provider", @@ -2002,11 +1910,11 @@ "--use-apk-under-test-flags-file", "-v", ], - "label": "//android_webview/test:webview_cts_tests", - "script": "//android_webview/tools/run_cts.py", - "type": "script", }, "webview_trichrome_cts_tests": { + "label": "//android_webview/test:webview_trichrome_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", "args": [ "--skip-expected-failures", "--additional-apk", @@ -2018,11 +1926,11 @@ "--use-apk-under-test-flags-file", "-v", ], - "label": "//android_webview/test:webview_trichrome_cts_tests", - "script": "//android_webview/tools/run_cts.py", - "type": "script", }, "webview_trichrome_64_cts_tests": { + "label": "//android_webview/test:webview_trichrome_64_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", "args": [ "--skip-expected-failures", "--additional-apk", @@ -2034,11 +1942,11 @@ "--use-apk-under-test-flags-file", "-v", ], - "label": "//android_webview/test:webview_trichrome_64_cts_tests", - "script": "//android_webview/tools/run_cts.py", - "type": "script", }, "webview_64_cts_tests": { + "label": "//android_webview/test:webview_64_cts_tests", + "type": "script", + "script": "//android_webview/tools/run_cts.py", "args": [ "--skip-expected-failures", "--use-webview-provider", @@ -2048,9 +1956,6 @@ "--use-apk-under-test-flags-file", "-v", ], - "label": "//android_webview/test:webview_64_cts_tests", - "script": "//android_webview/tools/run_cts.py", - "type": "script", }, "webengine_support_instrumentation_test_apk": { "label": "//weblayer/browser/android/javatests:webengine_support_instrumentation_test_apk", @@ -2065,11 +1970,11 @@ "type": "console_test_launcher", }, "webview_ui_test_app_test_apk": { + "label": "//android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk", + "type": "console_test_launcher", "args": [ "--use-apk-under-test-flags-file", ], - "label": "//android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk", - "type": "console_test_launcher", }, "wm_unittests": { "label": "//ui/wm:wm_unittests", @@ -2081,17 +1986,14 @@ }, "xr_browser_tests": { "label": "//chrome/test:xr_browser_tests", - # We can't use the "script" type since we need to be run from the output - # directory (or at least given the path). Thus, we need to tell mb.py to not - # automatically append the .exe suffix on Windows. "type": "windowed_test_launcher", "executable": "run_xr_browser_tests.py", "executable_suffix": "", "args": [ - '--enable-gpu', - '--test-launcher-bot-mode', - '--test-launcher-jobs=1', - '--enable-pixel-output-in-tests', + "--enable-gpu", + "--test-launcher-bot-mode", + "--test-launcher-jobs=1", + "--enable-pixel-output-in-tests", ], }, "zlib_unittests": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 05acfeb5..af94686 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -636,6 +636,12 @@ "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw", ], 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], 'shards': 10, }, }, @@ -1738,6 +1744,16 @@ 'shards': 2, }, }, + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], + }, + }, # https://crbug.com/1344223 'Mac10.13 Tests': { 'swarming': { @@ -1841,6 +1857,16 @@ 'shards': 30, }, }, + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], + }, + }, 'Mac ASan 64 Tests (1)': { # https://crbug.com/1200640 'experiment_percentage': 100, }, @@ -2752,6 +2778,16 @@ 'shards': 32, # Adjusted for testing, see https://crbug.com/1179567 }, }, + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], + }, + }, # https://crbug.com/1192997 'Linux Tests (Wayland)': { 'args': [ @@ -3657,6 +3693,16 @@ 'shards': 6, }, }, + 'Linux Tests': { + 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], + }, + }, 'Mac ASan 64 Tests (1)': { 'swarming': { 'shards': 3, @@ -3790,6 +3836,14 @@ '--xvfb', '--jobs=1', ], + 'swarming': { + 'dimension_sets': [ + { + # TODO(crbug.com/1412588): Remove when Jammy is the default. + 'os': 'Ubuntu-22.04', + }, + ], + }, }, 'Linux Tests (dbg)(1)': { 'args': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 476e1396..82648a3 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -3804,11 +3804,7 @@ 'media_unittests': {}, 'midi_unittests': {}, 'mojo_unittests': {}, - 'net_unittests': { - 'args': [ - '--gtest_filter=-*WebSocket*', - ], - }, + 'net_unittests': {}, 'perfetto_unittests': {}, 'services_unittests': {}, 'shell_dialogs_unittests': {}, @@ -4734,6 +4730,8 @@ # Rust tests run on all targets. 'rust_common_gtests': { 'base_unittests': {}, + 'mojo_rust_integration_unittests': {}, + 'mojo_rust_unittests': {}, 'rust_gtest_interop_unittests': {}, 'test_cpp_including_rust_unittests': { 'swarming': {}, @@ -4750,10 +4748,6 @@ 'swarming': {}, 'test': 'build_rust_tests', }, - 'mojo_rust_tests': { - 'swarming': {}, - 'test': 'mojo_rust_tests', - }, }, # Some Rust-related tooling is itself written in Rust. These tools are only
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index eed32f1..bc1dd9c 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -5652,7 +5652,8 @@ 'additional_compile_targets': [ 'gnrt_unittests', 'mojo_rust', - 'mojo_rust_tests', + 'mojo_rust_integration_unittests', + 'mojo_rust_unittests', 'rust_build_tests', ], 'mixins': [ @@ -5667,7 +5668,8 @@ 'additional_compile_targets': [ 'gnrt_unittests', 'mojo_rust', - 'mojo_rust_tests', + 'mojo_rust_integration_unittests', + 'mojo_rust_unittests', 'rust_build_tests', ], 'mixins': [ @@ -5682,7 +5684,8 @@ 'additional_compile_targets': [ 'gnrt_unittests', 'mojo_rust', - 'mojo_rust_tests', + 'mojo_rust_integration_unittests', + 'mojo_rust_unittests', 'rust_build_tests', ], 'mixins': [ @@ -5702,7 +5705,8 @@ 'additional_compile_targets': [ 'gnrt_unittests', 'mojo_rust', - 'mojo_rust_tests', + 'mojo_rust_integration_unittests', + 'mojo_rust_unittests', 'rust_build_tests', ], 'mixins': [ @@ -5718,7 +5722,8 @@ 'additional_compile_targets': [ 'gnrt_unittests', 'mojo_rust', - 'mojo_rust_tests', + 'mojo_rust_integration_unittests', + 'mojo_rust_unittests', 'rust_build_tests', ], 'mixins': [
diff --git a/testing/test.gni b/testing/test.gni index 0ead1a80..ea121c36 100644 --- a/testing/test.gni +++ b/testing/test.gni
@@ -64,6 +64,13 @@ template("mixed_test") { assert(defined(invoker.target_type) && invoker.target_type != "") + # The crate_root variable would transform the target into a Rust binary + # which is incorrect. To not use a generated crate root set: + # ``` + # test_crate_root = "path/to/root.rs" + # ``` + assert(!defined(invoker.crate_root)) + _rs_vars = [ "sources", # We split this list into two. "crate_name", # Android test template overrides the crate name. @@ -108,20 +115,22 @@ rust_static_library(_rust_target_name) { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY + [ + "allow_unsafe", "deps", + "generate_crate_root", "public_deps", ]) configs += [ "//build/rust:test" ] - generate_crate_root = true + if (defined(invoker.test_crate_root)) { + crate_root = invoker.test_crate_root + } else { + generate_crate_root = true + } sources = _rs_sources + if (_gtest_is_in_deps) { deps += [ "//testing/rust_gtest_interop" ] } - - # Inform the build system that this library contains gtest unit tests. - # They must not be discarded by the linker even though there will be no - # edges going into them. - is_gtest_unittests = true } } else { not_needed(invoker, _rs_vars) @@ -134,9 +143,36 @@ if (!defined(deps)) { deps = [] } + if (!defined(ldflags)) { + ldflags = [] + } + if (_rs_sources != []) { deps += [ ":${_rust_target_name}" ] } + + if (current_os != "aix" && !is_win) { + # Inform the build system that this binary contains Rust unit tests. The + # test-containing rlibs linked into it must not be discarded by the linker + # even if there will be no edges going into them. + # + # For C++ this is done by not putting them in a library at all, but Rust + # must be compiled into an rlib. + # + # On AIX there's no flag to avoid pruning unit tests in this library from + # the linking step. On Windows, there's no need for it. + if (_rs_sources != []) { + ldflags += + [ "-LinkWrapper,add-whole-archive=${_rust_target_name}.rlib" ] + } + + # Do the same for any Rust dependencies with unit tests in them. This will + # only match rust targets by looking for rlib extensions. + foreach(d, deps) { + _dep_target_name = get_label_info(d, "name") + ldflags += [ "-LinkWrapper,add-whole-archive=${_dep_target_name}.rlib" ] + } + } } }
diff --git a/testing/unexpected_passes_common/expectations.py b/testing/unexpected_passes_common/expectations.py index 6b789b82e..cd853ca 100644 --- a/testing/unexpected_passes_common/expectations.py +++ b/testing/unexpected_passes_common/expectations.py
@@ -994,6 +994,16 @@ break if any(annotation in stripped_line for annotation in ALL_FINDER_START_ANNOTATION_BASES): + # If we've already found a starting annotation, skip past this line. + # This is to handle the case of nested annotations, e.g. a + # disable-narrowing block inside of a group block. We'll find the + # inner-most block here and remove it. Any outer blocks will be + # removed as part of the lingering stale annotation removal later on. + # If we don't skip past these outer annotations, then we get left with + # orphaned trailing annotations. + if found_starting_annotation: + comment_line_number -= 1 + continue found_starting_annotation = True # If we found a starting annotation but not a trailing annotation, we # shouldn't remove the starting one, as that would cause the trailing
diff --git a/testing/unexpected_passes_common/expectations_unittest.py b/testing/unexpected_passes_common/expectations_unittest.py index faf5a02..9d81300 100755 --- a/testing/unexpected_passes_common/expectations_unittest.py +++ b/testing/unexpected_passes_common/expectations_unittest.py
@@ -660,6 +660,45 @@ with open(self.filename) as f: self.assertEqual(f.read(), expected_contents) + def testNestedGroupAndNarrowingAllRemovable(self): + """Tests that a disable block within a group can be properly removed.""" + contents = self.header + """ +crbug.com/2345 [ win ] baz/test [ Failure ] + +# Description +# finder:group-start name +# finder:disable-narrowing +crbug.com/1234 [ win ] foo/test [ Failure ] +crbug.com/1234 [ win ] bar/test [ Failure ] +# finder:enable-narrowing +# finder:group-end + +crbug.com/3456 [ linux ] foo/test [ Failure ] +""" + + stale_expectations = [ + data_types.Expectation('foo/test', ['win'], ['Failure'], + 'crbug.com/1234'), + data_types.Expectation('bar/test', ['win'], ['Failure'], + 'crbug.com/1234'), + ] + + expected_contents = self.header + """ +crbug.com/2345 [ win ] baz/test [ Failure ] + + +crbug.com/3456 [ linux ] foo/test [ Failure ] +""" + + with open(self.filename, 'w') as f: + f.write(contents) + + removed_urls = self.instance.RemoveExpectationsFromFile( + stale_expectations, self.filename, expectations.RemovalType.STALE) + self.assertEqual(removed_urls, set(['crbug.com/1234'])) + with open(self.filename) as f: + self.assertEqual(f.read(), expected_contents) + def testGroupBlockNotAllRemovable(self): """Tests that a group with not all members removable is not removed.""" contents = self.header + """
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index a592a45a..e5c51d40 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -2189,21 +2189,6 @@ ] } ], - "CacheIsNavigationSameSite": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CacheIsNavigationSameSite" - ] - } - ] - } - ], "CacheMacSandboxProfiles": [ { "platforms": [ @@ -8226,6 +8211,21 @@ ] } ], + "MojoDirectSharedMemoryAndroid": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MojoDirectSharedMemoryAndroid" + ] + } + ] + } + ], "MojoInlineMessagePayloads": [ { "platforms": [ @@ -10686,30 +10686,6 @@ ] } ], - "RasterTilePriorityQueue": [ - { - "platforms": [ - "android_weblayer", - "android_webview", - "android", - "chromeos", - "chromeos_lacros", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "RasterTilePriorityQueue" - ] - } - ] - } - ], "RawDrawAndDrDc": [ { "platforms": [ @@ -10746,6 +10722,27 @@ ] } ], + "ReadingListEnableDualReadingListModel": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ReadingListEnableDualReadingListModel" + ] + } + ] + } + ], "RecordPermissionExpirationTimestamps": [ { "platforms": [ @@ -12334,6 +12331,29 @@ ] } ], + "SupportPartitionedBlobUrlKillSwitchDisabled": [ + { + "platforms": [ + "android", + "android_weblayer", + "android_webview", + "chromeos", + "chromeos_lacros", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_2023-03-30", + "enable_features": [ + "SupportPartitionedBlobUrl" + ] + } + ] + } + ], "SuppressToolbarCaptures": [ { "platforms": [ @@ -15019,6 +15039,21 @@ ] } ], + "WebViewZoomKeyboardShortcuts": [ + { + "platforms": [ + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "WebViewZoomKeyboardShortcuts" + ] + } + ] + } + ], "Win10UnattendedDefault": [ { "platforms": [
diff --git a/third_party/abseil-cpp/.github/PULL_REQUEST_TEMPLATE.md b/third_party/abseil-cpp/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..ff55e352 --- /dev/null +++ b/third_party/abseil-cpp/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,8 @@ +Thank you for your contribution to Abseil! + +Before submitting this PR, please be sure to read our [contributing +guidelines](https://github.com/abseil/abseil-cpp/blob/master/CONTRIBUTING.md). + +If you are a Googler, please also note that it is required that you send us a +Piper CL instead of using the GitHub pull-request process. The code propagation +process will deliver the change to GitHub.
diff --git a/third_party/abseil-cpp/CONTRIBUTING.md b/third_party/abseil-cpp/CONTRIBUTING.md index 9dadae9..a87254c 100644 --- a/third_party/abseil-cpp/CONTRIBUTING.md +++ b/third_party/abseil-cpp/CONTRIBUTING.md
@@ -75,9 +75,9 @@ ## Guidelines for Pull Requests -* If you are a Googler, it is preferable to first create an internal CL and - have it reviewed and submitted. The code propagation process will deliver - the change to GitHub. +* If you are a Googler, it is required that you send us a Piper CL instead of + using the GitHub pull-request process. The code propagation process will + deliver the change to GitHub. * Create **small PRs** that are narrowly focused on **addressing a single concern**. We often receive PRs that are trying to fix several things at a
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium index 0acf9b6..34a7298 100644 --- a/third_party/abseil-cpp/README.chromium +++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@ License: Apache 2.0 License File: LICENSE Version: 0 -Revision: d7228036ab2a191462c532b914a99c3a8d10a171 +Revision: 5ad663b790c02c7fe11085f6ebc5e284e4432733 Security Critical: yes Description:
diff --git a/third_party/abseil-cpp/absl/base/attributes.h b/third_party/abseil-cpp/absl/base/attributes.h index a6572d0..df2c458f 100644 --- a/third_party/abseil-cpp/absl/base/attributes.h +++ b/third_party/abseil-cpp/absl/base/attributes.h
@@ -211,11 +211,20 @@ // out of bounds or does other scary things with memory. // NOTE: GCC supports AddressSanitizer(asan) since 4.8. // https://gcc.gnu.org/gcc-4.8/changes.html -#if ABSL_HAVE_ATTRIBUTE(no_sanitize_address) +#if defined(ABSL_HAVE_ADDRESS_SANITIZER) && \ + ABSL_HAVE_ATTRIBUTE(no_sanitize_address) #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address)) -#elif defined(_MSC_VER) && _MSC_VER >= 1928 +#elif defined(ABSL_HAVE_ADDRESS_SANITIZER) && defined(_MSC_VER) && \ + _MSC_VER >= 1928 // https://docs.microsoft.com/en-us/cpp/cpp/no-sanitize-address #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS __declspec(no_sanitize_address) +#elif defined(ABSL_HAVE_HWADDRESS_SANITIZER) && ABSL_HAVE_ATTRIBUTE(no_sanitize) +// HWAddressSanitizer is a sanitizer similar to AddressSanitizer, which uses CPU +// features to detect similar bugs with less CPU and memory overhead. +// NOTE: GCC supports HWAddressSanitizer(hwasan) since 11. +// https://gcc.gnu.org/gcc-11/changes.html +#define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS \ + __attribute__((no_sanitize("hwaddress"))) #else #define ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS #endif
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h index 36327ad..9c3289a7 100644 --- a/third_party/abseil-cpp/absl/container/inlined_vector.h +++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -217,20 +217,12 @@ absl::allocator_is_nothrow<allocator_type>::value || std::is_nothrow_move_constructible<value_type>::value) : storage_(other.storage_.GetAllocator()) { - // Fast path: if the value type can be trivally move constructed and - // destroyed, and we know the allocator doesn't do anything fancy, then it's - // safe for us to simply adopt the contents of the storage for `other` and - // remove its own reference to them. It's as if we had individually + // Fast path: if the value type can be trivially relocated (i.e. moved from + // and destroyed), and we know the allocator doesn't do anything fancy, then + // it's safe for us to simply adopt the contents of the storage for `other` + // and remove its own reference to them. It's as if we had individually // move-constructed each value and then destroyed the original. - // - // TODO(b/274984172): a move construction followed by destroying the source - // is a "relocation" in the language of P1144R4. So actually the minimum - // condition we need here (in addition to the allocator) is "trivially - // relocatable". Relaxing this would allow using memcpy with types like - // std::unique_ptr that opt in to declaring themselves trivially relocatable - // despite not being trivially move-constructible and/oror destructible. - if (absl::is_trivially_move_constructible<value_type>::value && - absl::is_trivially_destructible<value_type>::value && + if (absl::is_trivially_relocatable<value_type>::value && std::is_same<A, std::allocator<value_type>>::value) { storage_.MemcpyFrom(other.storage_); other.storage_.SetInlinedSize(0); @@ -271,20 +263,12 @@ const allocator_type& allocator) noexcept(absl::allocator_is_nothrow<allocator_type>::value) : storage_(allocator) { - // Fast path: if the value type can be trivally move constructed and - // destroyed and we know the allocator doesn't do anything fancy, then it's - // safe for us to simply adopt the contents of the storage for `other` and - // remove its own reference to them. It's as if we had individually + // Fast path: if the value type can be trivially relocated (i.e. moved from + // and destroyed), and we know the allocator doesn't do anything fancy, then + // it's safe for us to simply adopt the contents of the storage for `other` + // and remove its own reference to them. It's as if we had individually // move-constructed each value and then destroyed the original. - // - // TODO(b/274984172): a move construction followed by destroying the source - // is a "relocation" in the language of P1144R4. So actually the minimum - // condition we need here (in addition to the allocator) is "trivially - // relocatable". Relaxing this would allow using memcpy with types like - // std::unique_ptr that opt in to declaring themselves trivially relocatable - // despite not being trivially move-constructible and/oror destructible. - if (absl::is_trivially_move_constructible<value_type>::value && - absl::is_trivially_destructible<value_type>::value && + if (absl::is_trivially_relocatable<value_type>::value && std::is_same<A, std::allocator<value_type>>::value) { storage_.MemcpyFrom(other.storage_); other.storage_.SetInlinedSize(0);
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h index 4e6284242..451fb19 100644 --- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -301,25 +301,14 @@ struct ElementwiseConstructPolicy {}; using MoveAssignmentPolicy = absl::conditional_t< - // Fast path: if the value type can be trivally move assigned and + // Fast path: if the value type can be trivially move assigned and // destroyed, and we know the allocator doesn't do anything fancy, then // it's safe for us to simply adopt the contents of the storage for // `other` and remove its own reference to them. It's as if we had // individually move-assigned each value and then destroyed the original. - // - // TODO(b/274984172): we check for copy-assignability here only for - // historical reasons. This is too strict: we are simulating move - // assignment here. - // - // TODO(b/274984172): the condition on copy-constructibility is here only - // for historical reasons. It doesn't make semantic sense: we don't need - // to be able to copy construct here, we are doing an "as-if" move - // assignment. - absl::conjunction< - absl::is_trivially_copy_assignable<ValueType<A>>, - absl::is_trivially_destructible<ValueType<A>>, - std::is_same<A, std::allocator<ValueType<A>>>, - absl::is_trivially_copy_constructible<ValueType<A>>>::value, + absl::conjunction<absl::is_trivially_move_assignable<ValueType<A>>, + absl::is_trivially_destructible<ValueType<A>>, + std::is_same<A, std::allocator<ValueType<A>>>>::value, MemcpyPolicy, // Otherwise we use move assignment if possible. If not, we simulate // move assignment using move construction. @@ -332,17 +321,13 @@ // The policy to be used specifically when swapping inlined elements. using SwapInlinedElementsPolicy = absl::conditional_t< - // Fast path: if the value type can be trivally move constructed/assigned + // Fast path: if the value type can be trivially move constructed/assigned // and destroyed, and we know the allocator doesn't do anything fancy, // then it's safe for us to simply swap the bytes in the inline storage. // It's as if we had move-constructed a temporary vector, move-assigned // one to the other, then move-assigned the first from the temporary. - // - // TODO(b/274984172): we check for copy-constructability and - // -assignability here only for historical reasons. This is too strict: we - // are simulating move operations here. - absl::conjunction<absl::is_trivially_copy_constructible<ValueType<A>>, - absl::is_trivially_copy_assignable<ValueType<A>>, + absl::conjunction<absl::is_trivially_move_constructible<ValueType<A>>, + absl::is_trivially_move_assignable<ValueType<A>>, absl::is_trivially_destructible<ValueType<A>>, std::is_same<A, std::allocator<ValueType<A>>>>::value, MemcpyPolicy, @@ -505,8 +490,10 @@ // we know the allocator doesn't do anything fancy, and one of the following // holds: // - // * It's possible to trivially move construct/assign the elements and - // then destroy the source. + // * The elements are trivially relocatable. + // + // * It's possible to trivially assign the elements and then destroy the + // source. // // * It's possible to trivially copy construct/assign the elements. // @@ -517,10 +504,11 @@ (std::is_same<A, std::allocator<V>>::value && ( // First case above - ((absl::is_trivially_move_constructible<V>::value || - absl::is_trivially_move_assignable<V>::value) && - absl::is_trivially_destructible<V>::value) || + absl::is_trivially_relocatable<V>::value || // Second case above + (absl::is_trivially_move_assignable<V>::value && + absl::is_trivially_destructible<V>::value) || + // Third case above (absl::is_trivially_copy_constructible<V>::value || absl::is_trivially_copy_assignable<V>::value)))); } @@ -607,18 +595,8 @@ // Fast path: if the value type is trivially copy constructible and we know // the allocator doesn't do anything fancy, then we know it is legal for us to // simply memcpy the other vector's elements. - // - // TODO(b/274984172): the condition on copy-assignability is here only for - // historical reasons. It doesn't make semantic sense: we don't need to be - // able to copy assign here, we are doing an "as-if" copy construction. - // - // TODO(b/274984172): the condition on trivial destructibility is here only - // for historical reasons. It doesn't make sense: there is no destruction - // here. if (absl::is_trivially_copy_constructible<ValueType<A>>::value && - std::is_same<A, std::allocator<ValueType<A>>>::value && - absl::is_trivially_copy_assignable<ValueType<A>>::value && - absl::is_trivially_destructible<ValueType<A>>::value) { + std::is_same<A, std::allocator<ValueType<A>>>::value) { std::memcpy(reinterpret_cast<char*>(dst), reinterpret_cast<const char*>(src), n * sizeof(ValueType<A>)); } else {
diff --git a/third_party/abseil-cpp/absl/flags/internal/parse.h b/third_party/abseil-cpp/absl/flags/internal/parse.h index e435204..10c531b 100644 --- a/third_party/abseil-cpp/absl/flags/internal/parse.h +++ b/third_party/abseil-cpp/absl/flags/internal/parse.h
@@ -16,6 +16,8 @@ #ifndef ABSL_FLAGS_INTERNAL_PARSE_H_ #define ABSL_FLAGS_INTERNAL_PARSE_H_ +#include <iostream> +#include <ostream> #include <string> #include <vector> @@ -40,9 +42,15 @@ kAbortIfUndefined }; -std::vector<char*> ParseCommandLineImpl(int argc, char* argv[], - UsageFlagsAction usage_flag_action, - OnUndefinedFlag undef_flag_action); +// This is not a public interface. This interface exists to expose the ability +// to change help output stream in case of parsing errors. This is used by +// internal unit tests to validate expected outputs. +// When this was written, `EXPECT_EXIT` only supported matchers on stderr, +// but not on stdout. +std::vector<char*> ParseCommandLineImpl( + int argc, char* argv[], UsageFlagsAction usage_flag_action, + OnUndefinedFlag undef_flag_action, + std::ostream& error_help_output = std::cout); // -------------------------------------------------------------------- // Inspect original command line
diff --git a/third_party/abseil-cpp/absl/flags/parse.cc b/third_party/abseil-cpp/absl/flags/parse.cc index d3609c13..172fe901 100644 --- a/third_party/abseil-cpp/absl/flags/parse.cc +++ b/third_party/abseil-cpp/absl/flags/parse.cc
@@ -22,6 +22,7 @@ #include <cstdlib> #include <fstream> #include <iostream> +#include <ostream> #include <string> #include <tuple> #include <utility> @@ -693,7 +694,8 @@ std::vector<char*> ParseCommandLineImpl(int argc, char* argv[], UsageFlagsAction usage_flag_action, - OnUndefinedFlag undef_flag_action) { + OnUndefinedFlag undef_flag_action, + std::ostream& error_help_output) { std::vector<char*> positional_args; std::vector<UnrecognizedFlag> unrecognized_flags; @@ -707,8 +709,8 @@ if (undef_flag_action == OnUndefinedFlag::kAbortIfUndefined) { if (!unrecognized_flags.empty()) { - flags_internal::HandleUsageFlags(std::cerr, ProgramUsageMessage()); - std::exit(1); + flags_internal::HandleUsageFlags(error_help_output, + ProgramUsageMessage()); std::exit(1); } } }
diff --git a/third_party/abseil-cpp/absl/flags/parse_test.cc b/third_party/abseil-cpp/absl/flags/parse_test.cc index f3987bb..cd32efc 100644 --- a/third_party/abseil-cpp/absl/flags/parse_test.cc +++ b/third_party/abseil-cpp/absl/flags/parse_test.cc
@@ -18,6 +18,7 @@ #include <stdlib.h> #include <fstream> +#include <iostream> #include <string> #include <vector> @@ -235,7 +236,9 @@ namespace { namespace flags = absl::flags_internal; +using testing::AllOf; using testing::ElementsAreArray; +using testing::HasSubstr; class ParseTest : public testing::Test { public: @@ -271,6 +274,15 @@ // -------------------------------------------------------------------- template <int N> +std::vector<char*> InvokeParseCommandLineImpl(const char* (&in_argv)[N]) { + return flags::ParseCommandLineImpl( + N, const_cast<char**>(in_argv), flags::UsageFlagsAction::kHandleUsage, + flags::OnUndefinedFlag::kAbortIfUndefined, std::cerr); +} + +// -------------------------------------------------------------------- + +template <int N> std::vector<char*> InvokeParse(const char* (&in_argv)[N]) { return absl::ParseCommandLine(N, const_cast<char**>(in_argv)); } @@ -1066,8 +1078,9 @@ "--help=int_flag", }; - EXPECT_DEATH_IF_SUPPORTED(InvokeParse(in_args), - "Try --helpfull to get a list of all flags"); + EXPECT_EXIT(InvokeParseCommandLineImpl(in_args), testing::ExitedWithCode(1), + AllOf(HasSubstr("Unknown command line flag 'undef_flag1'"), + HasSubstr("Try --helpfull to get a list of all flags"))); } // --------------------------------------------------------------------
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable.h b/third_party/abseil-cpp/absl/functional/any_invocable.h index 3e783c8..68d8825 100644 --- a/third_party/abseil-cpp/absl/functional/any_invocable.h +++ b/third_party/abseil-cpp/absl/functional/any_invocable.h
@@ -266,9 +266,17 @@ // Exchanges the targets of `*this` and `other`. void swap(AnyInvocable& other) noexcept { std::swap(*this, other); } - // abl::AnyInvocable::operator bool() + // absl::AnyInvocable::operator bool() // // Returns `true` if `*this` is not empty. + // + // WARNING: An `AnyInvocable` that wraps an empty `std::function` is not + // itself empty. This behavior is consistent with the standard equivalent + // `std::move_only_function`. + // + // In other words: + // std::function<void()> f; // empty + // absl::AnyInvocable<void()> a = std::move(f); // not empty explicit operator bool() const noexcept { return this->HasValue(); } // Invokes the target object of `*this`. `*this` must not be empty.
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc index 2e485097..bfbf282 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +++ b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc
@@ -14,6 +14,10 @@ #include "absl/synchronization/internal/kernel_timeout.h" +#ifndef _WIN32 +#include <sys/types.h> +#endif + #include <algorithm> #include <chrono> // NOLINT(build/c++11) #include <cstdint> @@ -101,7 +105,7 @@ return kMaxNanos; } - int64_t nanos = RawNanos(); + int64_t nanos = RawAbsNanos(); if (is_relative_timeout()) { // We need to change epochs, because the relative timeout might be @@ -128,7 +132,7 @@ return kMaxNanos; } - int64_t nanos = RawNanos(); + int64_t nanos = RawAbsNanos(); if (is_absolute_timeout()) { return std::max<int64_t>(nanos - absl::GetCurrentTimeNanos(), 0); } @@ -143,6 +147,33 @@ return absl::ToTimespec(absl::Nanoseconds(InNanosecondsFromNow())); } +#ifndef _WIN32 +struct timespec KernelTimeout::MakeClockAbsoluteTimespec(clockid_t c) const { + if (!has_timeout()) { + return absl::ToTimespec(absl::Nanoseconds(kMaxNanos)); + } + + int64_t nanos = RawAbsNanos(); + if (is_absolute_timeout()) { + nanos -= absl::GetCurrentTimeNanos(); + } else { + nanos -= SteadyClockNow(); + } + + struct timespec now; + ABSL_RAW_CHECK(clock_gettime(c, &now) == 0, "clock_gettime() failed"); + absl::Duration from_clock_epoch = + absl::DurationFromTimespec(now) + absl::Nanoseconds(nanos); + if (from_clock_epoch <= absl::ZeroDuration()) { + // Some callers have assumed that 0 means no timeout, so instead we return a + // time of 1 nanosecond after the epoch. For safety we also do not return + // negative values. + return absl::ToTimespec(absl::Nanoseconds(1)); + } + return absl::ToTimespec(from_clock_epoch); +} +#endif + KernelTimeout::DWord KernelTimeout::InMillisecondsFromNow() const { constexpr DWord kInfinite = std::numeric_limits<DWord>::max();
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h index 952bd2c..4e361a6a 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +++ b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h
@@ -15,6 +15,10 @@ #ifndef ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_ #define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_ +#ifndef _WIN32 +#include <sys/types.h> +#endif + #include <algorithm> #include <chrono> // NOLINT(build/c++11) #include <cstdint> @@ -78,6 +82,18 @@ // this method in the case of a spurious wakeup. struct timespec MakeRelativeTimespec() const; +#ifndef _WIN32 + // Convert to `struct timespec` for interfaces that expect an absolute timeout + // on a specific clock `c`. This is similar to `MakeAbsTimespec()`, but + // callers usually want to use this method with `CLOCK_MONOTONIC` when + // relative timeouts are requested, and when the appropriate interface expects + // an absolute timeout relative to a specific clock (for example, + // pthread_cond_clockwait() or sem_clockwait()). If !has_timeout(), attempts + // to convert to a reasonable absolute timeout, but callers should to test + // has_timeout() prefer to use a more appropriate interface. + struct timespec MakeClockAbsoluteTimespec(clockid_t c) const; +#endif + // Convert to unix epoch nanos for interfaces that expect an absolute timeout // in nanoseconds. If !has_timeout() or is_relative_timeout(), attempts to // convert to a reasonable absolute timeout, but callers should to test @@ -125,12 +141,18 @@ // after the unix epoch. // - If the low bit is 1, then the high 63 bits is the number of nanoseconds // after the epoch used by SteadyClockNow(). + // + // In all cases the time is stored as an absolute time, the only difference is + // the clock epoch. The use of absolute times is important since in the case + // of a relative timeout with a spurious wakeup, the program would have to + // restart the wait, and thus needs a way of recomputing the remaining time. uint64_t rep_; // Returns the number of nanoseconds stored in the internal representation. - // Together with is_absolute_timeout() and is_relative_timeout(), the return - // value is used to compute when the timeout should occur. - int64_t RawNanos() const { return static_cast<int64_t>(rep_ >> 1); } + // When combined with the clock epoch indicated by the low bit (which is + // accessed through is_absolute_timeout() and is_relative_timeout()), the + // return value is used to compute when the timeout should occur. + int64_t RawAbsNanos() const { return static_cast<int64_t>(rep_ >> 1); } // Converts to nanoseconds from now. Since the return value is a relative // duration, it should be recomputed by calling this method in the case of a
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc index 26ee34a..c853c4bc 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +++ b/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc
@@ -64,6 +64,13 @@ EXPECT_TRUE(t.is_absolute_timeout()); EXPECT_FALSE(t.is_relative_timeout()); EXPECT_EQ(absl::TimeFromTimespec(t.MakeAbsTimespec()), when); +#ifndef _WIN32 + EXPECT_LE( + absl::AbsDuration(absl::Now() + duration - + absl::TimeFromTimespec( + t.MakeClockAbsoluteTimespec(CLOCK_REALTIME))), + absl::Milliseconds(10)); +#endif EXPECT_LE( absl::AbsDuration(absl::DurationFromTimespec(t.MakeRelativeTimespec()) - std::max(duration, absl::ZeroDuration())), @@ -89,6 +96,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -110,6 +121,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -131,6 +146,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -152,6 +171,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -170,6 +193,10 @@ EXPECT_FALSE(t.is_relative_timeout()); EXPECT_LE(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::FromUnixNanos(1)); +#ifndef _WIN32 + EXPECT_LE(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::FromUnixSeconds(1)); +#endif EXPECT_EQ(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::ZeroDuration()); EXPECT_LE(absl::FromUnixNanos(t.MakeAbsNanos()), absl::FromUnixNanos(1)); @@ -200,6 +227,13 @@ EXPECT_LE(absl::AbsDuration(absl::Now() + duration - absl::TimeFromTimespec(t.MakeAbsTimespec())), absl::Milliseconds(5)); +#ifndef _WIN32 + EXPECT_LE( + absl::AbsDuration(absl::Now() + duration - + absl::TimeFromTimespec( + t.MakeClockAbsoluteTimespec(CLOCK_REALTIME))), + absl::Milliseconds(5)); +#endif EXPECT_LE( absl::AbsDuration(absl::DurationFromTimespec(t.MakeRelativeTimespec()) - duration), @@ -241,6 +275,12 @@ EXPECT_LE(absl::AbsDuration(absl::Now() - absl::TimeFromTimespec(t.MakeAbsTimespec())), absl::Milliseconds(5)); +#ifndef _WIN32 + EXPECT_LE(absl::AbsDuration(absl::Now() - absl::TimeFromTimespec( + t.MakeClockAbsoluteTimespec( + CLOCK_REALTIME))), + absl::Milliseconds(5)); +#endif EXPECT_EQ(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::ZeroDuration()); EXPECT_LE( @@ -263,6 +303,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -284,6 +328,10 @@ // absl::InfiniteFuture(), but we should return a very large value. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()), @@ -305,6 +353,10 @@ // Timeouts should still be far in the future. EXPECT_GT(absl::TimeFromTimespec(t.MakeAbsTimespec()), absl::Now() + absl::Hours(100000)); +#ifndef _WIN32 + EXPECT_GT(absl::TimeFromTimespec(t.MakeClockAbsoluteTimespec(CLOCK_REALTIME)), + absl::Now() + absl::Hours(100000)); +#endif EXPECT_GT(absl::DurationFromTimespec(t.MakeRelativeTimespec()), absl::Hours(100000)); EXPECT_GT(absl::FromUnixNanos(t.MakeAbsNanos()),
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc b/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc index 5258782..8d90cc4 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +++ b/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc
@@ -20,6 +20,7 @@ #include <sys/time.h> #include <unistd.h> +#include <cassert> #include <cerrno> #include "absl/base/config.h" @@ -73,12 +74,44 @@ } } -bool PthreadWaiter::Wait(KernelTimeout t) { - struct timespec abs_timeout; - if (t.has_timeout()) { - abs_timeout = t.MakeAbsTimespec(); +#ifdef __APPLE__ +#define ABSL_INTERNAL_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP 1 +#endif + +#if defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30)) +#define ABSL_INTERNAL_HAVE_PTHREAD_COND_CLOCKWAIT 1 +#endif + +// Calls pthread_cond_timedwait() or possibly something else like +// pthread_cond_timedwait_relative_np() depending on the platform and +// KernelTimeout requested. The return value is the same as the return +// value of pthread_cond_timedwait(). +int PthreadWaiter::TimedWait(KernelTimeout t) { +#ifndef __GOOGLE_GRTE_VERSION__ + constexpr bool kRelativeTimeoutSupported = true; +#else + constexpr bool kRelativeTimeoutSupported = false; +#endif + + assert(t.has_timeout()); + if (kRelativeTimeoutSupported && t.is_relative_timeout()) { +#ifdef ABSL_INTERNAL_HAS_PTHREAD_COND_TIMEDWAIT_RELATIVE_NP + const auto rel_timeout = t.MakeRelativeTimespec(); + return pthread_cond_timedwait_relative_np(&cv_, &mu_, &rel_timeout); +#elif defined(ABSL_INTERNAL_HAVE_PTHREAD_COND_CLOCKWAIT) && \ + defined(CLOCK_MONOTONIC) + const auto abs_clock_timeout = t.MakeClockAbsoluteTimespec(CLOCK_MONOTONIC); + return pthread_cond_clockwait(&cv_, &mu_, CLOCK_MONOTONIC, + &abs_clock_timeout); +#endif } + const auto abs_timeout = t.MakeAbsTimespec(); + return pthread_cond_timedwait(&cv_, &mu_, &abs_timeout); +} + +bool PthreadWaiter::Wait(KernelTimeout t) { PthreadMutexHolder h(&mu_); ++waiter_count_; // Loop until we find a wakeup to consume or timeout. @@ -94,13 +127,13 @@ ABSL_RAW_LOG(FATAL, "pthread_cond_wait failed: %d", err); } } else { - const int err = pthread_cond_timedwait(&cv_, &mu_, &abs_timeout); + const int err = TimedWait(t); if (err == ETIMEDOUT) { --waiter_count_; return false; } if (err != 0) { - ABSL_RAW_LOG(FATAL, "pthread_cond_timedwait failed: %d", err); + ABSL_RAW_LOG(FATAL, "PthreadWaiter::TimedWait() failed: %d", err); } } first_pass = false;
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h b/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h index a930a9e..206aefa4 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +++ b/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.h
@@ -40,6 +40,8 @@ static constexpr char kName[] = "PthreadWaiter"; private: + int TimedWait(KernelTimeout t); + // REQUIRES: mu_ must be held. void InternalCondVarPoke();
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc b/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc index 89af5de2..7dd27fb 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +++ b/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc
@@ -43,12 +43,34 @@ } } -bool SemWaiter::Wait(KernelTimeout t) { - struct timespec abs_timeout; - if (t.has_timeout()) { - abs_timeout = t.MakeAbsTimespec(); +#if defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 30)) +#define ABSL_INTERNAL_HAVE_SEM_CLOCKWAIT 1 +#endif + +// Calls sem_timedwait() or possibly something else like +// sem_clockwait() depending on the platform and +// KernelTimeout requested. The return value is the same as a call to the return +// value to a call to sem_timedwait(). +int SemWaiter::TimedWait(KernelTimeout t) { +#ifndef __GOOGLE_GRTE_VERSION__ + constexpr bool kRelativeTimeoutSupported = true; +#else + constexpr bool kRelativeTimeoutSupported = false; +#endif + + if (kRelativeTimeoutSupported && t.is_relative_timeout()) { +#if defined(ABSL_INTERNAL_HAVE_SEM_CLOCKWAIT) && defined(CLOCK_MONOTONIC) + const auto abs_clock_timeout = t.MakeClockAbsoluteTimespec(CLOCK_MONOTONIC); + return sem_clockwait(&sem_, CLOCK_MONOTONIC, &abs_clock_timeout); +#endif } + const auto abs_timeout = t.MakeAbsTimespec(); + return sem_timedwait(&sem_, &abs_timeout); +} + +bool SemWaiter::Wait(KernelTimeout t) { // Loop until we timeout or consume a wakeup. // Note that, since the thread ticker is just reset, we don't need to check // whether the thread is idle on the very first pass of the loop. @@ -73,10 +95,10 @@ if (errno == EINTR) continue; ABSL_RAW_LOG(FATAL, "sem_wait failed: %d", errno); } else { - if (sem_timedwait(&sem_, &abs_timeout) == 0) break; + if (TimedWait(t) == 0) break; if (errno == EINTR) continue; if (errno == ETIMEDOUT) return false; - ABSL_RAW_LOG(FATAL, "sem_timedwait failed: %d", errno); + ABSL_RAW_LOG(FATAL, "SemWaiter::TimedWait() failed: %d", errno); } } first_pass = false;
diff --git a/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h b/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h index 47d5bf3d..c22746f9 100644 --- a/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h +++ b/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.h
@@ -46,6 +46,8 @@ static constexpr char kName[] = "SemWaiter"; private: + int TimedWait(KernelTimeout t); + sem_t sem_; // This seems superfluous, but for Poke() we need to cause spurious
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index 240c4dc..0582220 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -2984,10 +2984,10 @@ ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NVstring_view@3@HH_N@Z ?PutTwoDigits@numbers_internal@absl@@YAX_KPEAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ - ?RawNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?Read1To3@MixingHashState@hash_internal@absl@@CAIPEBE_K@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index b0cc482..9037583 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -2984,10 +2984,10 @@ ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AEAAXPEAUHashtablezInfo@container_internal@3@@Z ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QEAA_NVstring_view@3@HH_N@Z ?PutTwoDigits@numbers_internal@absl@@YAX_KPEAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PEBDH1ZZ ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ - ?RawNanos@KernelTimeout@synchronization_internal@absl@@AEBA_JXZ ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?Read1To3@MixingHashState@hash_internal@absl@@CAIPEBE_K@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index fb9b6ba..07e0211c 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -2974,10 +2974,10 @@ ?PushNew@?$SampleRecorder@UHashtablezInfo@container_internal@absl@@@profiling_internal@absl@@AAEXPAUHashtablezInfo@container_internal@3@@Z ?PutPaddedString@FormatSinkImpl@str_format_internal@absl@@QAE_NVstring_view@3@HH_N@Z ?PutTwoDigits@numbers_internal@absl@@YAXIPAD@Z + ?RawAbsNanos@KernelTimeout@synchronization_internal@absl@@ABE_JXZ ?RawEnableLogPrefix@log_internal@absl@@YAX_N@Z ?RawLog@raw_log_internal@absl@@YAXW4LogSeverity@2@PBDH1ZZ ?RawLoggingFullySupported@raw_log_internal@absl@@YA_NXZ - ?RawNanos@KernelTimeout@synchronization_internal@absl@@ABE_JXZ ?RawSetMinLogLevel@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?RawSetStderrThreshold@log_internal@absl@@YAXW4LogSeverityAtLeast@2@@Z ?Read1To3@MixingHashState@hash_internal@absl@@CAIPBEI@Z
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 050b793..286ff369 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -988,6 +988,8 @@ // TODO(crbug.com/1197209): Adjust these limits in response to usage. const base::FeatureParam<int> kInterestGroupStorageMaxOwners{ &kInterestGroupStorage, "max_owners", 1000}; +const base::FeatureParam<int> kInterestGroupStorageMaxStoragePerOwner{ + &kInterestGroupStorage, "max_storage_per_owner", 10 * 1024 * 1024}; const base::FeatureParam<int> kInterestGroupStorageMaxGroupsPerOwner{ &kInterestGroupStorage, "max_groups_per_owner", 1000}; const base::FeatureParam<int> kInterestGroupStorageMaxOpsBeforeMaintenance{
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 3b1532f4..b17c255 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -426,6 +426,8 @@ BLINK_COMMON_EXPORT extern const base::FeatureParam<int> kInterestGroupStorageMaxOwners; BLINK_COMMON_EXPORT extern const base::FeatureParam<int> + kInterestGroupStorageMaxStoragePerOwner; +BLINK_COMMON_EXPORT extern const base::FeatureParam<int> kInterestGroupStorageMaxGroupsPerOwner; BLINK_COMMON_EXPORT extern const base::FeatureParam<int> kInterestGroupStorageMaxOpsBeforeMaintenance;
diff --git a/third_party/blink/public/common/interest_group/interest_group.h b/third_party/blink/public/common/interest_group/interest_group.h index 6520835..b3cf9de 100644 --- a/third_party/blink/public/common/interest_group/interest_group.h +++ b/third_party/blink/public/common/interest_group/interest_group.h
@@ -140,7 +140,8 @@ * bidder_worklet.cc (to pass the InterestGroup to generateBid()). In interest_group_storage.cc, add the new field and any respective indices, -and also add a new database version and migration, and migration test. +update `ClearExcessiveStorage()`, add a new database version and migration, and +migration test. If the new field is to be updatable via dailyUpdateUrl, also update *all* of these:
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 12d62b3..cfe1148 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -708,9 +708,6 @@ InvalidHeader InvalidRegisterTriggerHeader InvalidEligibleHeader - # TODO(crbug.com/1431942): Remove this issue once DevTools stops - # referencing it - TooManyConcurrentRequests SourceAndTriggerHeaders SourceIgnored TriggerIgnored
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index d13c02b..21ca9a1 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -1538,7 +1538,6 @@ "//third_party/blink/renderer/modules/indexeddb/idb_key_path.h", "//third_party/blink/renderer/modules/indexeddb/idb_key_range.h", "//third_party/blink/renderer/modules/indexeddb/idb_metadata.h", - "//third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h", "//third_party/blink/renderer/modules/indexeddb/idb_value.h", ] traits_deps = [ "//third_party/blink/renderer/platform/wtf" ]
diff --git a/third_party/blink/public/mojom/indexeddb/indexeddb.mojom b/third_party/blink/public/mojom/indexeddb/indexeddb.mojom index ec30ee6..48417332 100644 --- a/third_party/blink/public/mojom/indexeddb/indexeddb.mojom +++ b/third_party/blink/public/mojom/indexeddb/indexeddb.mojom
@@ -237,9 +237,6 @@ interface IDBCallbacks { Error(IDBException code, mojo_base.mojom.String16 message); - // Factory::GetDatabaseInfo - SuccessNamesAndVersionsList(array<IDBNameAndVersion> value); - // Factory::Open / DeleteDatabase Blocked(int64 existing_version); @@ -454,9 +451,8 @@ }; interface IDBFactory { - // Gets high level info about databases that exist in the frame's - // origin. Posts results to |pending_callbacks|. - GetDatabaseInfo(pending_associated_remote<IDBCallbacks> pending_callbacks); + // Gets high level info about databases that exist in the frame's origin. + GetDatabaseInfo() => (array<IDBNameAndVersion> names_and_versions, IDBError? error); // Opens a database |name| in the frame's origin at version |version|. // |version_change_transaction_receiver| will have version change
diff --git a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom index 902b453..77636c4 100644 --- a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom +++ b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
@@ -23,7 +23,7 @@ }; // The maximum size of a valid interest group in bytes. -const uint32 kMaxInterestGroupSize = 51200; // 50 * 1024 +const uint32 kMaxInterestGroupSize = 1048576; // 1 * 1024 * 1024 // Permissions granted by an interest group to sellers. struct SellerCapabilities {
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index ca73cc1..0d8c64ff 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3880,6 +3880,7 @@ kGamepadTouchPosition = 4539, kGamepadTouchSurfaceDimension = 4540, kSandboxViaFencedFrame = 4541, + kVisibilityStateObserver = 4542, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h b/third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h index 8d260a11..106356d8 100644 --- a/third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h +++ b/third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h
@@ -33,7 +33,7 @@ std::unique_ptr<WebMockThreadScheduler> CreateMockWebMainThreadSchedulerForTests(); -void RunIdleTasksForTesting(WebThreadScheduler* scheduler, +void RunIdleTasksForTesting(WebThreadScheduler& scheduler, base::OnceClosure callback); // Returns a SequencedTaskRunner. This implementation is same as
diff --git a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h index bf24b66..4f2b744 100644 --- a/third_party/blink/public/platform/scheduler/web_thread_scheduler.h +++ b/third_party/blink/public/platform/scheduler/web_thread_scheduler.h
@@ -46,7 +46,7 @@ std::unique_ptr<base::MessagePump> message_pump = nullptr); // Returns main thread scheduler for the main thread of the current process. - static WebThreadScheduler* MainThreadScheduler(); + static WebThreadScheduler& MainThreadScheduler(); // Returns the compositor task runner. virtual scoped_refptr<base::SingleThreadTaskRunner> CompositorTaskRunner();
diff --git a/third_party/blink/renderer/BUILD.gn b/third_party/blink/renderer/BUILD.gn index 67572d1..36ee2b65 100644 --- a/third_party/blink/renderer/BUILD.gn +++ b/third_party/blink/renderer/BUILD.gn
@@ -132,6 +132,14 @@ "dump-graph", ] } + + # Enable GC plugin forbidding mojo::Associated{Remote,Receiver}: + cflags += [ + "-Xclang", + "-plugin-arg-blink-gc-plugin", + "-Xclang", + "forbid-associated-remote-receiver", + ] } }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc index a6a00a4..ce61b27a 100644 --- a/third_party/blink/renderer/core/dom/document.cc +++ b/third_party/blink/renderer/core/dom/document.cc
@@ -3783,6 +3783,10 @@ if (SvgExtensions()) AccessSVGExtensions().StartAnimations(); + + if (lazy_load_image_observer_) { + lazy_load_image_observer_->DocumentOnLoadFinished(this); + } } static bool AllDescendantsAreComplete(Document* document) {
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc index eda29e89..e8b1d6e2 100644 --- a/third_party/blink/renderer/core/execution_context/execution_context.cc +++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -704,6 +704,33 @@ } return ContextType::UNKNOWN_CONTEXT; } + +using WorldType = ExecutionContext::Proto::WorldType; +WorldType GetWorldType(const ExecutionContext& execution_context) { + auto current_world = execution_context.GetCurrentWorld(); + if (current_world == nullptr) { + return WorldType::WORLD_UNKNOWN; + } + + switch (current_world->GetWorldType()) { + case DOMWrapperWorld::WorldType::kMain: + return WorldType::WORLD_MAIN; + case DOMWrapperWorld::WorldType::kIsolated: + return WorldType::WORLD_ISOLATED; + case DOMWrapperWorld::WorldType::kInspectorIsolated: + return WorldType::WORLD_INSPECTOR_ISOLATED; + case DOMWrapperWorld::WorldType::kRegExp: + return WorldType::WORLD_REG_EXP; + case DOMWrapperWorld::WorldType::kForV8ContextSnapshotNonMain: + return WorldType::WORLD_FOR_V8_CONTEXT_SNAPSHOT_NON_MAIN; + case DOMWrapperWorld::WorldType::kWorker: + return WorldType::WORLD_WORKER; + case DOMWrapperWorld::WorldType::kShadowRealm: + return WorldType::WORLD_SHADOW_REALM; + default: + return WorldType::WORLD_UNKNOWN; + } +} } // namespace void ExecutionContext::WriteIntoTrace( @@ -711,6 +738,7 @@ proto->set_url(Url().GetString().Utf8()); proto->set_origin(GetSecurityOrigin()->ToString().Utf8()); proto->set_type(GetContextType(*this)); + proto->set_world_type(GetWorldType(*this)); } } // namespace blink
diff --git a/third_party/blink/renderer/core/fileapi/blob.cc b/third_party/blink/renderer/core/fileapi/blob.cc index 356c2193..3ba1dfff 100644 --- a/third_party/blink/renderer/core/fileapi/blob.cc +++ b/third_party/blink/renderer/core/fileapi/blob.cc
@@ -41,14 +41,15 @@ #include "third_party/blink/renderer/core/fetch/blob_bytes_consumer.h" #include "third_party/blink/renderer/core/fetch/body_stream_buffer.h" #include "third_party/blink/renderer/core/fileapi/file_read_type.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/url/dom_url.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/blob/blob_url.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/heap/self_keep_alive.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -64,36 +65,41 @@ // Helper class to asynchronously read from a Blob using a FileReaderLoader. // Each client is only good for one Blob read operation. +// Each instance owns itself and will delete itself in the callbacks. // This class is not thread-safe. class BlobFileReaderClient : public GarbageCollected<BlobFileReaderClient>, - public FileReaderAccumulator { + public blink::FileReaderLoaderClient { public: BlobFileReaderClient( const scoped_refptr<BlobDataHandle> blob_data_handle, const scoped_refptr<base::SingleThreadTaskRunner> task_runner, const FileReadType read_type, ScriptPromiseResolver* resolver) - : loader_(MakeGarbageCollected<FileReaderLoader>(this, + : loader_(MakeGarbageCollected<FileReaderLoader>(read_type, + this, std::move(task_runner))), resolver_(resolver), - read_type_(read_type) { + read_type_(read_type), + keep_alive_(this) { loader_->Start(std::move(blob_data_handle)); } void Trace(Visitor* visitor) const override { visitor->Trace(loader_); visitor->Trace(resolver_); - FileReaderAccumulator::Trace(visitor); + blink::FileReaderLoaderClient::Trace(visitor); } ~BlobFileReaderClient() override = default; + void DidStartLoading() override {} + void DidReceiveData() override {} void DidFail(FileErrorCode error_code) override { - FileReaderAccumulator::DidFail(error_code); resolver_->Reject(file_error::CreateDOMException(error_code)); - Done(); + keep_alive_.Clear(); } - void DidFinishLoading(FileReaderData contents) override { + void DidFinishLoading() override { + FileReaderData contents = loader_->TakeContents(); if (read_type_ == FileReadType::kReadAsText) { String result = std::move(contents).AsText("UTF-8"); resolver_->Resolve(result); @@ -103,18 +109,14 @@ } else { NOTREACHED() << "Unknown ReadType supplied to BlobFileReaderClient"; } - Done(); + keep_alive_.Clear(); } private: - void Done() { - // FileReaderLoader holds us as a member, so clearing it will trigger our - // own garbage collection. - loader_ = nullptr; - } Member<FileReaderLoader> loader_; Member<ScriptPromiseResolver> resolver_; const FileReadType read_type_; + SelfKeepAlive<BlobFileReaderClient> keep_alive_; }; Blob::Blob(scoped_refptr<BlobDataHandle> data_handle)
diff --git a/third_party/blink/renderer/core/fileapi/build.gni b/third_party/blink/renderer/core/fileapi/build.gni index ee57332b..4ab90aa 100644 --- a/third_party/blink/renderer/core/fileapi/build.gni +++ b/third_party/blink/renderer/core/fileapi/build.gni
@@ -18,8 +18,7 @@ "file_reader_data.h", "file_reader_loader.cc", "file_reader_loader.h", - "file_reader_client.cc", - "file_reader_client.h", + "file_reader_loader_client.h", "file_reader_sync.cc", "file_reader_sync.h", "public_url_manager.cc",
diff --git a/third_party/blink/renderer/core/fileapi/file_read_type.h b/third_party/blink/renderer/core/fileapi/file_read_type.h index 21f8ecd2..661a6a62 100644 --- a/third_party/blink/renderer/core/fileapi/file_read_type.h +++ b/third_party/blink/renderer/core/fileapi/file_read_type.h
@@ -11,7 +11,8 @@ kReadAsArrayBuffer, kReadAsBinaryString, kReadAsText, - kReadAsDataURL + kReadAsDataURL, + kReadByClient }; } // namespace blink
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.cc b/third_party/blink/renderer/core/fileapi/file_reader.cc index 17f54131..cd3c011d 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader.cc
@@ -318,7 +318,8 @@ loading_state_ = kLoadingStateLoading; loader_ = MakeGarbageCollected<FileReaderLoader>( - this, GetExecutionContext()->GetTaskRunner(TaskType::kFileReading)); + read_type_, this, + GetExecutionContext()->GetTaskRunner(TaskType::kFileReading)); loader_->Start(blob_data_handle_); blob_data_handle_ = nullptr; } @@ -380,13 +381,12 @@ loading_state_ = kLoadingStateNone; } -FileErrorCode FileReader::DidStartLoading() { +void FileReader::DidStartLoading() { base::AutoReset<bool> firing_events(&still_firing_events_, true); FireEvent(event_type_names::kLoadstart); - return FileErrorCode::kOK; } -FileErrorCode FileReader::DidReceiveData() { +void FileReader::DidReceiveData() { // Fire the progress event at least every 50ms. if (!last_progress_notification_time_) { last_progress_notification_time_ = base::ElapsedTimer(); @@ -396,21 +396,21 @@ FireEvent(event_type_names::kProgress); last_progress_notification_time_ = base::ElapsedTimer(); } - return FileErrorCode::kOK; } -void FileReader::DidFinishLoading(FileReaderData contents) { +void FileReader::DidFinishLoading() { if (loading_state_ == kLoadingStateAborted) return; DCHECK_EQ(loading_state_, kLoadingStateLoading); if (read_type_ == FileReadType::kReadAsArrayBuffer) { result_ = MakeGarbageCollected<V8UnionArrayBufferOrString>( - std::move(contents).AsDOMArrayBuffer()); + loader_->TakeContents().AsDOMArrayBuffer()); } else { result_ = MakeGarbageCollected<V8UnionArrayBufferOrString>( - std::move(contents).AsString(read_type_, encoding_, blob_type_)); + loader_->TakeContents().AsString(read_type_, encoding_, blob_type_)); } + // When we set m_state to DONE below, we still need to fire // the load and loadend events. To avoid GC to collect this FileReader, we // use this separate variable to keep the wrapper of this FileReader alive. @@ -442,7 +442,6 @@ } void FileReader::DidFail(FileErrorCode error_code) { - FileReaderAccumulator::DidFail(error_code); if (loading_state_ == kLoadingStateAborted) return; @@ -490,7 +489,7 @@ visitor->Trace(result_); EventTargetWithInlineData::Trace(visitor); ExecutionContextLifecycleObserver::Trace(visitor); - FileReaderAccumulator::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); } } // namespace blink
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.h b/third_party/blink/renderer/core/fileapi/file_reader.h index 205d1ce..79c598cc 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader.h +++ b/third_party/blink/renderer/core/fileapi/file_reader.h
@@ -36,10 +36,9 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" -#include "third_party/blink/renderer/core/fileapi/file_error.h" #include "third_party/blink/renderer/core/fileapi/file_read_type.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/probe/async_task_context.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/forward.h" @@ -55,7 +54,7 @@ class CORE_EXPORT FileReader final : public EventTargetWithInlineData, public ActiveScriptWrappable<FileReader>, public ExecutionContextLifecycleObserver, - public FileReaderAccumulator { + public FileReaderLoaderClient { DEFINE_WRAPPERTYPEINFO(); public: @@ -90,10 +89,10 @@ return ExecutionContextLifecycleObserver::GetExecutionContext(); } - // FileReaderClient - FileErrorCode DidStartLoading() override; - FileErrorCode DidReceiveData() override; - void DidFinishLoading(FileReaderData contents) override; + // FileReaderLoaderClient + void DidStartLoading() override; + void DidReceiveData() override; + void DidFinishLoading() override; void DidFail(FileErrorCode) override; DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart, kLoadstart)
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_client.cc b/third_party/blink/renderer/core/fileapi/file_reader_client.cc deleted file mode 100644 index e87ea791..0000000 --- a/third_party/blink/renderer/core/fileapi/file_reader_client.cc +++ /dev/null
@@ -1,69 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" -#include "third_party/blink/renderer/core/fileapi/file_read_type.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" -#include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h" -#include "third_party/blink/renderer/platform/wtf/text/base64.h" -#include "third_party/blink/renderer/platform/wtf/text/string_builder.h" - -namespace blink { - -FileErrorCode FileReaderAccumulator::DidStartLoading(uint64_t size, - uint64_t total_bytes) { - bytes_loaded_ = 0; - raw_data_ = ArrayBufferContents(static_cast<unsigned>(total_bytes), 1, - ArrayBufferContents::kNotShared, - ArrayBufferContents::kDontInitialize); - if (!raw_data_.IsValid()) { - return FileErrorCode::kNotReadableErr; - } - return DidStartLoading(); -} - -FileErrorCode FileReaderAccumulator::DidReceiveData(const char* data, - unsigned data_length) { - // Fill out the buffer - if (bytes_loaded_ + data_length > raw_data_.DataLength()) { - raw_data_.Reset(); - bytes_loaded_ = 0; - return FileErrorCode::kNotReadableErr; - } - memcpy(static_cast<char*>(raw_data_.Data()) + bytes_loaded_, data, - data_length); - bytes_loaded_ += data_length; - return DidReceiveData(); -} - -void FileReaderAccumulator::DidFinishLoading() { - DCHECK_EQ(bytes_loaded_, raw_data_.DataLength()); - CHECK(raw_data_.IsValid()); - DidFinishLoading(FileReaderData(std::move(raw_data_))); -} - -void FileReaderAccumulator::DidFail(FileErrorCode) { - bytes_loaded_ = 0; - raw_data_.Reset(); -} - -std::pair<FileErrorCode, FileReaderData> SyncedFileReaderAccumulator::Load( - scoped_refptr<BlobDataHandle> handle, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - auto* client = MakeGarbageCollected<SyncedFileReaderAccumulator>(); - auto* file_reader = - MakeGarbageCollected<FileReaderLoader>(client, std::move(task_runner)); - - file_reader->StartSync(std::move(handle)); - return {client->error_code_, std::move(client->stored_)}; -} - -void SyncedFileReaderAccumulator::DidFail(FileErrorCode error_code) { - error_code_ = error_code; -} -void SyncedFileReaderAccumulator::DidFinishLoading(FileReaderData obj) { - stored_ = std::move(obj); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_client.h b/third_party/blink/renderer/core/fileapi/file_reader_client.h deleted file mode 100644 index 37850a03..0000000 --- a/third_party/blink/renderer/core/fileapi/file_reader_client.h +++ /dev/null
@@ -1,141 +0,0 @@ -/* - * Copyright (C) 2010 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: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * 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. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "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 THE COPYRIGHT - * OWNER 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_FILEAPI_FILE_READER_CLIENT_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_CLIENT_H_ - -#include "base/task/single_thread_task_runner.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_data.h" -#include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h" -#include "third_party/blink/renderer/platform/blob/blob_data.h" -#include "third_party/blink/renderer/platform/heap/garbage_collected.h" - -namespace blink { - -enum class FileErrorCode; - -// FileReaderClient is used by the FileReaderLoader to read a given blob's raw -// data. For a more convenient way to read blobs that matches the different -// FileReadType's, see FileReaderAccumulator below. -// For more information on how to read Blobs in your specific situation, see: -// https://chromium.googlesource.com/chromium/src/+/HEAD/storage/browser/blob/README.md#how-to-use-blobs-blink-accessing-reading -class CORE_EXPORT FileReaderClient : public GarbageCollectedMixin { - public: - virtual ~FileReaderClient() = default; - - // Clients must implement this method to be informed about when the loading - // actually started. - // If an error occurred while processing the data, a FileErrorCode can be - // returned. In such case, the blob's processing will end a DidFail will be - // called with the returned error. - // Clients must not make re-entrant calls to the FileReaderLoader in this - // method. - virtual FileErrorCode DidStartLoading(uint64_t total_size, - uint64_t content_size) = 0; - // Clients must implement this method to receive the blob's data. - // If an error occurred while processing the data, a FileErrorCode can be - // returned. In such case, the blob's processing will end a DidFail will be - // called with the returned error. - // Clients must not make re-entrant calls to the FileReaderLoader in this - // method. - virtual FileErrorCode DidReceiveData(const char* data, - unsigned data_length) = 0; - // Clients must implement this method to be informed about when the loading - // ended. - virtual void DidFinishLoading() = 0; - // Clients must implement this method to be informed about any failures that - // occurred. - virtual void DidFail(FileErrorCode) = 0; - - void Trace(Visitor*) const override {} -}; - -// FileReaderAccumulator helps aggregating the data received from -// FileReaderLoader. This class implements a regular FileReaderClient and -// reads the file' chunks until completion. On completion, it provides a -// convenient way to convert the received data to the FileReadType types via -// the FileReaderData class helper. -class CORE_EXPORT FileReaderAccumulator : public FileReaderClient { - public: - // Clients might implement this method if they want to know when the loading - // process started. The client can also choose the loader behaviour by - // returning whether to continue or stop the loader. - virtual FileErrorCode DidStartLoading() { return FileErrorCode::kOK; } - // Clients might implement this method if they want to know when the loader - // received some data. The client can also choose the loader behaviour by - // returning whether to continue or stop the loader. - virtual FileErrorCode DidReceiveData() { return FileErrorCode::kOK; } - // Clients must implement this method to receive the aggregated file data. - virtual void DidFinishLoading(FileReaderData) = 0; - // Clients might implement this method to known whether the loading failed. - // If this method is implemented, it is recommended to call the parent - // implementation as well for early cleanup. - void DidFail(FileErrorCode) override; - void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); - } - - private: - FileErrorCode DidStartLoading(uint64_t size, uint64_t total_bytes) final; - FileErrorCode DidReceiveData(const char* data, unsigned data_length) final; - void DidFinishLoading() final; - - uint64_t bytes_loaded_ = 0; - ArrayBufferContents raw_data_; -}; - -// The class acts similar to the FileReaderAccumulator, except that it -// works synchronously. This provides a few handy methods to help wait for the -// aggregated result. -class CORE_EXPORT SyncedFileReaderAccumulator - : public GarbageCollected<SyncedFileReaderAccumulator>, - public FileReaderAccumulator { - public: - static std::pair<FileErrorCode, FileReaderData> Load( - scoped_refptr<BlobDataHandle> handle, - scoped_refptr<base::SingleThreadTaskRunner>); - - void Trace(Visitor* visitor) const override { - FileReaderAccumulator::Trace(visitor); - } - - private: - void DidFail(FileErrorCode error_code) final; - void DidFinishLoading(FileReaderData obj) final; - - FileReaderData stored_; - FileErrorCode error_code_ = FileErrorCode::kOK; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_CLIENT_H_
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc index dab1fbd..deafb74d 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -34,7 +34,6 @@ #include <memory> #include <utility> -#include "base/auto_reset.h" #include "base/memory/scoped_refptr.h" #include "base/numerics/safe_conversions.h" #include "base/task/single_thread_task_runner.h" @@ -43,7 +42,7 @@ #include "third_party/blink/public/platform/web_url_request.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/platform/blob/blob_url.h" #include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/wtf/functional.h" @@ -51,37 +50,26 @@ namespace blink { FileReaderLoader::FileReaderLoader( - FileReaderClient* client, + FileReadType read_type, + FileReaderLoaderClient* client, scoped_refptr<base::SingleThreadTaskRunner> task_runner) - : client_(client), + : read_type_(read_type), + client_(client), handle_watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC, task_runner), task_runner_(std::move(task_runner)) { - CHECK(client); DCHECK(task_runner_); } FileReaderLoader::~FileReaderLoader() = default; void FileReaderLoader::Start(scoped_refptr<BlobDataHandle> blob_data) { - StartInternal(std::move(blob_data), /*is_sync=*/false); -} - -void FileReaderLoader::StartSync(scoped_refptr<BlobDataHandle> blob_data) { - StartInternal(std::move(blob_data), /*is_sync=*/true); -} - -void FileReaderLoader::StartInternal(scoped_refptr<BlobDataHandle> blob_data, - bool is_sync) { #if DCHECK_IS_ON() DCHECK(!started_loading_) << "FileReaderLoader can only be used once"; started_loading_ = true; #endif // DCHECK_IS_ON() - // This sets up the `IsSyncLoad` mechanism for the lifetime of this method. - base::AutoReset<bool> scoped_is_sync(&is_sync_, is_sync); - MojoCreateDataPipeOptions options; options.struct_size = sizeof(MojoCreateDataPipeOptions); options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE; @@ -123,10 +111,25 @@ Cleanup(); } +FileReaderData FileReaderLoader::TakeContents() { + // Let's prevent any API misusage here. Clients are definitely not supposed to + // extract some contents in case an error occurred. For partial contents, + // clients should be using FileReadType::kReadByClient. + CHECK(raw_data_.IsValid() && error_code_ == FileErrorCode::kOK && + finished_loading_); + + return FileReaderData(std::move(raw_data_)); +} + void FileReaderLoader::Cleanup() { handle_watcher_.Cancel(); consumer_handle_.reset(); receiver_.reset(); + + // If we get any error, we do not need to keep a buffer around. + if (error_code_ != FileErrorCode::kOK) { + raw_data_.Reset(); + } } void FileReaderLoader::Failed(FileErrorCode error_code) { @@ -135,24 +138,92 @@ return; error_code_ = error_code; Cleanup(); - client_->DidFail(error_code_); + if (client_) + client_->DidFail(error_code_); +} + +void FileReaderLoader::OnStartLoading(uint64_t total_bytes) { + total_bytes_ = total_bytes; + + DCHECK(!raw_data_.IsValid()); + + if (read_type_ != FileReadType::kReadByClient) { + // Check that we can cast to unsigned since we have to do + // so to call ArrayBuffer's create function. + // FIXME: Support reading more than the current size limit of ArrayBuffer. + if (total_bytes > std::numeric_limits<unsigned>::max()) { + Failed(FileErrorCode::kNotReadableErr); + return; + } + + raw_data_ = ArrayBufferContents(static_cast<unsigned>(total_bytes), 1, + ArrayBufferContents::kNotShared, + ArrayBufferContents::kDontInitialize); + if (!raw_data_.IsValid()) { + Failed(FileErrorCode::kNotReadableErr); + return; + } + } + + if (client_) + client_->DidStartLoading(); +} + +void FileReaderLoader::OnReceivedData(const char* data, unsigned data_length) { + DCHECK(data); + + // Bail out if we already encountered an error. + if (error_code_ != FileErrorCode::kOK) + return; + + if (read_type_ == FileReadType::kReadByClient) { + bytes_loaded_ += data_length; + + if (client_) + client_->DidReceiveDataForClient(data, data_length); + return; + } + + // Receiving more data than expected would indicate a bug in the + // implementation of the mojom Blob interface. However there is no guarantee + // that the Blob is actually backed by a "real" blob, so to + // defend against compromised renderer processes we still need to carefully + // validate anything received. So return an error if we received too much + // data. + if (bytes_loaded_ + data_length > raw_data_.DataLength()) { + raw_data_.Reset(); + bytes_loaded_ = 0; + Failed(FileErrorCode::kNotReadableErr); + return; + } + memcpy(static_cast<char*>(raw_data_.Data()) + bytes_loaded_, data, + data_length); + bytes_loaded_ += data_length; + + if (client_) + client_->DidReceiveData(); } void FileReaderLoader::OnFinishLoading() { + if (read_type_ != FileReadType::kReadByClient && raw_data_.IsValid()) { + DCHECK_EQ(bytes_loaded_, raw_data_.DataLength()); + } + finished_loading_ = true; + Cleanup(); - client_->DidFinishLoading(); + if (client_) + client_->DidFinishLoading(); } void FileReaderLoader::OnCalculatedSize(uint64_t total_size, uint64_t expected_content_size) { - total_bytes_ = expected_content_size; - - if (auto err = client_->DidStartLoading(total_size, expected_content_size); - err != FileErrorCode::kOK) { - Failed(err); + auto weak_this = WrapWeakPersistent(this); + OnStartLoading(expected_content_size); + // OnStartLoading calls out to our client, which could delete |this|, so bail + // out if that happened. + if (!weak_this) return; - } if (expected_content_size == 0) { received_all_data_ = true; @@ -220,17 +291,12 @@ return; } - const char* data = static_cast<const char*>(buffer); - DCHECK(data); - DCHECK_EQ(error_code_, FileErrorCode::kOK); - - bytes_loaded_ += num_bytes; - - if (auto err = client_->DidReceiveData(data, num_bytes); - err != FileErrorCode::kOK) { - Failed(err); + auto weak_this = WrapWeakPersistent(this); + OnReceivedData(static_cast<const char*>(buffer), num_bytes); + // OnReceivedData calls out to our client, which could delete |this|, so + // bail out if that happened. + if (!weak_this) return; - } consumer_handle_->EndReadData(num_bytes); if (BytesLoaded() >= total_bytes_) {
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader.h b/third_party/blink/renderer/core/fileapi/file_reader_loader.h index 8e2c0ed..e1284d9 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_loader.h +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader.h
@@ -39,7 +39,9 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_data.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" @@ -50,7 +52,8 @@ namespace blink { class BlobDataHandle; -// Reads a Blob's content and forwards it to the FileReaderClient. + +// Reads a Blob's content into memory. // // Blobs are typically stored on disk, and should be read asynchronously // whenever possible. Synchronous loading is implemented to support Web Platform @@ -64,14 +67,16 @@ public: // If client is given, do the loading asynchronously. Otherwise, load // synchronously. - FileReaderLoader(FileReaderClient*, + FileReaderLoader(FileReadType, + FileReaderLoaderClient*, scoped_refptr<base::SingleThreadTaskRunner>); ~FileReaderLoader() override; void Start(scoped_refptr<BlobDataHandle>); - void StartSync(scoped_refptr<BlobDataHandle>); void Cancel(); + FileReaderData TakeContents(); + // Returns the total bytes received. Bytes ignored by m_rawData won't be // counted. // @@ -92,21 +97,25 @@ void Trace(Visitor* visitor) const { visitor->Trace(client_); } private: - void StartInternal(scoped_refptr<BlobDataHandle>, bool is_sync); void Cleanup(); void Failed(FileErrorCode); - bool IsSyncLoad() { return is_sync_; } - + void OnStartLoading(uint64_t total_bytes); + void OnReceivedData(const char* data, unsigned data_length); void OnFinishLoading(); + bool IsSyncLoad() const { return !client_; } + // BlobReaderClient: void OnCalculatedSize(uint64_t total_size, uint64_t expected_content_size) override; void OnComplete(int32_t status, uint64_t data_length) override; void OnDataPipeReadable(MojoResult); - Member<FileReaderClient> client_; + FileReadType read_type_; + WeakMember<FileReaderLoaderClient> client_; + + ArrayBufferContents raw_data_; bool finished_loading_ = false; uint64_t bytes_loaded_ = 0; @@ -128,8 +137,6 @@ bool started_loading_ = false; #endif // DCHECK_IS_ON() - bool is_sync_ = false; - scoped_refptr<base::SingleThreadTaskRunner> task_runner_; };
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_loader_client.h b/third_party/blink/renderer/core/fileapi/file_reader_loader_client.h new file mode 100644 index 0000000..dfd6a80 --- /dev/null +++ b/third_party/blink/renderer/core/fileapi/file_reader_loader_client.h
@@ -0,0 +1,65 @@ +/* + * Copyright (C) 2010 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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_FILEAPI_FILE_READER_LOADER_CLIENT_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_LOADER_CLIENT_H_ + +#include "base/notreached.h" +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" + +namespace blink { + +enum class FileErrorCode; + +// For more information on how to read Blobs in your specific situation, see: +// https://chromium.googlesource.com/chromium/src/+/HEAD/storage/browser/blob/README.md#accessing-reading +class CORE_EXPORT FileReaderLoaderClient : public GarbageCollectedMixin { + public: + virtual ~FileReaderLoaderClient() = default; + + virtual void DidStartLoading() = 0; + // Clients must implement this method if they are using any ReadType except + // ReadByClient. + virtual void DidReceiveData() { NOTREACHED(); } + // Clients must implement this method if they are using the ReadByClient + // ReadType. + virtual void DidReceiveDataForClient(const char* data, unsigned data_length) { + NOTREACHED(); + } + virtual void DidFinishLoading() = 0; + virtual void DidFail(FileErrorCode) = 0; + + void Trace(Visitor*) const override {} +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_LOADER_CLIENT_H_
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc index 1925697..f5755626 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_sync.cc +++ b/third_party/blink/renderer/core/fileapi/file_reader_sync.cc
@@ -35,7 +35,9 @@ #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" @@ -50,19 +52,26 @@ ExceptionState& exception_state) { DCHECK(blob); - absl::optional<FileReaderData> res = Load(*blob, exception_state); - return !res ? nullptr : std::move(res).value().AsDOMArrayBuffer(); + FileReaderLoader* loader = MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsArrayBuffer, nullptr, task_runner_); + StartLoading(*loader, *blob, exception_state); + if (loader->GetErrorCode() != FileErrorCode::kOK) { + return nullptr; + } + return loader->TakeContents().AsDOMArrayBuffer(); } String FileReaderSync::readAsBinaryString(Blob* blob, ExceptionState& exception_state) { DCHECK(blob); - absl::optional<FileReaderData> res = Load(*blob, exception_state); - if (!res) { + FileReaderLoader* loader = MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsBinaryString, nullptr, task_runner_); + StartLoading(*loader, *blob, exception_state); + if (loader->GetErrorCode() != FileErrorCode::kOK) { return ""; } - return std::move(res).value().AsBinaryString(); + return loader->TakeContents().AsBinaryString(); } String FileReaderSync::readAsText(Blob* blob, @@ -70,34 +79,34 @@ ExceptionState& exception_state) { DCHECK(blob); - absl::optional<FileReaderData> res = Load(*blob, exception_state); - if (!res) { + FileReaderLoader* loader = MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsText, nullptr, task_runner_); + StartLoading(*loader, *blob, exception_state); + if (loader->GetErrorCode() != FileErrorCode::kOK) { return ""; } - return std::move(res).value().AsText(encoding); + return loader->TakeContents().AsText(encoding); } String FileReaderSync::readAsDataURL(Blob* blob, ExceptionState& exception_state) { DCHECK(blob); - absl::optional<FileReaderData> res = Load(*blob, exception_state); - if (!res) { + FileReaderLoader* loader = MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsDataURL, nullptr, task_runner_); + StartLoading(*loader, *blob, exception_state); + if (loader->GetErrorCode() != FileErrorCode::kOK) { return ""; } - return std::move(res).value().AsDataURL(blob->type()); + return loader->TakeContents().AsDataURL(blob->type()); } -absl::optional<FileReaderData> FileReaderSync::Load( - const Blob& blob, - ExceptionState& exception_state) { - auto res = - SyncedFileReaderAccumulator::Load(blob.GetBlobDataHandle(), task_runner_); - if (res.first != FileErrorCode::kOK) { - file_error::ThrowDOMException(exception_state, res.first); - return absl::nullopt; - } - return std::move(res.second); +void FileReaderSync::StartLoading(FileReaderLoader& loader, + const Blob& blob, + ExceptionState& exception_state) { + loader.Start(blob.GetBlobDataHandle()); + if (loader.GetErrorCode() != FileErrorCode::kOK) + file_error::ThrowDOMException(exception_state, loader.GetErrorCode()); } } // namespace blink
diff --git a/third_party/blink/renderer/core/fileapi/file_reader_sync.h b/third_party/blink/renderer/core/fileapi/file_reader_sync.h index ff6f96c..15712197 100644 --- a/third_party/blink/renderer/core/fileapi/file_reader_sync.h +++ b/third_party/blink/renderer/core/fileapi/file_reader_sync.h
@@ -32,9 +32,6 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_FILE_READER_SYNC_H_ #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_data.h" -#include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -49,6 +46,7 @@ class DOMArrayBuffer; class ExceptionState; class ExecutionContext; +class FileReaderLoader; class FileReaderSync final : public ScriptWrappable { DEFINE_WRAPPERTYPEINFO(); @@ -73,7 +71,7 @@ } private: - absl::optional<FileReaderData> Load(const Blob&, ExceptionState&); + void StartLoading(FileReaderLoader&, const Blob&, ExceptionState&); scoped_refptr<base::SingleThreadTaskRunner> task_runner_; };
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc index e402fe55..29af561 100644 --- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc +++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc
@@ -39,7 +39,7 @@ } void RunAsyncMatchingTasks() { - auto* scheduler = + auto& scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting(scheduler, WTF::BindOnce([]() {})); RunPendingTasks();
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_test.cc index 4306779d..c7e68ab 100644 --- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_test.cc +++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_test.cc
@@ -61,7 +61,7 @@ } void RunAsyncMatchingTasks() { - auto* scheduler = + auto& scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting(scheduler, WTF::BindOnce([]() {})); RunPendingTasks();
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_generation_navigation_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_generation_navigation_test.cc index 17c825f..8917bc5 100644 --- a/third_party/blink/renderer/core/fragment_directive/text_fragment_generation_navigation_test.cc +++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_generation_navigation_test.cc
@@ -75,7 +75,7 @@ } void TextFragmentGenerationNavigationTest::RunAsyncMatchingTasks() { - auto* scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); + auto& scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting(scheduler, WTF::BindOnce([]() {})); RunPendingTasks(); }
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_handler_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_handler_test.cc index dc79898..9520c5d 100644 --- a/third_party/blink/renderer/core/fragment_directive/text_fragment_handler_test.cc +++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_handler_test.cc
@@ -54,7 +54,7 @@ } void RunAsyncMatchingTasks() { - auto* scheduler = + auto& scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting(scheduler, WTF::BindOnce([]() {})); RunPendingTasks();
diff --git a/third_party/blink/renderer/core/frame/display_cutout_client_impl.h b/third_party/blink/renderer/core/frame/display_cutout_client_impl.h index 93618ab..2549f6c 100644 --- a/third_party/blink/renderer/core/frame/display_cutout_client_impl.h +++ b/third_party/blink/renderer/core/frame/display_cutout_client_impl.h
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -39,6 +40,7 @@ private: Member<LocalFrame> frame_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::DisplayCutoutClient> receiver_; };
diff --git a/third_party/blink/renderer/core/frame/find_in_page.h b/third_party/blink/renderer/core/frame/find_in_page.h index 46180f49..11fd9d0 100644 --- a/third_party/blink/renderer/core/frame/find_in_page.h +++ b/third_party/blink/renderer/core/frame/find_in_page.h
@@ -112,6 +112,7 @@ GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::Remote<mojom::blink::FindInPageClient> client_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::FindInPage> receiver_{this}; };
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index ec601fe..47c0a46 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -379,7 +379,7 @@ : web_view_(nullptr), agent_group_scheduler_( scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()), + .CreateWebAgentGroupScheduler()), platform_(Platform::Current()) { DocumentLoader::DisableCodeCacheForTesting(); CreateTestWebFrameWidgetCallback create_callback =
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index b12634e1..2fa51bd 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -22,6 +22,7 @@ #include "third_party/blink/renderer/core/frame/frame.h" #include "third_party/blink/renderer/core/frame/remote_frame_view.h" #include "third_party/blink/renderer/platform/wtf/casting.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace cc { class Layer; @@ -300,9 +301,12 @@ // Whether the frame is considered to be an ad frame by Ad Tagging. bool is_ad_frame_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::RemoteFrameHost> remote_frame_host_remote_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::RemoteFrame> receiver_{this}; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::RemoteMainFrame> main_frame_receiver_{ this}; scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
diff --git a/third_party/blink/renderer/core/frame/viewport_data.h b/third_party/blink/renderer/core/frame/viewport_data.h index 80e37a9..0d9b5f00 100644 --- a/third_party/blink/renderer/core/frame/viewport_data.h +++ b/third_party/blink/renderer/core/frame/viewport_data.h
@@ -11,6 +11,7 @@ #include "third_party/blink/renderer/core/page/viewport_description.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -59,6 +60,7 @@ mojom::ViewportFit viewport_fit_ = blink::mojom::ViewportFit::kAuto; bool force_expand_display_cutout_ = false; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::DisplayCutoutHost> display_cutout_host_; };
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 937636c..6a11456 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -332,7 +332,7 @@ // throttled. if (kLaunchingProcessIsBackgrounded) { blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->SetRendererBackgrounded(false); + .SetRendererBackgrounded(false); } }
diff --git a/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_mparch_delegate.h b/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_mparch_delegate.h index ec044210..2dcdb111 100644 --- a/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_mparch_delegate.h +++ b/third_party/blink/renderer/core/html/fenced_frame/fenced_frame_mparch_delegate.h
@@ -9,6 +9,7 @@ #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom-blink.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/html/fenced_frame/html_fenced_frame_element.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -31,6 +32,7 @@ void DidChangeFramePolicy(const FramePolicy&) override; private: + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::FencedFrameOwnerHost> remote_; };
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer.cc b/third_party/blink/renderer/core/html/lazy_load_image_observer.cc index 6bc5e75..a9ac4b91 100644 --- a/third_party/blink/renderer/core/html/lazy_load_image_observer.cc +++ b/third_party/blink/renderer/core/html/lazy_load_image_observer.cc
@@ -147,7 +147,11 @@ } // namespace -LazyLoadImageObserver::LazyLoadImageObserver(const Document& document) {} +LazyLoadImageObserver::LazyLoadImageObserver(const Document& root_document) { + use_viewport_distance_threshold_ = + !RuntimeEnabledFeatures::DelayOutOfViewportLazyImagesEnabled() || + root_document.LoadEventFinished(); +} void LazyLoadImageObserver::StartMonitoringNearViewport( Document* root_document, @@ -156,13 +160,7 @@ DCHECK(RuntimeEnabledFeatures::LazyImageLoadingEnabled()); if (!lazy_load_intersection_observer_) { - lazy_load_intersection_observer_ = IntersectionObserver::Create( - {Length::Fixed( - GetLazyImageLoadingViewportDistanceThresholdPx(*root_document))}, - {std::numeric_limits<float>::min()}, root_document, - WTF::BindRepeating(&LazyLoadImageObserver::LoadIfNearViewport, - WrapWeakPersistent(this)), - LocalFrameUkmAggregator::kLazyLoadIntersectionObserver); + CreateLazyLoadIntersectionObserver(root_document); } lazy_load_intersection_observer_->observe(element); @@ -326,6 +324,49 @@ } } +void LazyLoadImageObserver::DocumentOnLoadFinished(Document* root_document) { + if (!RuntimeEnabledFeatures::DelayOutOfViewportLazyImagesEnabled()) { + return; + } + if (use_viewport_distance_threshold_) { + return; + } + + use_viewport_distance_threshold_ = true; + + if (lazy_load_intersection_observer_) { + // Intersection observer doesn't support dynamic margin changes so we just + // create a new one. + CreateLazyLoadIntersectionObserver(root_document); + } +} + +void LazyLoadImageObserver::CreateLazyLoadIntersectionObserver( + Document* root_document) { + HeapVector<Member<Element>> existing_targets; + if (lazy_load_intersection_observer_) { + for (const IntersectionObservation* observation : + lazy_load_intersection_observer_->Observations()) { + existing_targets.push_back(observation->Target()); + } + } + + int viewport_threshold = + use_viewport_distance_threshold_ + ? GetLazyImageLoadingViewportDistanceThresholdPx(*root_document) + : 0; + lazy_load_intersection_observer_ = IntersectionObserver::Create( + {Length::Fixed(viewport_threshold)}, {std::numeric_limits<float>::min()}, + root_document, + WTF::BindRepeating(&LazyLoadImageObserver::LoadIfNearViewport, + WrapWeakPersistent(this)), + LocalFrameUkmAggregator::kLazyLoadIntersectionObserver); + + for (Element* element : existing_targets) { + lazy_load_intersection_observer_->observe(element); + } +} + void LazyLoadImageObserver::Trace(Visitor* visitor) const { visitor->Trace(lazy_load_intersection_observer_); visitor->Trace(visibility_metrics_observer_);
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer.h b/third_party/blink/renderer/core/html/lazy_load_image_observer.h index c575ac8..f82122b 100644 --- a/third_party/blink/renderer/core/html/lazy_load_image_observer.h +++ b/third_party/blink/renderer/core/html/lazy_load_image_observer.h
@@ -50,12 +50,24 @@ // resources started loading as a result. bool LoadAllImagesAndBlockLoadEvent(); + // Called when the document finishes loading. If DelayOutOfViewportLazyImages + // is enabled, this may update the intersection observer to start using a + // non-zero viewport threshold. + void DocumentOnLoadFinished(Document* root_document); + private: void LoadIfNearViewport(const HeapVector<Member<IntersectionObserverEntry>>&); void OnVisibilityChanged( const HeapVector<Member<IntersectionObserverEntry>>&); + void CreateLazyLoadIntersectionObserver(Document* root_document); + + // True if `lazy_load_intersection_observer_` should use a non-zero threshold + // for the viewport. True by default and used by DelayOutOfViewportLazyImages + // to not use a threshold while loading. + bool use_viewport_distance_threshold_; + // The intersection observer responsible for loading the image once it's near // the viewport. Member<IntersectionObserver> lazy_load_intersection_observer_;
diff --git a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc index cef7e4b..732ab8d 100644 --- a/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc +++ b/third_party/blink/renderer/core/html/lazy_load_image_observer_test.cc
@@ -15,6 +15,7 @@ #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" #include "third_party/blink/renderer/core/html/html_element.h" #include "third_party/blink/renderer/core/html/html_iframe_element.h" +#include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/loader/resource/image_resource.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" @@ -213,27 +214,37 @@ LazyLoadImagesSimTest, ::testing::Bool() /*is_lazyload_image_enabled*/); -enum class LazyImageLoadingFeatureStatus { - // LazyImageLoading is disabled. +enum class LazyLoadImagesParams { kDisabled = 0, - // LazyImageLoading is enabled, but AutomaticLazyImageLoading is disabled. - kEnabledExplicit + // LazyImageLoading enabled, DelayOutOfViewportLazyImages disabled. + kEnabled, + // LazyImageLoading enabled, DelayOutOfViewportLazyImages enabled. + kEnabledWithDelayOutOfViewportLazyImages }; -class LazyLoadImagesParamsTest : public SimTest, - public ::testing::WithParamInterface< - std::tuple<LazyImageLoadingFeatureStatus, - WebEffectiveConnectionType>> { +class LazyLoadImagesParamsTest + : public SimTest, + public ::testing::WithParamInterface< + std::tuple<LazyLoadImagesParams, WebEffectiveConnectionType>> { public: static constexpr int kViewportWidth = 800; static constexpr int kViewportHeight = 600; LazyLoadImagesParamsTest() - : lazy_image_loading_feature_status_( - std::get<LazyImageLoadingFeatureStatus>(GetParam())), - scoped_lazy_image_loading_for_test_( - lazy_image_loading_feature_status_ != - LazyImageLoadingFeatureStatus::kDisabled) {} + : lazy_image_loading_(std::get<LazyLoadImagesParams>(GetParam()) != + LazyLoadImagesParams::kDisabled), + delay_out_of_viewport_lazy_images_( + std::get<LazyLoadImagesParams>(GetParam()) == + LazyLoadImagesParams::kEnabledWithDelayOutOfViewportLazyImages) { + // Ensure DelayOutOfViewportLazyImages is not enabled with just + // `LazyLoadImagesParams::kEnabled`. This DCHECK ensures we remove + // `LazyLoadImagesParams::kEnabledWithDelayOutOfViewportLazyImages` when + // DelayOutOfViewportLazyImages is enabled by default. + if (RuntimeEnabledFeatures::DelayOutOfViewportLazyImagesEnabled()) { + DCHECK(std::get<LazyLoadImagesParams>(GetParam()) != + LazyLoadImagesParams::kEnabled); + } + } void SetUp() override { GetNetworkStateNotifier().SetNetworkConnectionInfoOverride( @@ -259,6 +270,9 @@ RuntimeEnabledFeatures::LazyImageLoadingEnabled()); } + // When DelayOutOfViewportLazyImages is enabled, this returns the threshold + // that will be used after the document has finished loading, as a threshold + // of zero is used during loading. int GetLoadingDistanceThreshold() const { static constexpr int kDistanceThresholdByEffectiveConnectionType[] = { 200, 300, 400, 500, 600, 700}; @@ -267,8 +281,8 @@ } private: - LazyImageLoadingFeatureStatus lazy_image_loading_feature_status_; - ScopedLazyImageLoadingForTest scoped_lazy_image_loading_for_test_; + ScopedLazyImageLoadingForTest lazy_image_loading_; + ScopedDelayOutOfViewportLazyImagesForTest delay_out_of_viewport_lazy_images_; }; TEST_P(LazyLoadImagesParamsTest, NearViewport) { @@ -341,6 +355,10 @@ auto_resource->Complete(full_image); unset_resource->Complete(full_image); + // Run pending tasks to process load events from `auto_resource` and + // `unset_resource`. + test::RunPendingTasks(); + Compositor().BeginFrame(); test::RunPendingTasks(); @@ -466,8 +484,10 @@ LazyImageLoading, LazyLoadImagesParamsTest, ::testing::Combine( - ::testing::Values(LazyImageLoadingFeatureStatus::kDisabled, - LazyImageLoadingFeatureStatus::kEnabledExplicit), + ::testing::Values( + LazyLoadImagesParams::kDisabled, + LazyLoadImagesParams::kEnabled, + LazyLoadImagesParams::kEnabledWithDelayOutOfViewportLazyImages), ::testing::Values(WebEffectiveConnectionType::kTypeUnknown, WebEffectiveConnectionType::kTypeOffline, WebEffectiveConnectionType::kTypeSlow2G, @@ -1087,6 +1107,136 @@ "Blink.VisibleLoadTime.LazyLoadImages.BelowTheFold.4G", 1); } +class DelayOutOfViewportLazyImagesTest : public SimTest { + public: + static constexpr int kViewportWidth = 800; + static constexpr int kViewportHeight = 600; + static constexpr int kDistanceThresholdPx = 1000; + + DelayOutOfViewportLazyImagesTest() + : lazy_image_loading_for_test_(true), + delay_out_of_viewport_for_test_(true) {} + + void SetUp() override { + GetNetworkStateNotifier().SetNetworkConnectionInfoOverride( + true /*on_line*/, kWebConnectionTypeWifi, + WebEffectiveConnectionType::kType4G, 1000 /*http_rtt_msec*/, + 100 /*max_bandwidth_mbps*/); + SimTest::SetUp(); + WebView().MainFrameViewWidget()->Resize( + gfx::Size(kViewportWidth, kViewportHeight)); + + Settings& settings = WebView().GetPage()->GetSettings(); + settings.SetLazyImageLoadingDistanceThresholdPx4G(kDistanceThresholdPx); + settings.SetLazyLoadEnabled(true); + } + + private: + ScopedLazyImageLoadingForTest lazy_image_loading_for_test_; + ScopedDelayOutOfViewportLazyImagesForTest delay_out_of_viewport_for_test_; +}; + +// Test that DelayOutOfViewportLazyImages causes lazy loading to use a viewport +// threshold of zero while the document loads, and that a non-zero threshold is +// used once the document finishes loading. +TEST_F(DelayOutOfViewportLazyImagesTest, DelayOutOfViewportLazyLoads) { + SimRequest main_resource("https://a.com/", "text/html"); + SimSubresourceRequest in_viewport_resource("https://a.com/in_viewport.png", + "image/png"); + SimSubresourceRequest near_viewport_resource( + "https://a.com/near_viewport.png", "image/png"); + SimSubresourceRequest far_from_viewport_resource( + "https://a.com/far_from_viewport.png", "image/png"); + + LoadURL("https://a.com/"); + // Begin writing the document, but do not complete loading yet. + main_resource.Write(R"HTML( + <!doctype html> + <html> + <img src='https://a.com/in_viewport.png' loading='lazy' + style='position:absolute; top:0; left:0; width:50px; height:50px;' + id='in_viewport' /> + <img src='https://a.com/near_viewport.png' loading='lazy' + style='position:absolute; top:101vh; left:0; width:50px; height:50px;' + id='near_viewport' /> + <img src='https://a.com/far_from_viewport.png' loading='lazy' + style='position:absolute; top:9999vh; left:0; width:50px; height:50px;' + id='far_from_viewport' /> + )HTML"); + + Compositor().BeginFrame(); + test::RunPendingTasks(); + + auto* in_viewport = + To<HTMLImageElement>(GetDocument().getElementById("in_viewport")); + auto* near_viewport = + To<HTMLImageElement>(GetDocument().getElementById("near_viewport")); + auto* far_from_viewport = + To<HTMLImageElement>(GetDocument().getElementById("far_from_viewport")); + + // While loading (`main_resource` is not yet complete), only the in-viewport + // image should be loading. + EXPECT_TRUE(in_viewport->CachedImage()->IsLoading()); + EXPECT_FALSE(near_viewport->CachedImage()->IsLoading()); + EXPECT_FALSE(far_from_viewport->CachedImage()->IsLoading()); + + // After the document completes loading, the lazy load threshold should + // increase so the near-viewport image begins to load. + main_resource.Complete("</html>"); + Compositor().BeginFrame(); + test::RunPendingTasks(); + EXPECT_TRUE(in_viewport->CachedImage()->IsLoading()); + EXPECT_TRUE(near_viewport->CachedImage()->IsLoading()); + EXPECT_FALSE(far_from_viewport->CachedImage()->IsLoading()); +} + +// Test that DelayOutOfViewportLazyImages has no effect on lazy loaded images +// inserted after the document has already loaded. +TEST_F(DelayOutOfViewportLazyImagesTest, DoNotDelayAfterDocumentLoads) { + SimRequest main_resource("https://a.com/", "text/html"); + SimSubresourceRequest in_viewport_resource("https://a.com/in_viewport.png", + "image/png"); + SimSubresourceRequest near_viewport_resource( + "https://a.com/near_viewport.png", "image/png"); + SimSubresourceRequest far_from_viewport_resource( + "https://a.com/far_from_viewport.png", "image/png"); + + LoadURL("https://a.com/"); + main_resource.Complete("<!doctype html><html></html>"); + Compositor().BeginFrame(); + test::RunPendingTasks(); + + EXPECT_TRUE(GetDocument().LoadEventFinished()); + + // Insert three lazy loaded images and ensure they are loaded according to a + // non-zero lazy loading viewport threshold. + GetDocument().documentElement()->setInnerHTML(R"HTML( + <img src='https://a.com/in_viewport.png' loading='lazy' + style='position:absolute; top:0; left:0; width:50px; height:50px;' + id='in_viewport' /> + <img src='https://a.com/near_viewport.png' loading='lazy' + style='position:absolute; top:101vh; left:0; width:50px; height:50px;' + id='near_viewport' /> + <img src='https://a.com/far_from_viewport.png' loading='lazy' + style='position:absolute; top:9999vh; left:0; width:50px; height:50px;' + id='far_from_viewport' /> + )HTML"); + + Compositor().BeginFrame(); + test::RunPendingTasks(); + + auto* in_viewport = + To<HTMLImageElement>(GetDocument().getElementById("in_viewport")); + auto* near_viewport = + To<HTMLImageElement>(GetDocument().getElementById("near_viewport")); + auto* far_from_viewport = + To<HTMLImageElement>(GetDocument().getElementById("far_from_viewport")); + + EXPECT_TRUE(in_viewport->CachedImage()->IsLoading()); + EXPECT_TRUE(near_viewport->CachedImage()->IsLoading()); + EXPECT_FALSE(far_from_viewport->CachedImage()->IsLoading()); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/html/portal/portal_contents.h b/third_party/blink/renderer/core/html/portal/portal_contents.h index 4e8ed9a7..8f5b6ff 100644 --- a/third_party/blink/renderer/core/html/portal/portal_contents.h +++ b/third_party/blink/renderer/core/html/portal/portal_contents.h
@@ -15,6 +15,7 @@ #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/portal/portal.mojom-blink.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -115,7 +116,9 @@ absl::optional<PortalToken> portal_token_; // Both of these will be reset once Destroy has been called. + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::Portal> remote_portal_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::PortalClient> portal_client_receiver_; };
diff --git a/third_party/blink/renderer/core/html/portal/portal_host.h b/third_party/blink/renderer/core/html/portal/portal_host.h index 9a1fa45..9fc0f29 100644 --- a/third_party/blink/renderer/core/html/portal/portal_host.h +++ b/third_party/blink/renderer/core/html/portal/portal_host.h
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/events/event_target.h" #include "third_party/blink/renderer/platform/supplementable.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -56,6 +57,7 @@ private: mojom::blink::PortalHost& GetPortalHostInterface(); + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::PortalHost> portal_host_; };
diff --git a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc index 3715244..c7f3a46 100644 --- a/third_party/blink/renderer/core/inspector/inspector_network_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_network_agent.cc
@@ -59,8 +59,9 @@ #include "third_party/blink/renderer/bindings/core/v8/capture_source_location.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/scriptable_document_parser.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/html/html_frame_owner_element.h" @@ -191,7 +192,7 @@ class InspectorFileReaderLoaderClient final : public GarbageCollected<InspectorFileReaderLoaderClient>, - public FileReaderClient { + public FileReaderLoaderClient { public: InspectorFileReaderLoaderClient( scoped_refptr<BlobDataHandle> blob, @@ -200,8 +201,10 @@ : blob_(std::move(blob)), callback_(std::move(callback)), loader_( - MakeGarbageCollected<FileReaderLoader>(this, - std::move(task_runner))) {} + MakeGarbageCollected<FileReaderLoader>(FileReadType::kReadByClient, + this, + std::move(task_runner))), + keep_alive_(this) {} InspectorFileReaderLoaderClient(const InspectorFileReaderLoaderClient&) = delete; @@ -215,16 +218,13 @@ loader_->Start(blob_); } - FileErrorCode DidStartLoading(uint64_t, uint64_t) override { - return FileErrorCode::kOK; - } + void DidStartLoading() override {} - FileErrorCode DidReceiveData(const char* data, + void DidReceiveDataForClient(const char* data, unsigned data_length) override { if (!data_length) - return FileErrorCode::kOK; + return; raw_data_->Append(data, data_length); - return FileErrorCode::kOK; } void DidFinishLoading() override { Done(raw_data_); } @@ -232,16 +232,14 @@ void DidFail(FileErrorCode) override { Done(nullptr); } void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(loader_); } private: void Done(scoped_refptr<SharedBuffer> output) { std::move(callback_).Run(output); - // FileReaderLoader holds `this` as a member, so clearing it here will - // trigger both its garbage collection and ours. - loader_ = nullptr; + keep_alive_.Clear(); } scoped_refptr<BlobDataHandle> blob_; @@ -250,6 +248,7 @@ base::OnceCallback<void(scoped_refptr<SharedBuffer>)> callback_; Member<FileReaderLoader> loader_; scoped_refptr<SharedBuffer> raw_data_; + SelfKeepAlive<InspectorFileReaderLoaderClient> keep_alive_; }; static void ResponseBodyFileReaderLoaderDone(
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc index 6f1f76c..58b40e4 100644 --- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -103,8 +103,9 @@ bool ParseQuad(std::unique_ptr<protocol::Array<double>> quad_array, gfx::QuadF* quad) { const size_t kCoordinatesInQuad = 8; - if (!quad_array || quad_array->size() != kCoordinatesInQuad) + if (!quad_array || quad_array->size() != kCoordinatesInQuad) { return false; + } quad->set_p1(gfx::PointF((*quad_array)[0], (*quad_array)[1])); quad->set_p2(gfx::PointF((*quad_array)[2], (*quad_array)[3])); quad->set_p3(gfx::PointF((*quad_array)[4], (*quad_array)[5])); @@ -168,14 +169,17 @@ bool InspectTool::HandleMouseEvent(const WebMouseEvent& mouse_event, bool* swallow_next_mouse_up) { - if (mouse_event.GetType() == WebInputEvent::Type::kMouseMove) + if (mouse_event.GetType() == WebInputEvent::Type::kMouseMove) { return HandleMouseMove(mouse_event); + } - if (mouse_event.GetType() == WebInputEvent::Type::kMouseDown) + if (mouse_event.GetType() == WebInputEvent::Type::kMouseDown) { return HandleMouseDown(mouse_event, swallow_next_mouse_up); + } - if (mouse_event.GetType() == WebInputEvent::Type::kMouseUp) + if (mouse_event.GetType() == WebInputEvent::Type::kMouseUp) { return HandleMouseUp(mouse_event); + } return false; } @@ -266,15 +270,17 @@ layer_->SetHitTestable(false); } ~InspectorPageOverlayDelegate() override { - if (layer_) + if (layer_) { layer_->ClearClient(); + } } void PaintFrameOverlay(const FrameOverlay& frame_overlay, GraphicsContext& graphics_context, const gfx::Size& size) const override { - if (!overlay_->IsVisible()) + if (!overlay_->IsVisible()) { return; + } overlay_->PaintOverlayPage(); @@ -296,8 +302,9 @@ void Invalidate() override { overlay_->GetFrame()->View()->SetVisualViewportOrOverlayNeedsRepaint(); - if (layer_) + if (layer_) { layer_->SetNeedsDisplay(); + } } const cc::Layer* GetLayer() const { return layer_.get(); } @@ -416,8 +423,9 @@ } void InspectorOverlayAgent::Restore() { - if (enabled_.Get()) + if (enabled_.Get()) { enable(); + } setShowAdHighlights(show_ad_highlights_.Get()); setShowDebugBorders(show_debug_borders_.Get()); setShowFPSCounter(show_fps_counter_.Get()); @@ -436,8 +444,9 @@ } protocol::Response InspectorOverlayAgent::enable() { - if (!dom_agent_->Enabled()) + if (!dom_agent_->Enabled()) { return protocol::Response::ServerError("DOM should be enabled first"); + } enabled_.Set(true); if (backend_node_id_to_inspect_) { GetFrontend()->inspectNodeRequested( @@ -477,8 +486,9 @@ resize_timer_.Stop(); resize_timer_active_ = false; - if (frame_overlay_) + if (frame_overlay_) { frame_overlay_.Release()->Destroy(); + } persistent_tool_ = nullptr; PickTheRightTool(); @@ -497,15 +507,17 @@ show_debug_borders_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); - if (show) + if (show) { debug_state.show_debug_borders.set(); - else + } else { debug_state.show_debug_borders.reset(); + } widget->SetLayerTreeDebugState(debug_state); return protocol::Response::Success(); } @@ -514,8 +526,9 @@ show_fps_counter_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); @@ -528,8 +541,9 @@ show_paint_rects_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); @@ -542,8 +556,9 @@ show_layout_shift_regions_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); @@ -557,8 +572,9 @@ show_scroll_bottleneck_rects_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); @@ -585,8 +601,9 @@ show_web_vitals_.Set(show); if (show) { protocol::Response response = CompositingEnabled(); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } } FrameWidget* widget = GetFrame()->GetWidgetForLocalRoot(); cc::LayerTreeDebugState debug_state = widget->GetLayerTreeDebugState(); @@ -622,8 +639,9 @@ Maybe<protocol::DOM::RGBA> color, Maybe<protocol::DOM::RGBA> outline_color) { std::unique_ptr<gfx::QuadF> quad = std::make_unique<gfx::QuadF>(); - if (!ParseQuad(std::move(quad_array), quad.get())) + if (!ParseQuad(std::move(quad_array), quad.get())) { return protocol::Response::ServerError("Invalid Quad format"); + } return SetInspectTool(MakeGarbageCollected<QuadHighlightTool>( this, GetFrontend(), std::move(quad), InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr)), @@ -635,8 +653,9 @@ // Hide the hinge when called without a configuration. if (!tool_config.isJust()) { hinge_ = nullptr; - if (!inspect_tool_) + if (!inspect_tool_) { DisableFrameOverlay(); + } ScheduleUpdate(); return protocol::Response::Success(); } @@ -648,8 +667,9 @@ int y = rect->getY(); int width = rect->getWidth(); int height = rect->getHeight(); - if (x < 0 || y < 0 || width < 0 || height < 0) + if (x < 0 || y < 0 || width < 0 || height < 0) { return protocol::Response::InvalidParams("Invalid hinge rectangle."); + } // Use default color if a content color is not provided. Color content_color = @@ -685,8 +705,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(node_id, backend_node_id, object_id, node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } if (node->GetDocument().Lifecycle().GetState() <= DocumentLifecycle::LifecycleState::kInactive) { @@ -697,8 +718,9 @@ std::unique_ptr<InspectorHighlightConfig> highlight_config; response = HighlightConfigFromInspectorObject( std::move(highlight_inspector_object), &highlight_config); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } return SetInspectTool(MakeGarbageCollected<NodeHighlightTool>( this, GetFrontend(), node, selector_list.fromMaybe(String()), @@ -720,8 +742,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(config->getNodeId(), node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert(node, InspectorOverlayAgent::ToGridHighlightConfig( config->getGridHighlightConfig())); } @@ -750,8 +773,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(config->getNodeId(), node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert(node, InspectorOverlayAgent::ToFlexContainerHighlightConfig( config->getFlexContainerHighlightConfig())); } @@ -781,8 +805,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(config->getNodeId(), node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert(node, InspectorOverlayAgent::ToScrollSnapContainerHighlightConfig( config->getScrollSnapContainerHighlightConfig())); @@ -813,8 +838,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(config->getNodeId(), node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert( node, InspectorOverlayAgent::ToContainerQueryContainerHighlightConfig( config->getContainerQueryContainerHighlightConfig())); @@ -847,8 +873,9 @@ // Isolation mode can only be triggered on elements protocol::Response response = dom_agent_->AssertElement(config->getNodeId(), element); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert(element, InspectorOverlayAgent::ToIsolationModeHighlightConfig( config->getIsolationModeHighlightConfig(), idx)); @@ -871,8 +898,9 @@ Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(node_id, backend_node_id, object_id, node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } InspectorSourceOrderConfig config = SourceOrderConfigFromInspectorObject( std::move(source_order_inspector_object)); @@ -890,8 +918,9 @@ LocalFrame* frame = IdentifiersFactory::FrameById(inspected_frames_, frame_id); // FIXME: Inspector doesn't currently work cross process. - if (!frame) + if (!frame) { return protocol::Response::ServerError("Invalid frame id"); + } if (!frame->DeprecatedLocalOwner()) { PickTheRightTool(); return protocol::Response::Success(); @@ -911,8 +940,9 @@ } protocol::Response InspectorOverlayAgent::hideHighlight() { - if (inspect_tool_ && inspect_tool_->HideOnHideHighlight()) + if (inspect_tool_ && inspect_tool_->HideOnHideHighlight()) { PickTheRightTool(); + } return protocol::Response::Success(); } @@ -926,8 +956,9 @@ std::unique_ptr<protocol::DictionaryValue>* result) { Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(node_id, node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } auto config = std::make_unique<InspectorHighlightConfig>( InspectorHighlight::DefaultConfig()); @@ -963,8 +994,9 @@ for (const int node_id : *node_ids) { Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(node_id, node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } configs.insert(node, std::make_unique<InspectorGridHighlightConfig>( InspectorHighlight::DefaultGridConfig())); } @@ -978,8 +1010,9 @@ std::unique_ptr<protocol::DictionaryValue>* result) { Node* node = nullptr; protocol::Response response = dom_agent_->AssertNode(node_id, node); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } auto config = std::make_unique<InspectorSourceOrderConfig>( InspectorSourceOrderHighlight::DefaultConfig()); @@ -990,18 +1023,21 @@ } void InspectorOverlayAgent::UpdatePrePaint() { - if (frame_overlay_) + if (frame_overlay_) { frame_overlay_->UpdatePrePaint(); + } } void InspectorOverlayAgent::PaintOverlay(GraphicsContext& context) { - if (frame_overlay_) + if (frame_overlay_) { frame_overlay_->Paint(context); + } } bool InspectorOverlayAgent::IsInspectorLayer(const cc::Layer* layer) const { - if (!frame_overlay_) + if (!frame_overlay_) { return false; + } return layer == static_cast<const InspectorPageOverlayDelegate*>( frame_overlay_->GetDelegate()) ->GetLayer(); @@ -1012,8 +1048,9 @@ } void InspectorOverlayAgent::DispatchBufferedTouchEvents() { - if (!inspect_tool_) + if (!inspect_tool_) { return; + } OverlayMainFrame()->GetEventHandler().DispatchBufferedTouchEvents(); } @@ -1023,8 +1060,9 @@ WebInputEventResult InspectorOverlayAgent::HandleInputEvent( const WebInputEvent& input_event) { - if (!enabled_.Get()) + if (!enabled_.Get()) { return WebInputEventResult::kNotHandled; + } if (input_event.GetType() == WebInputEvent::Type::kMouseUp && swallow_next_mouse_up_) { @@ -1034,8 +1072,9 @@ LocalFrame* frame = GetFrame(); if (!frame || !frame->View() || !frame->ContentLayoutObject() || - !inspect_tool_) + !inspect_tool_) { return WebInputEventResult::kNotHandled; + } bool handled = inspect_tool_->HandleInputEvent( frame_impl_->GetFrameView(), input_event, &swallow_next_mouse_up_); @@ -1126,8 +1165,9 @@ LocalFrameView* view = frame_impl_->GetFrameView(); LocalFrame* frame = GetFrame(); - if (!view || !frame) + if (!view || !frame) { return; + } LocalFrame* overlay_frame = OverlayMainFrame(); blink::VisualViewport& visual_viewport = @@ -1146,16 +1186,18 @@ if (inspect_tool_) { // Skip drawing persistent_tool_ on page scroll. - if (!(inspect_tool_ == persistent_tool_ && is_page_scrolling_)) + if (!(inspect_tool_ == persistent_tool_ && is_page_scrolling_)) { inspect_tool_->Draw(scale); + } if (persistent_tool_ && inspect_tool_->SupportsPersistentOverlays() && !is_page_scrolling_) { persistent_tool_->Draw(scale); } } - if (hinge_) + if (hinge_) { hinge_->Draw(scale); + } EvaluateInOverlay("drawingFinished", ""); @@ -1190,15 +1232,17 @@ float InspectorOverlayAgent::WindowToViewportScale() const { LocalFrame* frame = GetFrame(); - if (!frame) + if (!frame) { return 1.0f; + } return frame->GetPage()->GetChromeClient().WindowToViewportScalar(frame, 1.0f); } void InspectorOverlayAgent::LoadOverlayPageResource() { - if (overlay_page_) + if (overlay_page_) { return; + } ScriptForbiddenScope::AllowUserAgentScript allow_script; @@ -1341,17 +1385,8 @@ v8::Local<v8::Value> local_method(V8String(context->GetIsolate(), method)); v8::Local<v8::Value> local_argument( V8String(context->GetIsolate(), argument)); - bool property_created; - if (!params->CreateDataProperty(context, 0, local_method) - .To(&property_created) && - !property_created) { - NOTREACHED() << "CreateDataProperty should always succeed here."; - } - if (!params->CreateDataProperty(context, 1, local_argument) - .To(&property_created) && - !property_created) { - NOTREACHED() << "CreateDataProperty should always succeed here."; - } + params->CreateDataProperty(context, 0, local_method).Check(); + params->CreateDataProperty(context, 1, local_argument).Check(); args.push_back(params); v8::Local<v8::Value> v8_method; @@ -1433,8 +1468,9 @@ if (!main_frame || !frame_impl_->ViewImpl() ->GetPage() ->GetSettings() - .GetAcceleratedCompositingEnabled()) + .GetAcceleratedCompositingEnabled()) { return protocol::Response::ServerError("Compositing mode is not supported"); + } return protocol::Response::Success(); } @@ -1443,15 +1479,18 @@ } void InspectorOverlayAgent::Inspect(Node* inspected_node) { - if (!inspected_node) + if (!inspected_node) { return; + } Node* node = inspected_node; while (node && !node->IsElementNode() && !node->IsDocumentNode() && - !node->IsDocumentFragment()) + !node->IsDocumentFragment()) { node = node->ParentOrShadowHostNode(); - if (!node) + } + if (!node) { return; + } DOMNodeId backend_node_id = DOMNodeIds::IdForNode(node); if (!enabled_.Get()) { @@ -1481,8 +1520,9 @@ std::unique_ptr<InspectorHighlightConfig> config; protocol::Response response = HighlightConfigFromInspectorObject( std::move(highlight_inspector_object), &config); - if (!response.IsSuccess()) + if (!response.IsSuccess()) { return response; + } inspect_mode_.Set(mode); inspect_mode_protocol_config_.Set(serialized_config); PickTheRightTool(); @@ -1492,8 +1532,9 @@ void InspectorOverlayAgent::PickTheRightTool() { InspectTool* inspect_tool = nullptr; - if (persistent_tool_ && persistent_tool_->IsEmpty()) + if (persistent_tool_ && persistent_tool_->IsEmpty()) { persistent_tool_ = nullptr; + } String inspect_mode = inspect_mode_.Get(); if (inspect_mode == protocol::Overlay::InspectModeEnum::SearchForNode || @@ -1522,8 +1563,9 @@ } void InspectorOverlayAgent::DisableFrameOverlay() { - if (IsVisible() || !frame_overlay_) + if (IsVisible() || !frame_overlay_) { return; + } frame_overlay_.Release()->Destroy(); auto& client = GetFrame()->GetPage()->GetChromeClient(); @@ -1538,8 +1580,9 @@ } void InspectorOverlayAgent::EnsureEnableFrameOverlay() { - if (frame_overlay_) + if (frame_overlay_) { return; + } frame_overlay_ = MakeGarbageCollected<FrameOverlay>( GetFrame(), std::make_unique<InspectorPageOverlayDelegate>(*this)); @@ -1547,16 +1590,18 @@ void InspectorOverlayAgent::ClearInspectTool() { inspect_tool_ = nullptr; - if (!hinge_) + if (!hinge_) { DisableFrameOverlay(); + } } protocol::Response InspectorOverlayAgent::SetInspectTool( InspectTool* inspect_tool) { ClearInspectTool(); - if (!inspect_tool) + if (!inspect_tool) { return protocol::Response::Success(); + } if (!enabled_.Get()) { return protocol::Response::InvalidRequest( @@ -1565,8 +1610,9 @@ LocalFrameView* view = frame_impl_->GetFrameView(); LocalFrame* frame = GetFrame(); - if (!view || !frame) + if (!view || !frame) { return protocol::Response::InternalError(); + } inspect_tool_ = inspect_tool; // If the tool supports persistent overlays, the resources of the persistent
diff --git a/third_party/blink/renderer/core/layout/anchor_scroll_data.cc b/third_party/blink/renderer/core/layout/anchor_scroll_data.cc index 8f57d1e..825502dd 100644 --- a/third_party/blink/renderer/core/layout/anchor_scroll_data.cc +++ b/third_party/blink/renderer/core/layout/anchor_scroll_data.cc
@@ -92,6 +92,20 @@ return is_fixed_to_view ? nullptr : scroller_layer; } +const Vector<PhysicalScrollRange>* GetNonOverflowingScrollRanges( + const LayoutObject* layout_object) { + if (!layout_object || !layout_object->IsOutOfFlowPositioned()) { + return nullptr; + } + DCHECK(layout_object->IsBox()); + const auto& layout_results = To<LayoutBox>(layout_object)->GetLayoutResults(); + if (layout_results.empty()) { + return nullptr; + } + // TODO(crbug.com/1309178): Make sure it works when the box is fragmented. + return layout_results.front()->PositionFallbackNonOverflowingRanges(); +} + } // namespace AnchorScrollData::AnchorScrollData(Element* element) @@ -156,11 +170,14 @@ bool AnchorScrollData::IsFallbackPositionValid( const gfx::Vector2dF& new_accumulated_scroll_offset) const { - if (!non_overflowing_scroll_ranges_.size()) { + const Vector<PhysicalScrollRange>* non_overflowing_scroll_ranges = + GetNonOverflowingScrollRanges(owner_->GetLayoutObject()); + if (!non_overflowing_scroll_ranges || + non_overflowing_scroll_ranges->empty()) { return true; } - for (const PhysicalScrollRange& range : non_overflowing_scroll_ranges_) { + for (const PhysicalScrollRange& range : *non_overflowing_scroll_ranges) { if (range.Contains(accumulated_scroll_offset_) != range.Contains(new_accumulated_scroll_offset)) { return false;
diff --git a/third_party/blink/renderer/core/layout/anchor_scroll_data.h b/third_party/blink/renderer/core/layout/anchor_scroll_data.h index 06c5e85..77f4e21 100644 --- a/third_party/blink/renderer/core/layout/anchor_scroll_data.h +++ b/third_party/blink/renderer/core/layout/anchor_scroll_data.h
@@ -74,12 +74,6 @@ // as its AnchroScrollData. bool IsActive() const; - // For fallback position validation. - void SetNonOverflowingScrollRanges( - Vector<PhysicalScrollRange>&& non_overflowing_scroll_ranges) { - non_overflowing_scroll_ranges_ = std::move(non_overflowing_scroll_ranges); - } - // ScrollSnapshotClient: void UpdateSnapshot() override; bool ValidateSnapshot() override; @@ -113,13 +107,6 @@ // Sum of the scroll origins of the above scroll containers. Used by // compositor to deal with writing modes. gfx::Vector2d accumulated_scroll_origin_; - - // TODO(crbug.com/1371217): Pass these ranges to compositor, so that - // compositor doesn't need to always trigger a main frame on every scroll, but - // only when the element overflows the container. See also crbug.com/1381276. - - // See documentation of non-overflowing ranges above. - Vector<PhysicalScrollRange> non_overflowing_scroll_ranges_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni index 927a373..cdaa473f 100644 --- a/third_party/blink/renderer/core/layout/build.gni +++ b/third_party/blink/renderer/core/layout/build.gni
@@ -169,7 +169,6 @@ "layout_word_break.h", "line/abstract_inline_text_box.cc", "line/abstract_inline_text_box.h", - "line/glyph_overflow.h", "line/line_orientation_utils.cc", "line/line_orientation_utils.h", "list_marker.cc", @@ -542,6 +541,8 @@ "ng/table/ng_table_row_layout_algorithm.h", "ng/table/ng_table_section_layout_algorithm.cc", "ng/table/ng_table_section_layout_algorithm.h", + "outline_rect_collector.cc", + "outline_rect_collector.h", "overflow_model.h", "pointer_events_hit_rules.cc", "pointer_events_hit_rules.h", @@ -638,7 +639,6 @@ "text_run_constructor.h", "traced_layout_object.cc", "traced_layout_object.h", - "vertical_position_cache.h", "view_fragmentation_context.cc", "view_fragmentation_context.h", ] @@ -778,6 +778,7 @@ "ng/svg/ng_svg_text_layout_algorithm_test.cc", "ng/svg/ng_svg_text_layout_attributes_builder_test.cc", "ng/table/ng_table_layout_algorithm_helpers_test.cc", + "outline_rect_collector_test.cc", "overflow_model_test.cc", "paint_containment_test.cc", "scroll_anchor_test.cc",
diff --git a/third_party/blink/renderer/core/layout/geometry/physical_size.cc b/third_party/blink/renderer/core/layout/geometry/physical_size.cc index 6c76a897..d0f042a 100644 --- a/third_party/blink/renderer/core/layout/geometry/physical_size.cc +++ b/third_party/blink/renderer/core/layout/geometry/physical_size.cc
@@ -14,7 +14,9 @@ DCHECK_GT(aspect_ratio.height, 0); const LayoutUnit constrained_height = width.MulDiv(aspect_ratio.height, aspect_ratio.width); - if ((constrained_height > height) != (fit == kAspectRatioFitGrow)) { + const bool grow = fit == kAspectRatioFitGrow; + if ((grow && constrained_height < height) || + (!grow && constrained_height > height)) { const LayoutUnit constrained_width = height.MulDiv(aspect_ratio.width, aspect_ratio.height); return {constrained_width, height};
diff --git a/third_party/blink/renderer/core/layout/geometry/physical_size_test.cc b/third_party/blink/renderer/core/layout/geometry/physical_size_test.cc index 48837fc..16b000f2 100644 --- a/third_party/blink/renderer/core/layout/geometry/physical_size_test.cc +++ b/third_party/blink/renderer/core/layout/geometry/physical_size_test.cc
@@ -17,6 +17,13 @@ EXPECT_EQ(PhysicalSize(1000, 800), PhysicalSize(1000, 2000) .FitToAspectRatio(aspect_ratio, kAspectRatioFitShrink)); + + PhysicalSize aspect_ratio2(1140, 696); + PhysicalSize ref_size( + LayoutUnit(350), + LayoutUnit(350).MulDiv(aspect_ratio2.height, aspect_ratio2.width)); + EXPECT_EQ(ref_size, + ref_size.FitToAspectRatio(aspect_ratio2, kAspectRatioFitShrink)); } TEST(PhysicalSizeTest, FitToAspectRatioGrow) { @@ -27,6 +34,13 @@ EXPECT_EQ(PhysicalSize(2500, 2000), PhysicalSize(1000, 2000) .FitToAspectRatio(aspect_ratio, kAspectRatioFitGrow)); + + PhysicalSize aspect_ratio2(1140, 696); + PhysicalSize ref_size( + LayoutUnit(350), + LayoutUnit(350).MulDiv(aspect_ratio2.height, aspect_ratio2.width)); + EXPECT_EQ(ref_size, + ref_size.FitToAspectRatio(aspect_ratio2, kAspectRatioFitGrow)); } } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc index 8e9d3d4..4ea8f4ddb 100644 --- a/third_party/blink/renderer/core/layout/layout_block.cc +++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -1195,7 +1195,7 @@ return caret_rect; } -void LayoutBlock::AddOutlineRects(Vector<PhysicalRect>& rects, +void LayoutBlock::AddOutlineRects(OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { @@ -1209,17 +1209,19 @@ } #endif // DCHECK_IS_ON() - if (!IsAnonymous()) // For anonymous blocks, the children add outline rects. - rects.emplace_back(additional_offset, Size()); + // For anonymous blocks, the children add outline rects. + if (!IsAnonymous()) { + collector.AddRect(PhysicalRect(additional_offset, Size())); + } if (ShouldIncludeBlockVisualOverflow(include_block_overflows) && !HasNonVisibleOverflow() && !HasControlClip()) { - AddOutlineRectsForNormalChildren(rects, additional_offset, + AddOutlineRectsForNormalChildren(collector, additional_offset, include_block_overflows); if (TrackedLayoutBoxLinkedHashSet* positioned_objects = PositionedObjects()) { for (const auto& box : *positioned_objects) - AddOutlineRectsForDescendant(*box, rects, additional_offset, + AddOutlineRectsForDescendant(*box, collector, additional_offset, include_block_overflows); } }
diff --git a/third_party/blink/renderer/core/layout/layout_block.h b/third_party/blink/renderer/core/layout/layout_block.h index dccabfcf..b339dfca 100644 --- a/third_party/blink/renderer/core/layout/layout_block.h +++ b/third_party/blink/renderer/core/layout/layout_block.h
@@ -290,7 +290,7 @@ void AddVisualOverflowFromChildren(); virtual void AddVisualOverflowFromBlockChildren(); - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const override;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 9cde4539..62113f2 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -94,7 +94,6 @@ #include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/scrolling/snap_coordinator.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/object_paint_invalidator.h" #include "third_party/blink/renderer/core/paint/outline_painter.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" @@ -1613,12 +1612,12 @@ return PhysicalRect(); } -void LayoutBox::AddOutlineRects(Vector<PhysicalRect>& rects, +void LayoutBox::AddOutlineRects(OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType) const { NOT_DESTROYED(); - rects.emplace_back(additional_offset, Size()); + collector.AddRect(PhysicalRect(additional_offset, Size())); if (info) *info = OutlineInfo::GetFromStyle(StyleRef()); } @@ -2532,14 +2531,14 @@ void LayoutBox::Paint(const PaintInfo& paint_info) const { NOT_DESTROYED(); - BoxPainter(*this).Paint(paint_info); + NOTREACHED_NORETURN(); } void LayoutBox::PaintBoxDecorationBackground( const PaintInfo& paint_info, const PhysicalOffset& paint_offset) const { NOT_DESTROYED(); - BoxPainter(*this).PaintBoxDecorationBackground(paint_info, paint_offset); + NOTREACHED_NORETURN(); } PhysicalRect LayoutBox::BackgroundPaintedExtent() const { @@ -2668,7 +2667,7 @@ void LayoutBox::PaintMask(const PaintInfo& paint_info, const PhysicalOffset& paint_offset) const { NOT_DESTROYED(); - BoxPainter(*this).PaintMask(paint_info, paint_offset); + NOTREACHED_NORETURN(); } void LayoutBox::ImageChanged(WrappedImagePtr image,
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index ecfa6049..d9e245f 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -486,7 +486,7 @@ ClientHeight() - ComputedCSSPaddingTop() - ComputedCSSPaddingBottom()); } - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const override;
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 b0b6e0c..d617722 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
@@ -386,7 +386,7 @@ } void LayoutBoxModelObject::AddOutlineRectsForNormalChildren( - Vector<PhysicalRect>& rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { NOT_DESTROYED(); @@ -397,14 +397,14 @@ if (child->IsOutOfFlowPositioned()) continue; - AddOutlineRectsForDescendant(*child, rects, additional_offset, + AddOutlineRectsForDescendant(*child, collector, additional_offset, include_block_overflows); } } void LayoutBoxModelObject::AddOutlineRectsForDescendant( const LayoutObject& descendant, - Vector<PhysicalRect>& rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { NOT_DESTROYED(); @@ -413,18 +413,18 @@ } if (descendant.HasLayer()) { - Vector<PhysicalRect> layer_outline_rects; - descendant.AddOutlineRects(layer_outline_rects, nullptr, PhysicalOffset(), + OutlineRectCollector* descendant_collector = + collector.ForDescendantCollector(); + descendant.AddOutlineRects(*descendant_collector, nullptr, PhysicalOffset(), include_block_overflows); - descendant.LocalToAncestorRects(layer_outline_rects, this, PhysicalOffset(), - additional_offset); - rects.AppendVector(layer_outline_rects); + collector.Combine(descendant_collector, descendant, this, + additional_offset); return; } if (descendant.IsBox()) { descendant.AddOutlineRects( - rects, nullptr, + collector, nullptr, additional_offset + To<LayoutBox>(descendant).PhysicalLocation(), include_block_overflows); return; @@ -438,12 +438,12 @@ // So the LayoutInline needs to add rects for children and continuations // only. To<LayoutInline>(descendant) - .AddOutlineRectsForNormalChildren(rects, additional_offset, + .AddOutlineRectsForNormalChildren(collector, additional_offset, include_block_overflows); return; } - descendant.AddOutlineRects(rects, nullptr, additional_offset, + descendant.AddOutlineRects(collector, nullptr, additional_offset, include_block_overflows); }
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.h b/third_party/blink/renderer/core/layout/layout_box_model_object.h index 7b62cb8..098d29e 100644 --- a/third_party/blink/renderer/core/layout/layout_box_model_object.h +++ b/third_party/blink/renderer/core/layout/layout_box_model_object.h
@@ -550,7 +550,7 @@ void RecalcVisualOverflow() override; - void AddOutlineRectsForNormalChildren(Vector<PhysicalRect>&, + void AddOutlineRectsForNormalChildren(OutlineRectCollector&, const PhysicalOffset& additional_offset, NGOutlineType) const; @@ -568,7 +568,7 @@ const Length& logical_height) const; void AddOutlineRectsForDescendant(const LayoutObject& descendant, - Vector<PhysicalRect>&, + OutlineRectCollector&, const PhysicalOffset& additional_offset, NGOutlineType) const;
diff --git a/third_party/blink/renderer/core/layout/layout_flow_thread.cc b/third_party/blink/renderer/core/layout/layout_flow_thread.cc index 40694ec..a3054b5 100644 --- a/third_party/blink/renderer/core/layout/layout_flow_thread.cc +++ b/third_party/blink/renderer/core/layout/layout_flow_thread.cc
@@ -184,13 +184,14 @@ } void LayoutFlowThread::AddOutlineRects( - Vector<PhysicalRect>& rects, + OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { NOT_DESTROYED(); Vector<PhysicalRect> rects_in_flowthread; - LayoutBlockFlow::AddOutlineRects(rects_in_flowthread, info, additional_offset, + UnionOutlineRectCollector flow_collector; + LayoutBlockFlow::AddOutlineRects(flow_collector, info, additional_offset, include_block_overflows); // Convert the rectangles from the flow thread coordinate space to the visual // space. The approach here is very simplistic; just calculate a bounding box @@ -201,8 +202,8 @@ // block direction anyway. As far as the inline direction (the column // progression direction) is concerned, we'll just include the full height of // each column involved. Should be good enough. - rects.push_back(PhysicalRectToBeNoop( - FragmentsBoundingBox(UnionRect(rects_in_flowthread).ToLayoutRect()))); + collector.AddRect(PhysicalRectToBeNoop( + FragmentsBoundingBox(flow_collector.Rect().ToLayoutRect()))); } bool LayoutFlowThread::NodeAtPoint(HitTestResult& result,
diff --git a/third_party/blink/renderer/core/layout/layout_flow_thread.h b/third_party/blink/renderer/core/layout/layout_flow_thread.h index ba02b1832..3d2d6e0 100644 --- a/third_party/blink/renderer/core/layout/layout_flow_thread.h +++ b/third_party/blink/renderer/core/layout/layout_flow_thread.h
@@ -124,7 +124,7 @@ Vector<gfx::QuadF>&, MapCoordinatesFlags mode = 0); - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const override;
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index bc503563..24ae534 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -834,24 +834,24 @@ LayoutUnit outline_outset(OutlinePainter::OutlineOutsetExtent( style, OutlineInfo::GetFromStyle(style))); if (outline_outset) { - Vector<PhysicalRect> rects; + UnionOutlineRectCollector collector; if (GetDocument().InNoQuirksMode()) { // We have already included outline extents of line boxes in // linesVisualOverflowBoundingBox(), so the following just add outline // rects for children and continuations. AddOutlineRectsForNormalChildren( - rects, PhysicalOffset(), + collector, PhysicalOffset(), style.OutlineRectsShouldIncludeBlockVisualOverflow()); } else { // In non-standard mode, because the difference in // LayoutBlock::minLineHeightForReplacedObject(), // linesVisualOverflowBoundingBox() may not cover outline rects of lines // containing replaced objects. - AddOutlineRects(rects, nullptr, PhysicalOffset(), + AddOutlineRects(collector, nullptr, PhysicalOffset(), style.OutlineRectsShouldIncludeBlockVisualOverflow()); } - if (!rects.empty()) { - PhysicalRect outline_rect = UnionRect(rects); + if (!collector.Rect().IsEmpty()) { + PhysicalRect outline_rect = collector.Rect(); outline_rect.Inflate(outline_outset); overflow_rect.Unite(outline_rect); } @@ -993,7 +993,7 @@ } void LayoutInline::AddOutlineRects( - Vector<PhysicalRect>& rects, + OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { @@ -1007,12 +1007,12 @@ } #endif // DCHECK_IS_ON() - CollectLineBoxRects([&rects, &additional_offset](const PhysicalRect& r) { + CollectLineBoxRects([&collector, &additional_offset](const PhysicalRect& r) { auto rect = r; rect.Move(additional_offset); - rects.push_back(rect); + collector.AddRect(rect); }); - AddOutlineRectsForNormalChildren(rects, additional_offset, + AddOutlineRectsForNormalChildren(collector, additional_offset, include_block_overflows); if (info) { *info = OutlineInfo::GetFromStyle(StyleRef()); @@ -1038,9 +1038,11 @@ gfx::RectF LayoutInline::LocalBoundingBoxRectForAccessibility() const { NOT_DESTROYED(); - Vector<PhysicalRect> rects = OutlineRects( - nullptr, PhysicalOffset(), NGOutlineType::kIncludeBlockVisualOverflow); - return gfx::RectF(FlipForWritingMode(UnionRect(rects).ToLayoutRect())); + UnionOutlineRectCollector collector; + AddOutlineRects(collector, nullptr, PhysicalOffset(), + NGOutlineType::kIncludeBlockVisualOverflow); + + return gfx::RectF(FlipForWritingMode(collector.Rect().ToLayoutRect())); } void LayoutInline::AddAnnotatedRegions(Vector<AnnotatedRegionValue>& regions) {
diff --git a/third_party/blink/renderer/core/layout/layout_inline.h b/third_party/blink/renderer/core/layout/layout_inline.h index d18ebd4e..72c5e44a 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.h +++ b/third_party/blink/renderer/core/layout/layout_inline.h
@@ -161,7 +161,7 @@ void ClearFirstInlineFragmentItemIndex() final; void SetFirstInlineFragmentItemIndex(wtf_size_t) final; - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const override;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 642310e4..a472a1a 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -4855,6 +4855,7 @@ Vector<PhysicalRect> outline_rects; PhysicalOffset paint_offset = iterator.GetFragmentData()->PaintOffset(); + VectorOutlineRectCollector collector; if (iterator.Cursor()) { wtf_size_t fragment_index = iterator.Cursor()->ContainerFragmentIndex(); do { @@ -4864,23 +4865,25 @@ if (const NGPhysicalBoxFragment* box_fragment = item->BoxFragment()) { box_fragment->AddSelfOutlineRects( paint_offset + item->OffsetInContainerFragment(), outline_type, - &outline_rects, nullptr); + collector, nullptr); } else { PhysicalRect rect; rect = item->RectInContainerFragment(); rect.Move(paint_offset); - outline_rects.push_back(rect); + collector.AddRect(rect); } // Keep going as long as we're within the same container fragment. If // we're block-fragmented, there will be multiple container fragments, // each with their own FragmentData object. } while (iterator.Advance() && iterator.Cursor()->ContainerFragmentIndex() == fragment_index); + outline_rects = collector.TakeRects(); } else { if (const NGPhysicalBoxFragment* box_fragment = iterator.GetPhysicalBoxFragment()) { - box_fragment->AddSelfOutlineRects(paint_offset, outline_type, - &outline_rects, nullptr); + box_fragment->AddSelfOutlineRects(paint_offset, outline_type, collector, + nullptr); + outline_rects = collector.TakeRects(); } else { outline_rects = OutlineRects(nullptr, paint_offset, outline_type); } @@ -4895,9 +4898,9 @@ const PhysicalOffset& additional_offset, NGOutlineType outline_type) const { NOT_DESTROYED(); - Vector<PhysicalRect> outline_rects; - AddOutlineRects(outline_rects, info, additional_offset, outline_type); - return outline_rects; + VectorOutlineRectCollector collector; + AddOutlineRects(collector, info, additional_offset, outline_type); + return collector.TakeRects(); } void LayoutObject::SetModifiedStyleOutsideStyleRecalc(
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h index c01cff1..0bcf74d 100644 --- a/third_party/blink/renderer/core/layout/layout_object.h +++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -51,6 +51,7 @@ #include "third_party/blink/renderer/core/layout/min_max_sizes.h" #include "third_party/blink/renderer/core/layout/ng/ng_outline_type.h" #include "third_party/blink/renderer/core/layout/ng/ng_style_variant.h" +#include "third_party/blink/renderer/core/layout/outline_rect_collector.h" #include "third_party/blink/renderer/core/layout/subtree_layout_scope.h" #include "third_party/blink/renderer/core/loader/resource/image_resource_observer.h" #include "third_party/blink/renderer/core/paint/fragment_data.h" @@ -2920,7 +2921,7 @@ // the outside of, even if the object isn't styled with a outline for now. // The rects also cover continuations. Note that the OutlineInfo, if // specified, is filled in in the same space as the rects. - virtual void AddOutlineRects(Vector<PhysicalRect>&, + virtual void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const {
diff --git a/third_party/blink/renderer/core/layout/layout_text.cc b/third_party/blink/renderer/core/layout/layout_text.cc index 34ff7875..9fa8091e 100644 --- a/third_party/blink/renderer/core/layout/layout_text.cc +++ b/third_party/blink/renderer/core/layout/layout_text.cc
@@ -50,7 +50,6 @@ #include "third_party/blink/renderer/core/layout/layout_object_inlines.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/line/abstract_inline_text_box.h" -#include "third_party/blink/renderer/core/layout/line/glyph_overflow.h" #include "third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_abstract_inline_text_box.h" #include "third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h"
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc index c4ebe7a..216b1a0 100644 --- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc +++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -123,11 +123,6 @@ return ts << "width=" << s.width() << " height=" << s.height(); } -WTF::TextStream& operator<<(WTF::TextStream& ts, const gfx::Rect& r) { - return ts << "at " << r.origin() << " size " << r.width() << "x" - << r.height(); -} - WTF::TextStream& operator<<(WTF::TextStream& ts, const gfx::SizeF& s) { ts << "width=" << WTF::TextStream::FormatNumberRespectingIntegers(s.width()); ts << " height=" @@ -475,17 +470,12 @@ static void Write(WTF::TextStream& ts, PaintLayer& layer, - const PhysicalRect& layer_bounds, - const PhysicalRect& background_clip_rect, - const PhysicalRect& clip_rect, + const PhysicalOffset& layer_offset, LayerPaintPhase paint_phase = kLayerPaintPhaseAll, int indent = 0, LayoutAsTextBehavior behavior = kLayoutAsTextBehaviorNormal, const PaintLayer* marked_layer = nullptr) { - gfx::Rect adjusted_layout_bounds = ToPixelSnappedRect(layer_bounds); - gfx::Rect adjusted_background_clip_rect = - ToPixelSnappedRect(background_clip_rect); - gfx::Rect adjusted_clip_rect = ToPixelSnappedRect(clip_rect); + gfx::Point adjusted_layer_offset = ToRoundedPoint(layer_offset); if (marked_layer) ts << (marked_layer == &layer ? "*" : " "); @@ -500,14 +490,8 @@ if (behavior & kLayoutAsTextShowAddresses) ts << static_cast<const void*>(&layer) << " "; - ts << adjusted_layout_bounds; + ts << "at " << adjusted_layer_offset; - if (!adjusted_layout_bounds.IsEmpty()) { - if (!adjusted_background_clip_rect.Contains(adjusted_layout_bounds)) - ts << " backgroundClip " << adjusted_background_clip_rect; - if (!adjusted_clip_rect.Contains(adjusted_layout_bounds)) - ts << " clip " << adjusted_clip_rect; - } if (layer.Transform()) ts << " hasTransform"; if (layer.IsTransparent()) @@ -604,12 +588,10 @@ !layer->GetLayoutObject().ChildLayoutBlockedByDisplayLock(); const auto& neg_list = ChildLayers(layer, kNegativeZOrderChildren); - PhysicalRect layer_bounds(layer_offset, layer->Size()); bool paints_background_separately = !neg_list.empty(); if (should_dump && paints_background_separately) { - Write(ts, *layer, layer_bounds, background_rect.Rect(), - foreground_rect.Rect(), kLayerPaintPhaseBackground, indent, behavior, - marked_layer); + Write(ts, *layer, layer_offset, kLayerPaintPhaseBackground, indent, + behavior, marked_layer); } if (should_dump_children && !neg_list.empty()) { @@ -626,8 +608,7 @@ } if (should_dump) { - Write(ts, *layer, layer_bounds, background_rect.Rect(), - foreground_rect.Rect(), + Write(ts, *layer, layer_offset, paints_background_separately ? kLayerPaintPhaseForeground : kLayerPaintPhaseAll, indent, behavior, marked_layer);
diff --git a/third_party/blink/renderer/core/layout/line/glyph_overflow.h b/third_party/blink/renderer/core/layout/line/glyph_overflow.h deleted file mode 100644 index 21527b17..0000000 --- a/third_party/blink/renderer/core/layout/line/glyph_overflow.h +++ /dev/null
@@ -1,79 +0,0 @@ -/* - * Copyright (C) 2000 Lars Knoll (knoll@kde.org) - * (C) 2000 Antti Koivisto (koivisto@kde.org) - * (C) 2000 Dirk Mueller (mueller@kde.org) - * Copyright (C) 2003, 2006, 2007, 2010, 2011 Apple Inc. All rights reserved. - * Copyright (C) 2008 Holger Hans Peter Freyther - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LINE_GLYPH_OVERFLOW_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LINE_GLYPH_OVERFLOW_H_ - -#include <algorithm> -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "ui/gfx/geometry/rect_f.h" - -namespace blink { - -struct GlyphOverflow { - GlyphOverflow() : left(0), right(0), top(0), bottom(0) {} - - bool IsApproximatelyZero() const { - // Overflow can be expensive so we try to avoid it. Small amounts of - // overflow is imperceptible and is typically masked by pixel snapping. - static const float kApproximatelyNoOverflow = 0.0625f; - return std::fabs(left) < kApproximatelyNoOverflow && - std::fabs(right) < kApproximatelyNoOverflow && - std::fabs(top) < kApproximatelyNoOverflow && - std::fabs(bottom) < kApproximatelyNoOverflow; - } - - // Compute GlyphOverflow from glyph bounding box. The |bounds| should be in - // logical coordinates, using alphabetic baseline. See ShapeResult::Bounds(). - void SetFromBounds(const gfx::RectF& bounds, - const Font& font, - float text_width) { - const SimpleFontData* font_data = font.PrimaryFont(); - DCHECK(font_data); - float ascent = 0; - float descent = 0; - if (font_data) { - FontBaseline baseline_type = kAlphabeticBaseline; - ascent = font_data->GetFontMetrics().FloatAscent(baseline_type); - descent = font_data->GetFontMetrics().FloatDescent(baseline_type); - } - top = std::max(0.0f, -bounds.y() - ascent); - bottom = std::max(0.0f, bounds.bottom() - descent); - left = std::max(0.0f, -bounds.x()); - right = std::max(0.0f, bounds.right() - text_width); - } - - // Top and bottom are the amounts of glyph overflows exceeding the font - // metrics' ascent and descent, respectively. Left and right are the amounts - // of glyph overflows exceeding the left and right edge of normal layout - // boundary, respectively. - float left; - float right; - float top; - float bottom; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_LINE_GLYPH_OVERFLOW_H_
diff --git a/third_party/blink/renderer/core/layout/ng/README.md b/third_party/blink/renderer/core/layout/ng/README.md index 3f786734..b0812d1 100644 --- a/third_party/blink/renderer/core/layout/ng/README.md +++ b/third_party/blink/renderer/core/layout/ng/README.md
@@ -49,6 +49,11 @@ TODO(layout-dev): Document with lots of pretty pictures. +All coordinates and sizes associated with an NGPhysicalFragment are physical, +i.e. pure left/top offsets from the parent fragment, and sizes are expressed +with widths and heights (not inline-size / block-size). No logical offsets or +sizes. Writing mode and direction are resolved during layout. + ### Constraint Spaces ### TODO(layout-dev): Document with lots of pretty pictures.
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h index 1e32a63..fd7b2ec 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_item.h
@@ -74,7 +74,8 @@ GridTrackSizingDirection track_direction) const { // TODO(ethavar): Baseline alignment for subgrids is dependent on // accumulating the baseline in `ComputeSubgridContributionSize`. - if (has_subgridded_columns || has_subgridded_rows) { + if (has_subgridded_columns || has_subgridded_rows || + is_subgridded_to_parent_grid) { return false; } return (track_direction == kForColumns)
diff --git a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc index 0e7217f..b177867 100644 --- a/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc +++ b/third_party/blink/renderer/core/layout/ng/inline/layout_ng_text_combine_test.cc
@@ -714,16 +714,17 @@ // Sample 1 with text-combine-upright:all const auto& sample1 = *GetLayoutObjectByElementId("t1"); - Vector<PhysicalRect> standard_outlines1; - sample1.AddOutlineRects(standard_outlines1, nullptr, PhysicalOffset(), + VectorOutlineRectCollector collector; + sample1.AddOutlineRects(collector, nullptr, PhysicalOffset(), NGOutlineType::kDontIncludeBlockVisualOverflow); + Vector<PhysicalRect> standard_outlines1 = collector.TakeRects(); EXPECT_THAT( standard_outlines1, ElementsAre(PhysicalRect(PhysicalOffset(0, 0), PhysicalSize(150, 200)))); - Vector<PhysicalRect> focus_outlines1; - sample1.AddOutlineRects(focus_outlines1, nullptr, PhysicalOffset(), + sample1.AddOutlineRects(collector, nullptr, PhysicalOffset(), NGOutlineType::kIncludeBlockVisualOverflow); + Vector<PhysicalRect> focus_outlines1 = collector.TakeRects(); EXPECT_THAT( focus_outlines1, ElementsAre( @@ -737,16 +738,16 @@ // Sample 1 without text-combine-upright:all const auto& sample2 = *GetLayoutObjectByElementId("t2"); - Vector<PhysicalRect> standard_outlines2; - sample2.AddOutlineRects(standard_outlines2, nullptr, PhysicalOffset(), + sample2.AddOutlineRects(collector, nullptr, PhysicalOffset(), NGOutlineType::kDontIncludeBlockVisualOverflow); + Vector<PhysicalRect> standard_outlines2 = collector.TakeRects(); EXPECT_THAT( standard_outlines2, ElementsAre(PhysicalRect(PhysicalOffset(0, 0), PhysicalSize(150, 100)))); - Vector<PhysicalRect> focus_outlines2; - sample1.AddOutlineRects(focus_outlines2, nullptr, PhysicalOffset(), + sample1.AddOutlineRects(collector, nullptr, PhysicalOffset(), NGOutlineType::kIncludeBlockVisualOverflow); + Vector<PhysicalRect> focus_outlines2 = collector.TakeRects(); EXPECT_THAT( focus_outlines2, ElementsAre(
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc index 50cb951..f8def7d7 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.cc
@@ -102,7 +102,7 @@ template <typename Base> void LayoutNGBlockFlowMixin<Base>::AddOutlineRects( - Vector<PhysicalRect>& rects, + OutlineRectCollector& collector, LayoutObject::OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows) const { @@ -114,12 +114,12 @@ const NGPhysicalBoxFragment* fragment = Base::GetPhysicalFragment(0); if (fragment->HasItems()) { fragment->AddSelfOutlineRects(additional_offset, include_block_overflows, - &rects, info); + collector, info); return; } } - Base::AddOutlineRects(rects, info, additional_offset, + Base::AddOutlineRects(collector, info, additional_offset, include_block_overflows); }
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h index 4a3d3145..bd9410b 100644 --- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h +++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow_mixin.h
@@ -61,7 +61,7 @@ void AddLayoutOverflowFromChildren() final; #endif - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, LayoutObject::OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const final;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc index 98d08a6..04e739f 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.cc
@@ -299,6 +299,7 @@ NGLayoutResult::RareData* NGLayoutResult::EnsureRareData() { if (!HasRareData()) { + DCHECK(!bitfields_.has_oof_positioned_offset); absl::optional<LayoutUnit> bfc_block_offset; if (!bitfields_.is_bfc_block_offset_nullopt) bfc_block_offset = bfc_offset_.block_offset;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h index e1e893a..1ea0ec8a 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_layout_result.h +++ b/third_party/blink/renderer/core/layout/ng/ng_layout_result.h
@@ -10,6 +10,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/geometry/scroll_offset_range.h" #include "third_party/blink/renderer/core/layout/ng/exclusions/ng_exclusion_space.h" #include "third_party/blink/renderer/core/layout/ng/flex/ng_flex_data.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h" @@ -151,6 +152,15 @@ return bitfields_.can_use_out_of_flow_positioned_first_tier_cache; } + absl::optional<wtf_size_t> PositionFallbackIndex() const { + return HasRareData() ? rare_data_->PositionFallbackIndex() : absl::nullopt; + } + const Vector<PhysicalScrollRange>* PositionFallbackNonOverflowingRanges() + const { + return HasRareData() ? rare_data_->PositionFallbackNonOverflowingRanges() + : nullptr; + } + // Get the path to the column spanner (if any) that interrupted column layout. const NGColumnSpannerPath* ColumnSpannerPath() const { if (HasRareData()) { @@ -467,6 +477,13 @@ layout_result_->oof_positioned_offset_ = offset; } + void SetPositionFallbackResult( + wtf_size_t fallback_index, + const Vector<PhysicalScrollRange>& non_overflowing_ranges) { + layout_result_->EnsureRareData()->SetPositionFallbackResult( + fallback_index, non_overflowing_ranges); + } + private: friend class NGLayoutResult; MutableForOutOfFlow(const NGLayoutResult* layout_result) @@ -560,8 +577,10 @@ using BfcBlockOffsetIsSetFlag = BitField::DefineFirstValue<bool, 1>; using LineBoxBfcBlockOffsetIsSetFlag = BfcBlockOffsetIsSetFlag::DefineNextValue<bool, 1>; + using PositionFallbackResultIsSetFlag = + LineBoxBfcBlockOffsetIsSetFlag::DefineNextValue<uint8_t, 1>; using DataUnionTypeValue = - LineBoxBfcBlockOffsetIsSetFlag::DefineNextValue<uint8_t, 3>; + PositionFallbackResultIsSetFlag::DefineNextValue<uint8_t, 3>; struct BlockData { GC_PLUGIN_IGNORE("crbug.com/1146383") @@ -618,6 +637,14 @@ return bit_field.set<LineBoxBfcBlockOffsetIsSetFlag>(flag); } + bool position_fallback_result_is_set() const { + return bit_field.get<PositionFallbackResultIsSetFlag>(); + } + + void set_position_fallback_result_is_set(bool flag) { + return bit_field.set<PositionFallbackResultIsSetFlag>(flag); + } + DataUnionType data_union_type() const { return static_cast<DataUnionType>( bit_field.get_concurrently<DataUnionTypeValue>()); @@ -704,6 +731,9 @@ lines_until_clamp(rare_data.lines_until_clamp), bfc_block_offset(rare_data.bfc_block_offset), line_box_bfc_block_offset(rare_data.line_box_bfc_block_offset), + position_fallback_index(rare_data.position_fallback_index), + position_fallback_non_overflowing_ranges( + rare_data.position_fallback_non_overflowing_ranges), bit_field(rare_data.bit_field) { switch (data_union_type()) { case kNone: @@ -782,6 +812,27 @@ return line_box_bfc_block_offset; } + void SetPositionFallbackResult( + wtf_size_t fallback_index, + const Vector<PhysicalScrollRange>& non_overflowing_ranges) { + position_fallback_index = fallback_index; + position_fallback_non_overflowing_ranges = non_overflowing_ranges; + set_position_fallback_result_is_set(true); + } + absl::optional<wtf_size_t> PositionFallbackIndex() const { + if (!position_fallback_result_is_set()) { + return absl::nullopt; + } + return position_fallback_index; + } + const Vector<PhysicalScrollRange>* PositionFallbackNonOverflowingRanges() + const { + if (!position_fallback_result_is_set()) { + return nullptr; + } + return &position_fallback_non_overflowing_ranges; + } + void Trace(Visitor* visitor) const; LayoutUnit bfc_line_offset; @@ -817,6 +868,10 @@ // Only valid if line_box_bfc_block_offset_is_set LayoutUnit line_box_bfc_block_offset; + // Only valid if position_fallback_result_is_set + wtf_size_t position_fallback_index; + Vector<PhysicalScrollRange> position_fallback_non_overflowing_ranges; + BitField bit_field; union {
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 03ebd72..90140bc 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
@@ -1569,17 +1569,20 @@ // If `@position-fallback` exists, let |TryCalculateOffset| check if the // result fits the available space. Element* element = DynamicTo<Element>(node_info.node.GetDOMNode()); + absl::optional<wtf_size_t> fallback_index; const ComputedStyle* next_fallback_style = nullptr; const LayoutObject* implicit_anchor = nullptr; - AnchorScrollData* anchor_scroll_data = nullptr; gfx::Vector2dF anchor_scroll_offset; if (element) { if (UNLIKELY(style->PositionFallback())) { DCHECK(RuntimeEnabledFeatures::CSSAnchorPositioningEnabled()); next_fallback_style = element->StyleForPositionFallback(0); - anchor_scroll_data = element->GetAnchorScrollData(); - if (anchor_scroll_data) { - anchor_scroll_offset = anchor_scroll_data->AccumulatedScrollOffset(); + if (next_fallback_style) { + fallback_index = 0; + } + if (element->GetAnchorScrollData()) { + anchor_scroll_offset = + element->GetAnchorScrollData()->AccumulatedScrollOffset(); } } if (element->ImplicitAnchorElement()) @@ -1588,13 +1591,13 @@ // See anchor_scroll_data.h for documentation of non-overflowing ranges. Vector<PhysicalScrollRange> non_overflowing_ranges; - wtf_size_t fallback_index = 0; absl::optional<OffsetInfo> offset_info; while (!offset_info) { if (next_fallback_style) { DCHECK(element); style = next_fallback_style; - next_fallback_style = element->StyleForPositionFallback(++fallback_index); + next_fallback_style = + element->StyleForPositionFallback(*fallback_index + 1); } const bool try_fit_available_space = next_fallback_style; @@ -1610,13 +1613,20 @@ offset_info = absl::nullopt; } } + + if (!offset_info) { + ++*fallback_index; + } } - if (anchor_scroll_data) { - // TODO(crbug.com/1418725): This should be stored on LayoutResult. Keeping - // layout results outside LayoutResult can cause issues. - anchor_scroll_data->SetNonOverflowingScrollRanges( - std::move(non_overflowing_ranges)); + + if (fallback_index) { + offset_info->fallback_index = fallback_index; + offset_info->non_overflowing_ranges = std::move(non_overflowing_ranges); + } else { + DCHECK(!offset_info->fallback_index); + DCHECK(offset_info->non_overflowing_ranges.empty()); } + return *offset_info; } @@ -1836,6 +1846,11 @@ node_info.node.Style().GetWritingDirection())); } + if (offset_info.fallback_index) { + layout_result->GetMutableForOutOfFlow().SetPositionFallbackResult( + *offset_info.fallback_index, offset_info.non_overflowing_ranges); + } + layout_result->GetMutableForOutOfFlow().SetOutOfFlowPositionedOffset( offset_info.offset, allow_first_tier_oof_cache_ && !offset_info.disable_first_tier_cache);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h index 9c8fe560..39a6194 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -9,6 +9,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/logical_rect.h" #include "third_party/blink/renderer/core/layout/geometry/physical_offset.h" +#include "third_party/blink/renderer/core/layout/geometry/scroll_offset_range.h" #include "third_party/blink/renderer/core/layout/ng/geometry/ng_static_position.h" #include "third_party/blink/renderer/core/layout/ng/inline/inline_containing_block_utils.h" #include "third_party/blink/renderer/core/layout/ng/ng_absolute_utils.h" @@ -33,7 +34,6 @@ struct NGLogicalOutOfFlowPositionedNode; template <typename OffsetType> struct NGMulticolWithPendingOOFs; -struct PhysicalScrollRange; // Helper class for positioning of out-of-flow blocks. // It should be used together with NGBoxFragmentBuilder. @@ -241,6 +241,11 @@ // This should only be used when laying out a fragmentainer descendant. LogicalOffset original_offset; + // These two fields are set only if this |OffsetInfo| is calculated from a + // @try rule of a @position-fallback rule. + absl::optional<wtf_size_t> fallback_index; + Vector<PhysicalScrollRange> non_overflowing_ranges; + void Trace(Visitor* visitor) const; };
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc index 5083e2e6..b1b1581 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -1290,13 +1290,13 @@ ink_overflow.Expand(style.BoxDecorationOutsets()); if (style.HasOutline() && IsOutlineOwner()) { - Vector<PhysicalRect> outline_rects; + UnionOutlineRectCollector collector; LayoutObject::OutlineInfo info; // The result rects are in coordinates of this object's border box. AddSelfOutlineRects(PhysicalOffset(), style.OutlineRectsShouldIncludeBlockVisualOverflow(), - &outline_rects, &info); - PhysicalRect rect = UnionRect(outline_rects); + collector, &info); + PhysicalRect rect = collector.Rect(); rect.Inflate(LayoutUnit(OutlinePainter::OutlineOutsetExtent(style, info))); ink_overflow.Unite(rect); } @@ -1312,7 +1312,7 @@ void NGPhysicalBoxFragment::AddSelfOutlineRects( const PhysicalOffset& additional_offset, NGOutlineType outline_type, - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, LayoutObject::OutlineInfo* info) const { if (info) { if (IsSvgText()) @@ -1327,27 +1327,27 @@ } AddOutlineRects(additional_offset, outline_type, - /* container_relative */ false, outline_rects); + /* container_relative */ false, collector); } void NGPhysicalBoxFragment::AddOutlineRects( const PhysicalOffset& additional_offset, NGOutlineType outline_type, - Vector<PhysicalRect>* outline_rects) const { + OutlineRectCollector& collector) const { AddOutlineRects(additional_offset, outline_type, - /* container_relative */ true, outline_rects); + /* container_relative */ true, collector); } void NGPhysicalBoxFragment::AddOutlineRects( const PhysicalOffset& additional_offset, NGOutlineType outline_type, bool inline_container_relative, - Vector<PhysicalRect>* outline_rects) const { + OutlineRectCollector& collector) const { DCHECK_EQ(PostLayout(), this); if (IsInlineBox()) { AddOutlineRectsForInlineBox(additional_offset, outline_type, - inline_container_relative, outline_rects); + inline_container_relative, collector); return; } DCHECK(IsOutlineOwner()); @@ -1356,11 +1356,11 @@ if (!IsAnonymousBlock()) { if (IsSvgText()) { if (const NGFragmentItems* items = Items()) { - outline_rects->emplace_back(PhysicalRect::EnclosingRect( + collector.AddRect(PhysicalRect::EnclosingRect( GetLayoutObject()->ObjectBoundingBox())); } } else { - outline_rects->emplace_back(additional_offset, Size().ToLayoutSize()); + collector.AddRect(PhysicalRect(additional_offset, Size().ToLayoutSize())); } } @@ -1372,15 +1372,11 @@ // additional_offset to be an offset from containing_block. // Since containing_block is our layout object, offset must be 0,0. // https://crbug.com/968019 - const wtf_size_t size_before = outline_rects->size(); + OutlineRectCollector* child_collector = collector.ForDescendantCollector(); AddOutlineRectsForNormalChildren( - outline_rects, PhysicalOffset(), outline_type, + *child_collector, PhysicalOffset(), outline_type, To<LayoutBoxModelObject>(GetLayoutObject())); - if (!additional_offset.IsZero()) { - for (PhysicalRect& rect : - base::make_span(*outline_rects).subspan(size_before)) - rect.offset += additional_offset; - } + collector.Combine(child_collector, additional_offset); if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type)) { for (const auto& child : PostLayoutChildren()) { @@ -1389,7 +1385,7 @@ } AddOutlineRectsForDescendant( - child, outline_rects, additional_offset, outline_type, + child, collector, additional_offset, outline_type, To<LayoutBoxModelObject>(GetLayoutObject())); } } @@ -1402,7 +1398,7 @@ PhysicalOffset additional_offset, NGOutlineType outline_type, bool container_relative, - Vector<PhysicalRect>* rects) const { + OutlineRectCollector& collector) const { DCHECK_EQ(PostLayout(), this); DCHECK(IsInlineBox()); @@ -1420,7 +1416,7 @@ DCHECK(GetLayoutObject()); DCHECK(GetLayoutObject()->IsLayoutInline()); const auto* layout_object = To<LayoutInline>(GetLayoutObject()); - const wtf_size_t initial_rects_size = rects->size(); + auto* cursor_collector = collector.ForDescendantCollector(); NGInlineCursor cursor(*container); cursor.MoveTo(*layout_object); DCHECK(cursor); @@ -1437,34 +1433,32 @@ if (!current.Size().IsZero()) { const NGPhysicalBoxFragment* fragment = current.BoxFragment(); DCHECK(fragment); - if (!fragment->IsOpaque() && !fragment->IsSvg()) - rects->push_back(current.RectInContainerFragment()); + if (!fragment->IsOpaque() && !fragment->IsSvg()) { + cursor_collector->AddRect(current.RectInContainerFragment()); + } } // Add descendants if any, in the container-relative coordinate. if (!current.HasChildren()) continue; NGInlineCursor descendants = cursor.CursorForDescendants(); - AddOutlineRectsForCursor(rects, PhysicalOffset(), outline_type, + AddOutlineRectsForCursor(*cursor_collector, PhysicalOffset(), outline_type, layout_object, &descendants); } #if DCHECK_IS_ON() DCHECK(has_this_fragment); #endif - DCHECK_GE(rects->size(), initial_rects_size); - if (rects->size() <= initial_rects_size) + // TODO(vmpstr): Is this correct? Should AddOutlineRectsForDescendants below + // be skipped? + if (cursor_collector->IsEmpty()) { return; + } // At this point, |rects| are in the container coordinate space. // Adjust the rectangles using |additional_offset| and |container_relative|. if (!container_relative) additional_offset -= this_offset_in_container; - if (!additional_offset.IsZero()) { - for (PhysicalRect& rect : - base::make_span(rects->begin() + initial_rects_size, rects->end())) { - rect.offset += additional_offset; - } - } + collector.Combine(cursor_collector, additional_offset); if (ShouldIncludeBlockVisualOverflowForAnchorOnly(outline_type) && !HasNonVisibleOverflow() && !HasControlClip(*this)) { @@ -1485,7 +1479,7 @@ continue; } - AddOutlineRectsForDescendant(child, rects, additional_offset, + AddOutlineRectsForDescendant(child, collector, additional_offset, outline_type, To<LayoutBoxModelObject>(layout_object)); }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h index 97f4af8..a7b355c0 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
@@ -362,13 +362,13 @@ // Needed to compensate for LayoutInline Legacy code offsets. void AddSelfOutlineRects(const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows, - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, LayoutObject::OutlineInfo* info) const; // Same as |AddSelfOutlineRects|, except when |this.IsInlineBox()|, in which // case the coordinate system is relative to the inline formatting context. void AddOutlineRects(const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows, - Vector<PhysicalRect>* outline_rects) const; + OutlineRectCollector& collector) const; PositionWithAffinity PositionForPoint(PhysicalOffset) const; @@ -658,11 +658,11 @@ void AddOutlineRects(const PhysicalOffset& additional_offset, NGOutlineType include_block_overflows, bool inline_container_relative, - Vector<PhysicalRect>* outline_rects) const; + OutlineRectCollector& collector) const; void AddOutlineRectsForInlineBox(PhysicalOffset additional_offset, NGOutlineType include_block_overflows, bool inline_container_relative, - Vector<PhysicalRect>* outline_rects) const; + OutlineRectCollector& collector) const; PositionWithAffinity PositionForPointByClosestChild( PhysicalOffset point_in_contents) const;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc index 7baddbba..fbe36d1 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -786,7 +786,7 @@ // additional_offset must be offset from the containing_block. void NGPhysicalFragment::AddOutlineRectsForNormalChildren( - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block) const { @@ -794,7 +794,7 @@ DCHECK_EQ(box->PostLayout(), box); if (const NGFragmentItems* items = box->Items()) { NGInlineCursor cursor(*box, *items); - AddOutlineRectsForCursor(outline_rects, additional_offset, outline_type, + AddOutlineRectsForCursor(collector, additional_offset, outline_type, containing_block, &cursor); // Don't add |Children()|. If |this| has |NGFragmentItems|, children are // either line box, which we already handled in items, or OOF, which we @@ -812,13 +812,13 @@ // NGPhysicalBoxFragment::AddSelfOutlineRects(). if (child->IsOutOfFlowPositioned()) continue; - AddOutlineRectsForDescendant(child, outline_rects, additional_offset, + AddOutlineRectsForDescendant(child, collector, additional_offset, outline_type, containing_block); } } void NGPhysicalFragment::AddOutlineRectsForCursor( - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block, @@ -836,7 +836,7 @@ case NGFragmentItem::kLine: { AddOutlineRectsForDescendant( {item.LineBoxFragment(), item.OffsetInContainerFragment()}, - outline_rects, additional_offset, outline_type, containing_block); + collector, additional_offset, outline_type, containing_block); break; } case NGFragmentItem::kGeneratedText: @@ -848,7 +848,7 @@ if (UNLIKELY(text_combine)) rect = text_combine->AdjustRectForBoundingBox(rect); rect.Move(additional_offset); - outline_rects->push_back(rect); + collector.AddRect(rect); break; } case NGFragmentItem::kSvgText: { @@ -856,7 +856,7 @@ cursor->Current().ObjectBoundingBox(*cursor)); DCHECK(!text_combine); rect.Move(additional_offset); - outline_rects->push_back(rect); + collector.AddRect(rect); break; } case NGFragmentItem::kBox: { @@ -864,7 +864,7 @@ item.PostLayoutBoxFragment()) { DCHECK(!child_box->IsOutOfFlowPositioned()); AddOutlineRectsForDescendant( - {child_box, item.OffsetInContainerFragment()}, outline_rects, + {child_box, item.OffsetInContainerFragment()}, collector, additional_offset, outline_type, containing_block); // Skip descendants as they were already added. DCHECK(item.IsInlineBox() || item.DescendantsCount() == 1); @@ -975,7 +975,7 @@ // LocalToAncestorRect returns rects wrt containing_block. void NGPhysicalFragment::AddOutlineRectsForDescendant( const NGLink& descendant, - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block) const { @@ -993,20 +993,17 @@ // may have transforms and so we have to go through LocalToAncestorRects? if (descendant_box->HasLayer()) { DCHECK(descendant_layout_object); - Vector<PhysicalRect> layer_outline_rects; + auto* descendant_collector = collector.ForDescendantCollector(); descendant_box->AddOutlineRects(PhysicalOffset(), outline_type, - &layer_outline_rects); - - descendant_layout_object->LocalToAncestorRects( - layer_outline_rects, containing_block, PhysicalOffset(), - additional_offset); - outline_rects->AppendVector(layer_outline_rects); + *descendant_collector); + collector.Combine(descendant_collector, *descendant_layout_object, + containing_block, additional_offset); return; } if (!descendant_box->IsInlineBox()) { descendant_box->AddSelfOutlineRects( - additional_offset + descendant.Offset(), outline_type, outline_rects, + additional_offset + descendant.Offset(), outline_type, collector, nullptr); return; } @@ -1024,7 +1021,7 @@ // We don't pass additional_offset here because the function requires // additional_offset to be the offset from the containing block. descendant_layout_inline->AddOutlineRectsForNormalChildren( - *outline_rects, PhysicalOffset(), outline_type); + collector, PhysicalOffset(), outline_type); } return; } @@ -1032,7 +1029,7 @@ if (const auto* descendant_line_box = DynamicTo<NGPhysicalLineBoxFragment>(descendant.get())) { descendant_line_box->AddOutlineRectsForNormalChildren( - outline_rects, additional_offset + descendant.Offset(), outline_type, + collector, additional_offset + descendant.Offset(), outline_type, containing_block); // We don't add the line box itself. crbug.com/1203247. }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h index 8277d21..05c1e5b 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h +++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -699,18 +699,18 @@ PhysicalRect* overflow); void AddOutlineRectsForNormalChildren( - Vector<PhysicalRect>* outline_rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block) const; - void AddOutlineRectsForCursor(Vector<PhysicalRect>* outline_rects, + void AddOutlineRectsForCursor(OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block, NGInlineCursor* cursor) const; void AddOutlineRectsForDescendant( const NGLink& descendant, - Vector<PhysicalRect>* rects, + OutlineRectCollector& collector, const PhysicalOffset& additional_offset, NGOutlineType outline_type, const LayoutBoxModelObject* containing_block) const;
diff --git a/third_party/blink/renderer/core/layout/outline_rect_collector.cc b/third_party/blink/renderer/core/layout/outline_rect_collector.cc new file mode 100644 index 0000000..015899a --- /dev/null +++ b/third_party/blink/renderer/core/layout/outline_rect_collector.cc
@@ -0,0 +1,64 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/layout/outline_rect_collector.h" + +#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" +#include "third_party/blink/renderer/core/layout/layout_box_model_object.h" +#include "third_party/blink/renderer/core/layout/layout_object.h" +#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" + +namespace blink { + +void UnionOutlineRectCollector::Combine(OutlineRectCollector* collector, + const LayoutObject& descendant, + const LayoutBoxModelObject* ancestor, + const PhysicalOffset& post_offset) { + CHECK_EQ(collector->GetType(), Type::kUnion); + VectorOf<PhysicalRect> rects{ + static_cast<UnionOutlineRectCollector*>(collector)->Rect()}; + descendant.LocalToAncestorRects(rects, ancestor, PhysicalOffset(), + post_offset); + rect_.Unite(UnionRect(rects)); +} + +void UnionOutlineRectCollector::Combine( + OutlineRectCollector* collector, + const PhysicalOffset& additional_offset) { + CHECK_EQ(collector->GetType(), Type::kUnion); + auto rect = static_cast<UnionOutlineRectCollector*>(collector)->Rect(); + rect.offset += additional_offset; + rect_.Unite(rect); +} + +void VectorOutlineRectCollector::Combine(OutlineRectCollector* collector, + const LayoutObject& descendant, + const LayoutBoxModelObject* ancestor, + const PhysicalOffset& post_offset) { + CHECK_EQ(collector->GetType(), Type::kVector); + VectorOf<PhysicalRect> rects = + static_cast<VectorOutlineRectCollector*>(collector)->TakeRects(); + descendant.LocalToAncestorRects(rects, ancestor, PhysicalOffset(), + post_offset); + rects_.AppendVector(rects); +} + +void VectorOutlineRectCollector::Combine( + OutlineRectCollector* collector, + const PhysicalOffset& additional_offset) { + CHECK_EQ(collector->GetType(), Type::kVector); + if (!additional_offset.IsZero()) { + for (PhysicalRect& rect : + static_cast<VectorOutlineRectCollector*>(collector)->TakeRects()) { + rect.offset += additional_offset; + rects_.push_back(rect); + } + } else { + rects_.AppendVector( + static_cast<VectorOutlineRectCollector*>(collector)->TakeRects()); + } +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/layout/outline_rect_collector.h b/third_party/blink/renderer/core/layout/outline_rect_collector.h new file mode 100644 index 0000000..c6d9192 --- /dev/null +++ b/third_party/blink/renderer/core/layout/outline_rect_collector.h
@@ -0,0 +1,97 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_OUTLINE_RECT_COLLECTOR_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_OUTLINE_RECT_COLLECTOR_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/heap/heap_traits.h" +#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/vector.h" + +namespace blink { +class LayoutObject; +class LayoutBoxModelObject; + +class OutlineRectCollector { + public: + enum class Type { kUnion, kVector }; + + virtual Type GetType() const = 0; + virtual void AddRect(const PhysicalRect&) = 0; + virtual OutlineRectCollector* ForDescendantCollector() const = 0; + virtual void Combine(OutlineRectCollector*, + const LayoutObject& descendant, + const LayoutBoxModelObject* ancestor, + const PhysicalOffset& post_offset) = 0; + virtual void Combine(OutlineRectCollector*, + const PhysicalOffset& additional_offset) = 0; + virtual bool IsEmpty() const = 0; +}; + +class CORE_EXPORT UnionOutlineRectCollector + : public GarbageCollected<UnionOutlineRectCollector>, + public OutlineRectCollector { + public: + virtual ~UnionOutlineRectCollector() = default; + + Type GetType() const final { return Type::kUnion; } + + void AddRect(const PhysicalRect& r) final { rect_.Unite(r); } + const PhysicalRect& Rect() const { return rect_; } + + OutlineRectCollector* ForDescendantCollector() const final { + return MakeGarbageCollected<UnionOutlineRectCollector>(); + } + + void Combine(OutlineRectCollector* collector, + const LayoutObject& descendant, + const LayoutBoxModelObject* ancestor, + const PhysicalOffset& post_offset) final; + void Combine(OutlineRectCollector*, + const PhysicalOffset& additional_offset) final; + + bool IsEmpty() const final { return rect_.IsEmpty(); } + + void Trace(Visitor* visitor) const {} + + private: + PhysicalRect rect_; +}; + +class CORE_EXPORT VectorOutlineRectCollector + : public GarbageCollected<VectorOutlineRectCollector>, + public OutlineRectCollector { + public: + virtual ~VectorOutlineRectCollector() = default; + + Type GetType() const final { return Type::kVector; } + + void AddRect(const PhysicalRect& r) override { rects_.push_back(r); } + VectorOf<PhysicalRect> TakeRects() { return std::move(rects_); } + + OutlineRectCollector* ForDescendantCollector() const final { + return MakeGarbageCollected<VectorOutlineRectCollector>(); + } + + void Combine(OutlineRectCollector* collector, + const LayoutObject& descendant, + const LayoutBoxModelObject* ancestor, + const PhysicalOffset& post_offset) final; + void Combine(OutlineRectCollector*, + const PhysicalOffset& additional_offset) final; + + bool IsEmpty() const final { return rects_.empty(); } + + void Trace(Visitor* visitor) const {} + + private: + VectorOf<PhysicalRect> rects_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_OUTLINE_RECT_COLLECTOR_H_
diff --git a/third_party/blink/renderer/core/layout/outline_rect_collector_test.cc b/third_party/blink/renderer/core/layout/outline_rect_collector_test.cc new file mode 100644 index 0000000..f2361f5 --- /dev/null +++ b/third_party/blink/renderer/core/layout/outline_rect_collector_test.cc
@@ -0,0 +1,141 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/layout/outline_rect_collector.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" +#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h" + +namespace blink { + +TEST(OutlineRectCollectorTest, Empty) { + UnionOutlineRectCollector u; + VectorOutlineRectCollector v; + + EXPECT_EQ(u.Rect(), PhysicalRect()); + EXPECT_TRUE(v.TakeRects().empty()); +} + +TEST(OutlineRectCollectorTest, AddRect) { + Vector<Vector<PhysicalRect>> tests = { + Vector<PhysicalRect>{ + PhysicalRect(-1, -1, 10, 10), PhysicalRect(10, 20, 30, 40), + PhysicalRect(1, 2, 3, 4), PhysicalRect(1, -1, 10, 15), + PhysicalRect(-31, -15, 11, 16)}, + Vector<PhysicalRect>{PhysicalRect(1, 2, 3, 4)}, + Vector<PhysicalRect>{PhysicalRect(10, 20, 30, 40), + PhysicalRect(15, 25, 35, 45)}, + Vector<PhysicalRect>{PhysicalRect(-100, -200, 30, 40), + PhysicalRect(-150, -250, 35, 45)}}; + + ASSERT_FALSE(tests.empty()); + for (wtf_size_t i = 0; i < tests.size(); ++i) { + SCOPED_TRACE(i); + + const Vector<PhysicalRect>& input_rects = tests[i]; + UnionOutlineRectCollector u; + VectorOutlineRectCollector v; + + for (auto& rect : input_rects) { + u.AddRect(rect); + v.AddRect(rect); + } + + PhysicalRect union_result = u.Rect(); + VectorOf<PhysicalRect> vector_result = v.TakeRects(); + + EXPECT_EQ(input_rects, vector_result); + EXPECT_EQ(UnionRect(input_rects), union_result); + } +} + +TEST(OutlineRectCollectorTest, CombineWithOffset) { + UnionOutlineRectCollector u; + VectorOutlineRectCollector v; + + u.AddRect(PhysicalRect(10, 20, 30, 40)); + v.AddRect(PhysicalRect(10, 20, 30, 40)); + + OutlineRectCollector* u_descendant = u.ForDescendantCollector(); + OutlineRectCollector* v_descendant = v.ForDescendantCollector(); + + u_descendant->AddRect(PhysicalRect(10, 20, 30, 40)); + v_descendant->AddRect(PhysicalRect(10, 20, 30, 40)); + + u.Combine(u_descendant, PhysicalOffset(15, -25)); + v.Combine(v_descendant, PhysicalOffset(15, -25)); + + PhysicalRect union_result = u.Rect(); + VectorOf<PhysicalRect> vector_result = v.TakeRects(); + + EXPECT_EQ(union_result, PhysicalRect(10, -5, 45, 65)); + EXPECT_EQ(vector_result, + (Vector<PhysicalRect>{PhysicalRect(10, 20, 30, 40), + PhysicalRect(25, -5, 30, 40)})); +} + +class OutlineRectCollectorRenderingTest : public RenderingTest { + public: + OutlineRectCollectorRenderingTest() + : RenderingTest(MakeGarbageCollected<EmptyLocalFrameClient>()) {} +}; + +TEST_F(OutlineRectCollectorRenderingTest, CombineWithAncestor) { + SetBodyInnerHTML(R"HTML( + <style> + div { contain: paint; width: 100px; height: 100px; } + #parent { position: absolute; left: 10px; top: 20px; } + #child { position: relative; left: 15px; top: 25px; } + </style> + <div id=parent> + <div id=child></div> + </div> + )HTML"); + + LayoutBoxModelObject* parent = + DynamicTo<LayoutBoxModelObject>(GetLayoutObjectByElementId("parent")); + LayoutObject* child = GetLayoutObjectByElementId("child"); + ASSERT_TRUE(parent); + ASSERT_TRUE(child); + + UnionOutlineRectCollector u; + VectorOutlineRectCollector v; + + u.AddRect(PhysicalRect(10, 20, 30, 40)); + v.AddRect(PhysicalRect(10, 20, 30, 40)); + + OutlineRectCollector* u_descendant = u.ForDescendantCollector(); + OutlineRectCollector* v_descendant = v.ForDescendantCollector(); + + u_descendant->AddRect(PhysicalRect(10, 20, 30, 40)); + v_descendant->AddRect(PhysicalRect(10, 20, 30, 40)); + + u.Combine(u_descendant, *child, parent, PhysicalOffset(15, -25)); + // The mapped rect should be: + // x: + // 10 (physical rect in add rect) + // + 15 (left: 15px in styles) + + // + 15 (offset in the combine call) + // = 40 + // + // y: + // 20 (physical rect in add rect) + // + 25 (top: 25px in styles) + // - 25 (offset in the combine call) + // = 20 + // + // width and height should be unchanged. + v.Combine(v_descendant, *child, parent, PhysicalOffset(15, -25)); + + PhysicalRect union_result = u.Rect(); + VectorOf<PhysicalRect> vector_result = v.TakeRects(); + + EXPECT_EQ(union_result, PhysicalRect(10, 20, 60, 40)); + EXPECT_EQ(vector_result, + (Vector<PhysicalRect>{PhysicalRect(10, 20, 30, 40), + PhysicalRect(40, 20, 30, 40)})); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc index ea064cf..f4be270a 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.cc
@@ -144,17 +144,17 @@ } } -void LayoutSVGInline::AddOutlineRects(Vector<PhysicalRect>& rect_list, +void LayoutSVGInline::AddOutlineRects(OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset& additional_offset, NGOutlineType outline_type) const { if (!IsInLayoutNGInlineFormattingContext()) { - LayoutInline::AddOutlineRects(rect_list, nullptr, additional_offset, + LayoutInline::AddOutlineRects(collector, nullptr, additional_offset, outline_type); } else { auto rect = PhysicalRect::EnclosingRect(ObjectBoundingBox()); rect.Move(additional_offset); - rect_list.push_back(rect); + collector.AddRect(rect); } if (info) *info = OutlineInfo::GetUnzoomedFromStyle(StyleRef());
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h index 77e1274..24ac256 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline.h
@@ -58,7 +58,7 @@ MapCoordinatesFlags) const final; void AbsoluteQuads(Vector<gfx::QuadF>&, MapCoordinatesFlags mode = 0) const final; - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const final;
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc index 7aab5f3..cd94697 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
@@ -79,7 +79,7 @@ // This method is called from inside PaintOutline(), and since we call // PaintOutline() while transformed to our coord system, return local coords. -void LayoutSVGModelObject::AddOutlineRects(Vector<PhysicalRect>& rects, +void LayoutSVGModelObject::AddOutlineRects(OutlineRectCollector& collector, OutlineInfo* info, const PhysicalOffset&, NGOutlineType) const { @@ -91,7 +91,7 @@ // If visual rect is clipped away then don't add it. if (!was_empty && visual_rect.IsEmpty()) return; - rects.push_back(PhysicalRect::EnclosingRect(visual_rect)); + collector.AddRect(PhysicalRect::EnclosingRect(visual_rect)); if (info) *info = OutlineInfo::GetUnzoomedFromStyle(StyleRef()); }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h index 2b1cb99e..1052d75 100644 --- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h +++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.h
@@ -90,7 +90,7 @@ // LayoutSVGModelObject subclasses should use GetElement() instead. void GetNode() const = delete; - void AddOutlineRects(Vector<PhysicalRect>&, + void AddOutlineRects(OutlineRectCollector&, OutlineInfo*, const PhysicalOffset& additional_offset, NGOutlineType) const final;
diff --git a/third_party/blink/renderer/core/layout/vertical_position_cache.h b/third_party/blink/renderer/core/layout/vertical_position_cache.h deleted file mode 100644 index 33b3a759c..0000000 --- a/third_party/blink/renderer/core/layout/vertical_position_cache.h +++ /dev/null
@@ -1,74 +0,0 @@ -/* - * Copyright (C) 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. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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_LAYOUT_VERTICAL_POSITION_CACHE_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_VERTICAL_POSITION_CACHE_H_ - -#include "third_party/blink/renderer/core/layout/api/line_layout_item.h" -#include "third_party/blink/renderer/platform/fonts/font_baseline.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" -#include "third_party/blink/renderer/platform/wtf/hash_map.h" - -namespace blink { - -// Values for vertical alignment. -const int kPositionUndefined = 0x80000000; - -class VerticalPositionCache { - STACK_ALLOCATED(); - - public: - VerticalPositionCache() = default; - VerticalPositionCache(const VerticalPositionCache&) = delete; - VerticalPositionCache& operator=(const VerticalPositionCache&) = delete; - - int Get(LineLayoutItem layout_object, FontBaseline baseline_type) const { - const HashMap<LineLayoutItem, int>& map_to_check = - baseline_type == kAlphabeticBaseline ? alphabetic_positions_ - : ideographic_positions_; - const HashMap<LineLayoutItem, int>::const_iterator it = - map_to_check.find(layout_object); - if (it == map_to_check.end()) - return kPositionUndefined; - return it->value; - } - - void Set(LineLayoutItem layout_object, - FontBaseline baseline_type, - int position) { - if (baseline_type == kAlphabeticBaseline) - alphabetic_positions_.Set(layout_object, position); - else - ideographic_positions_.Set(layout_object, position); - } - - private: - HashMap<LineLayoutItem, int> alphabetic_positions_; - HashMap<LineLayoutItem, int> ideographic_positions_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_VERTICAL_POSITION_CACHE_H_
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_api.cc b/third_party/blink/renderer/core/navigation_api/navigation_api.cc index e4bb75d..8600515 100644 --- a/third_party/blink/renderer/core/navigation_api/navigation_api.cc +++ b/third_party/blink/renderer/core/navigation_api/navigation_api.cc
@@ -711,9 +711,9 @@ destination_state); if (params->frame_load_type == WebFrameLoadType::kBackForward) { auto iter = keys_to_indices_.find(key); - int index = iter == keys_to_indices_.end() ? 0 : iter->value; - destination->SetTraverseProperties( - key, params->destination_item->GetNavigationApiId(), index); + if (iter != keys_to_indices_.end()) { + destination->SetDestinationEntry(entries_[iter->value]); + } } init->setDestination(destination);
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_destination.h b/third_party/blink/renderer/core/navigation_api/navigation_destination.h index 1da7a84..41308f4 100644 --- a/third_party/blink/renderer/core/navigation_api/navigation_destination.h +++ b/third_party/blink/renderer/core/navigation_api/navigation_destination.h
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/bindings/core/v8/script_value.h" #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h" #include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/core/navigation_api/navigation_history_entry.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/member.h" @@ -25,18 +26,12 @@ : url_(url), same_document_(same_document), state_(state) {} ~NavigationDestination() final = default; - void SetTraverseProperties(const String& key, - const String& id, - int64_t index) { - key_ = key; - id_ = id; - index_ = index; - } + void SetDestinationEntry(NavigationHistoryEntry* entry) { entry_ = entry; } - const String& key() const { return key_; } - const String& id() const { return id_; } + String key() const { return entry_ ? entry_->key() : String(); } + String id() const { return entry_ ? entry_->id() : String(); } const KURL& url() const { return url_; } - int64_t index() const { return index_; } + int64_t index() const { return entry_ ? entry_->index() : -1; } bool sameDocument() const { return same_document_; } ScriptValue getState(ScriptState* script_state) { v8::Isolate* isolate = script_state->GetIsolate(); @@ -44,13 +39,16 @@ : ScriptValue(); } + void Trace(Visitor* visitor) const override { + ScriptWrappable::Trace(visitor); + visitor->Trace(entry_); + } + private: - String key_; - String id_; KURL url_; - int64_t index_ = -1; bool same_document_; scoped_refptr<SerializedScriptValue> state_; + Member<NavigationHistoryEntry> entry_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/navigation_api/navigation_destination.idl b/third_party/blink/renderer/core/navigation_api/navigation_destination.idl index 51de493e..4d3a0e9 100644 --- a/third_party/blink/renderer/core/navigation_api/navigation_destination.idl +++ b/third_party/blink/renderer/core/navigation_api/navigation_destination.idl
@@ -6,8 +6,8 @@ [ Exposed=Window ] interface NavigationDestination { - readonly attribute DOMString? key; - readonly attribute DOMString? id; + readonly attribute DOMString key; + readonly attribute DOMString id; readonly attribute USVString url; readonly attribute long long index; readonly attribute boolean sameDocument;
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 eda534c2cd..42107b4 100644 --- a/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/scrolling_test.cc
@@ -2088,7 +2088,7 @@ } void RunIdleTasks() { - auto* scheduler = + auto& scheduler = blink::scheduler::WebThreadScheduler::MainThreadScheduler(); blink::scheduler::RunIdleTasksForTesting(scheduler, base::BindOnce([]() {}));
diff --git a/third_party/blink/renderer/core/paint/README.md b/third_party/blink/renderer/core/paint/README.md index e7ead29..0e06709 100644 --- a/third_party/blink/renderer/core/paint/README.md +++ b/third_party/blink/renderer/core/paint/README.md
@@ -400,18 +400,15 @@ also store a unique `PaintOffset, `PaginationOffset and `LocalBorderBoxProperties` object. -See -[`LayoutMultiColumnFlowThread.h`](../layout/layout_multi_column_flow_thread.h) -for a much more detail about multicolumn/pagination. - ## Paint -Paint walks the LayoutObject tree in paint-order and produces a list of -display items. This is implemented using static painter classes -(e.g., [`BlockPainter`](block_painter.cc)) and appends display items to a -[`PaintController`](../../platform/graphics/paint/paint_controller.h). There -is only one `PaintController` for the entire `LocalFrameView`. During -this treewalk, the current property tree state is maintained (see: +Within a PaintLayer, paint walks the NGPhysicalFragment tree in paint-order and +produces a list of display items. This is implemented using static painter +classes (such as [`NGBoxFragmentPainter`](ng/ng_box_fragment_painter.cc)) and +appends display items to a +[`PaintController`](../../platform/graphics/paint/paint_controller.h). There is +only one `PaintController` for the entire `LocalFrameView`. During this +treewalk, the current property tree state is maintained (see: `PaintController::UpdateCurrentPaintChunkProperties`). The `PaintController` segments the display item list into [`PaintChunk`](../../platform/graphics/paint/paint_chunk.h)s which are @@ -539,27 +536,3 @@ cc::PaintedOverlayScrollbarLayer depending on the type of the scrollbar. Custom scrollbars are still painted into drawing display items directly. - -### PaintNG - -[LayoutNG](../layout/ng/README.md) is a project that will change how Layout -generates geometry/style information for painting. Instead of modifying -LayoutObjects, LayoutNG will generate an NGFragment tree. - -NGPaintFragments are: - -* immutable -* all coordinates are physical. See -[layout_box_model_object.h](../layout/layout_box_model_object.h). -* instead of Location(), NGFragment has Offset(), a physical offset from parent -fragment. - -The goal is for PaintNG to eventually paint from NGFragment tree, -and not see LayoutObjects at all. Until this goal is reached, -LegacyPaint, and NGPaint will coexist. - -When a particular LayoutObject subclass fully migrates to NG, its LayoutObject -geometry information might no longer be updated\(\*\), and its -painter needs to be rewritten to paint NGFragments. -For example, see how BlockPainter is being rewritten as NGBoxFragmentPainter. -
diff --git a/third_party/blink/renderer/core/paint/block_painter.cc b/third_party/blink/renderer/core/paint/block_painter.cc deleted file mode 100644 index 65a1952..0000000 --- a/third_party/blink/renderer/core/paint/block_painter.cc +++ /dev/null
@@ -1,322 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/paint/block_painter.h" - -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" -#include "third_party/blink/renderer/core/editing/drag_caret.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/layout/layout_inline.h" -#include "third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.h" -#include "third_party/blink/renderer/core/page/page.h" -#include "third_party/blink/renderer/core/paint/object_painter.h" -#include "third_party/blink/renderer/core/paint/paint_info.h" -#include "third_party/blink/renderer/core/paint/scoped_paint_state.h" -#include "third_party/blink/renderer/core/paint/scrollable_area_painter.h" -#include "third_party/blink/renderer/core/paint/timing/paint_timing_detector.h" - -namespace blink { - -namespace { - -bool ShouldPaintCursorCaret(const LayoutBlock& block) { - return block.GetFrame()->Selection().ShouldPaintCaret(block); -} - -bool ShouldPaintDragCaret(const LayoutBlock& block) { - return block.GetFrame()->GetPage()->GetDragCaret().ShouldPaintCaret(block); -} - -bool ShouldPaintCarets(const LayoutBlock& block) { - return ShouldPaintCursorCaret(block) || ShouldPaintDragCaret(block); -} - -} // namespace - -DISABLE_CFI_PERF -void BlockPainter::Paint(const PaintInfo& paint_info) { - ScopedPaintState paint_state(layout_block_, paint_info); - if (!ShouldPaint(paint_state)) - return; - - DCHECK(!layout_block_.ChildPaintBlockedByDisplayLock() || - paint_info.DescendantPaintingBlocked()); - - auto paint_offset = paint_state.PaintOffset(); - auto& local_paint_info = paint_state.MutablePaintInfo(); - PaintPhase original_phase = local_paint_info.phase; - bool painted_overflow_controls = false; - - if (original_phase == PaintPhase::kOutline) { - local_paint_info.phase = PaintPhase::kDescendantOutlinesOnly; - } else if (ShouldPaintSelfBlockBackground(original_phase)) { - local_paint_info.phase = PaintPhase::kSelfBlockBackgroundOnly; - // We need to call PaintObject twice: one for painting background in the - // border box space, and the other for painting background in the scrolling - // contents space. - auto paint_location = layout_block_.GetBackgroundPaintLocation(); - if (!(paint_location & kBackgroundPaintInBorderBoxSpace)) - local_paint_info.SetSkipsBackground(true); - layout_block_.PaintObject(local_paint_info, paint_offset); - local_paint_info.SetSkipsBackground(false); - - // If possible, paint overflow controls before scrolling background to make - // it easier to merge scrolling background and scrolling contents into the - // same layer. The function checks if it's appropriate to paint overflow - // controls now. - painted_overflow_controls = - PaintOverflowControls(local_paint_info, paint_offset); - - if (paint_location & kBackgroundPaintInContentsSpace) { - local_paint_info.SetIsPaintingBackgroundInContentsSpace(true); - layout_block_.PaintObject(local_paint_info, paint_offset); - local_paint_info.SetIsPaintingBackgroundInContentsSpace(false); - } - if (ShouldPaintDescendantBlockBackgrounds(original_phase)) - local_paint_info.phase = PaintPhase::kDescendantBlockBackgroundsOnly; - } - - if (original_phase == PaintPhase::kMask) { - layout_block_.PaintObject(local_paint_info, paint_offset); - } else if (original_phase != PaintPhase::kSelfBlockBackgroundOnly && - original_phase != PaintPhase::kSelfOutlineOnly && - // kOverlayOverflowControls is for the current object itself, - // so we don't need to traverse descendants here. - original_phase != PaintPhase::kOverlayOverflowControls) { - ScopedBoxContentsPaintState contents_paint_state(paint_state, - layout_block_); - layout_block_.PaintObject(contents_paint_state.GetPaintInfo(), - contents_paint_state.PaintOffset()); - } - - // Carets are painted in the foreground phase, outside of the contents - // properties block. Note that caret painting does not seem to correspond to - // any painting order steps within the CSS spec. - if (original_phase == PaintPhase::kForeground && - ShouldPaintCarets(layout_block_)) { - // Apply overflow clip if needed. TODO(wangxianzhu): Move PaintCarets() - // under |contents_paint_state| in the above block and let the caret - // painters paint in the space of scrolling contents. - absl::optional<ScopedPaintChunkProperties> paint_chunk_properties; - if (const auto* fragment = paint_state.FragmentToPaint()) { - if (const auto* properties = fragment->PaintProperties()) { - if (const auto* overflow_clip = properties->OverflowClip()) { - paint_chunk_properties.emplace( - paint_info.context.GetPaintController(), *overflow_clip, - layout_block_, DisplayItem::kCaret); - } - } - } - - PaintCarets(paint_info, paint_offset); - } - - if (ShouldPaintSelfOutline(original_phase)) { - local_paint_info.phase = PaintPhase::kSelfOutlineOnly; - layout_block_.PaintObject(local_paint_info, paint_offset); - } - - // If we haven't painted overflow controls, paint scrollbars after we painted - // the other things, so that the scrollbars will sit above them. - if (!painted_overflow_controls) { - local_paint_info.phase = original_phase; - PaintOverflowControls(local_paint_info, paint_offset); - } -} - -void BlockPainter::PaintChildren(const PaintInfo& paint_info) { - if (paint_info.DescendantPaintingBlocked()) - return; - - for (LayoutBox* child = layout_block_.FirstChildBox(); child; - child = child->NextSiblingBox()) { - PaintChild(*child, paint_info); - } -} - -void BlockPainter::PaintChild(const LayoutBox& child, - const PaintInfo& paint_info) { - if (child.HasSelfPaintingLayer() || child.IsColumnSpanAll()) - return; - if (!child.IsFloating()) { - child.Paint(paint_info); - return; - } - // Paint the float now if we're in the right phase and if this is NG. NG - // paints floats in regular tree order (the FloatingObjects list is only used - // by legacy layout). - if (paint_info.phase != PaintPhase::kFloat && - paint_info.phase != PaintPhase::kSelectionDragImage && - paint_info.phase != PaintPhase::kTextClip) - return; - - if (!layout_block_.IsLayoutNGObject()) - return; - - PaintInfo float_paint_info(paint_info); - if (paint_info.phase == PaintPhase::kFloat) - float_paint_info.phase = PaintPhase::kForeground; - - ObjectPainter(child).PaintAllPhasesAtomically(float_paint_info); -} - -void BlockPainter::PaintAllChildPhasesAtomically(const LayoutBox& child, - const PaintInfo& paint_info) { - if (paint_info.DescendantPaintingBlocked()) - return; - if (!child.HasSelfPaintingLayer() && !child.IsFloating()) - ObjectPainter(child).PaintAllPhasesAtomically(paint_info); -} - -DISABLE_CFI_PERF -void BlockPainter::PaintObject(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - const PaintPhase paint_phase = paint_info.phase; - // This function implements some of the painting order algorithm (described - // within the description of stacking context, here - // https://www.w3.org/TR/css-position-3/#det-stacking-context). References are - // made below to the step numbers described in that document. - - // If this block has been truncated, early-out here, because it will not be - // displayed. A truncated block occurs when text-overflow: ellipsis is set on - // a block, and there is not enough room to display all elements. The elements - // that don't get shown are "Truncated". - if (layout_block_.IsTruncated()) - return; - - ScopedPaintTimingDetectorBlockPaintHook - scoped_paint_timing_detector_block_paint_hook; - if (paint_info.phase == PaintPhase::kForeground) { - scoped_paint_timing_detector_block_paint_hook.EmplaceIfNeeded( - layout_block_, - paint_info.context.GetPaintController().CurrentPaintChunkProperties()); - } - // If we're *printing or creating a paint preview of* the foreground, paint - // the URL. - if (paint_phase == PaintPhase::kForeground && - paint_info.ShouldAddUrlMetadata()) { - ObjectPainter(layout_block_).AddURLRectIfNeeded(paint_info, paint_offset); - } - - // If we're painting our background (either 1. kBlockBackground - background - // of the current object and non-self-painting descendants, or 2. - // kSelfBlockBackgroundOnly - Paint background of the current object only), - // paint those now. This is steps #1, 2, and 4 of the CSS spec (see above). - if (ShouldPaintSelfBlockBackground(paint_phase)) - layout_block_.PaintBoxDecorationBackground(paint_info, paint_offset); - - DCHECK(!layout_block_.ChildrenInline()); - - // If we're in any phase except *just* the self (outline or background) or a - // mask, paint children now. This is step #5, 7, 8, and 9 of the CSS spec (see - // above). - if (paint_phase != PaintPhase::kSelfOutlineOnly && - paint_phase != PaintPhase::kSelfBlockBackgroundOnly && - paint_phase != PaintPhase::kMask && - !paint_info.DescendantPaintingBlocked()) { - // Actually paint the contents. - if (layout_block_.IsLayoutBlockFlow()) { - // All floating descendants will be LayoutBlockFlow objects, and will get - // painted here. That is step #5 of the CSS spec (see above). - PaintBlockFlowContents(paint_info, paint_offset); - } else { - PaintContents(paint_info, paint_offset); - } - } - - // If we're painting the outline, paint it now. This is step #10 of the CSS - // spec (see above). - if (ShouldPaintSelfOutline(paint_phase)) - ObjectPainter(layout_block_).PaintOutline(paint_info, paint_offset); - - // If we're painting a visible mask, paint it now. (This does not correspond - // to any painting order steps within the CSS spec.) - if (paint_phase == PaintPhase::kMask && - layout_block_.StyleRef().Visibility() == EVisibility::kVisible) { - layout_block_.PaintMask(paint_info, paint_offset); - } -} - -void BlockPainter::PaintBlockFlowContents(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - DCHECK(layout_block_.IsLayoutBlockFlow()); - if (!layout_block_.ChildrenInline()) { - PaintContents(paint_info, paint_offset); - } else if (ShouldPaintDescendantOutlines(paint_info.phase)) { - ObjectPainter(layout_block_).PaintInlineChildrenOutlines(paint_info); - } else { - NOTREACHED(); - } -} - -void BlockPainter::PaintCarets(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - LocalFrame* frame = layout_block_.GetFrame(); - - if (ShouldPaintCursorCaret(layout_block_)) - frame->Selection().PaintCaret(paint_info.context, paint_offset); - - if (ShouldPaintDragCaret(layout_block_)) { - frame->GetPage()->GetDragCaret().PaintDragCaret(frame, paint_info.context, - paint_offset); - } -} - -PhysicalRect BlockPainter::OverflowRectForCullRectTesting() const { - PhysicalRect overflow_rect; - if (layout_block_.IsAnonymousBlock() && layout_block_.ChildrenInline() && - layout_block_.GetDocument().Printing()) { - // For case <a href="..."><div>...</div></a>, when layout_block_ is the - // anonymous container of <a>, the anonymous container's visual overflow is - // empty, but we need to continue painting to output <a>'s PDF URL rect - // which covers the continuations, as if we included <a>'s PDF URL rect into - // layout_block_'s visual overflow. - auto rects = layout_block_.OutlineRects( - nullptr, PhysicalOffset(), NGOutlineType::kIncludeBlockVisualOverflow); - overflow_rect = UnionRect(rects); - } - overflow_rect.Unite(layout_block_.PhysicalVisualOverflowRect()); - - if (layout_block_.ScrollsOverflow()) { - overflow_rect.Unite(layout_block_.PhysicalLayoutOverflowRect()); - overflow_rect.Move( - -PhysicalOffset(layout_block_.PixelSnappedScrolledContentOffset())); - } - return overflow_rect; -} - -DISABLE_CFI_PERF -bool BlockPainter::ShouldPaint(const ScopedPaintState& paint_state) const { - // If there is no fragment to paint for this block, we still need to continue - // the paint tree walk in case there are overflowing children that exist in - // the current painting fragment of the painting layer. In the case we can't - // check the overflow rect against the cull rect in the case because we don't - // know the paint offset. - if (!paint_state.FragmentToPaint()) - return true; - - return paint_state.LocalRectIntersectsCullRect( - OverflowRectForCullRectTesting()); -} - -void BlockPainter::PaintContents(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - DCHECK(!layout_block_.ChildrenInline()); - PaintInfo paint_info_for_descendants = paint_info.ForDescendants(); - layout_block_.PaintChildren(paint_info_for_descendants, paint_offset); -} - -bool BlockPainter::PaintOverflowControls(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - if (auto* scrollable_area = layout_block_.GetScrollableArea()) { - return ScrollableAreaPainter(*scrollable_area) - .PaintOverflowControls(paint_info, - ToRoundedPoint(paint_offset).OffsetFromOrigin()); - } - return false; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/paint/block_painter.h b/third_party/blink/renderer/core/paint/block_painter.h deleted file mode 100644 index 1b45f09..0000000 --- a/third_party/blink/renderer/core/paint/block_painter.h +++ /dev/null
@@ -1,55 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BLOCK_PAINTER_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BLOCK_PAINTER_H_ - -#include "base/gtest_prod_util.h" -#include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/geometry/layout_rect.h" -#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" - -namespace blink { - -class LayoutBlock; -class LayoutBox; -class ScopedPaintState; -struct PaintInfo; -struct PhysicalOffset; -struct PhysicalRect; - -class BlockPainter { - STACK_ALLOCATED(); - - public: - BlockPainter(const LayoutBlock& block) : layout_block_(block) {} - - void Paint(const PaintInfo&); - void PaintObject(const PaintInfo&, const PhysicalOffset& paint_offset); - void PaintContents(const PaintInfo&, const PhysicalOffset& paint_offset); - void PaintChildren(const PaintInfo&); - void PaintChild(const LayoutBox&, const PaintInfo&); - - // See ObjectPainter::PaintAllPhasesAtomically(). - void PaintAllChildPhasesAtomically(const LayoutBox&, const PaintInfo&); - - private: - void PaintBlockFlowContents(const PaintInfo&, const PhysicalOffset&); - void PaintCarets(const PaintInfo&, const PhysicalOffset& paint_offset); - bool PaintOverflowControls(const PaintInfo&, - const PhysicalOffset& paint_offset); - - bool ShouldPaint(const ScopedPaintState&) const; - - CORE_EXPORT PhysicalRect OverflowRectForCullRectTesting() const; - - FRIEND_TEST_ALL_PREFIXES(BlockPainterTest, OverflowRectForCullRectTesting); - FRIEND_TEST_ALL_PREFIXES(BlockPainterTest, - OverflowRectCompositedScrollingForCullRectTesting); - const LayoutBlock& layout_block_; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BLOCK_PAINTER_H_
diff --git a/third_party/blink/renderer/core/paint/block_painter_test.cc b/third_party/blink/renderer/core/paint/block_painter_test.cc index d5c7cdf..3c8b2e46 100644 --- a/third_party/blink/renderer/core/paint/block_painter_test.cc +++ b/third_party/blink/renderer/core/paint/block_painter_test.cc
@@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "third_party/blink/renderer/core/paint/block_painter.h" - #include "base/test/scoped_feature_list.h" #include "cc/base/features.h" #include "testing/gmock/include/gmock/gmock.h" @@ -20,32 +18,11 @@ namespace blink { +// TODO(1229581): Rename this. It's not testing BlockPainter anymore. using BlockPainterTest = PaintControllerPaintTest; INSTANTIATE_PAINT_TEST_SUITE_P(BlockPainterTest); -TEST_P(BlockPainterTest, OverflowRectForCullRectTesting) { - SetBodyInnerHTML(R"HTML( - <div id='scroller' style='width: 50px; height: 50px; overflow: scroll'> - <div style='width: 50px; height: 5000px'></div> - </div> - )HTML"); - auto* scroller = To<LayoutBlock>(GetLayoutObjectByElementId("scroller")); - EXPECT_EQ(PhysicalRect(0, 0, 50, 5000), - BlockPainter(*scroller).OverflowRectForCullRectTesting()); -} - -TEST_P(BlockPainterTest, OverflowRectCompositedScrollingForCullRectTesting) { - SetBodyInnerHTML(R"HTML( - <div id='scroller' style='width: 50px; height: 50px; overflow: scroll; - will-change: transform'> - <div style='width: 50px; height: 5000px'></div> - </div> - )HTML"); - auto* scroller = To<LayoutBlock>(GetLayoutObjectByElementId("scroller")); - EXPECT_EQ(PhysicalRect(0, 0, 50, 5000), - BlockPainter(*scroller).OverflowRectForCullRectTesting()); -} namespace { class BlockPainterTestMockEventListener final : public NativeEventListener { public:
diff --git a/third_party/blink/renderer/core/paint/box_painter.cc b/third_party/blink/renderer/core/paint/box_painter.cc index 5d000f9e..e032a54 100644 --- a/third_party/blink/renderer/core/paint/box_painter.cc +++ b/third_party/blink/renderer/core/paint/box_painter.cc
@@ -4,254 +4,14 @@ #include "third_party/blink/renderer/core/paint/box_painter.h" -#include "base/unguessable_token.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/renderer/core/display_lock/display_lock_context.h" -#include "third_party/blink/renderer/core/layout/background_bleed_avoidance.h" #include "third_party/blink/renderer/core/layout/layout_box.h" -#include "third_party/blink/renderer/core/layout/layout_object.h" -#include "third_party/blink/renderer/core/layout/layout_theme.h" -#include "third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_foreign_object.h" -#include "third_party/blink/renderer/core/paint/background_image_geometry.h" -#include "third_party/blink/renderer/core/paint/box_decoration_data.h" -#include "third_party/blink/renderer/core/paint/box_model_object_painter.h" -#include "third_party/blink/renderer/core/paint/box_painter_base.h" -#include "third_party/blink/renderer/core/paint/nine_piece_image_painter.h" -#include "third_party/blink/renderer/core/paint/object_painter.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h" -#include "third_party/blink/renderer/core/paint/rounded_border_geometry.h" -#include "third_party/blink/renderer/core/paint/scoped_paint_state.h" #include "third_party/blink/renderer/core/paint/scrollable_area_painter.h" -#include "third_party/blink/renderer/core/paint/svg_foreign_object_painter.h" -#include "third_party/blink/renderer/core/paint/theme_painter.h" -#include "third_party/blink/renderer/platform/geometry/layout_point.h" -#include "third_party/blink/renderer/platform/geometry/length_functions.h" -#include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h" -#include "third_party/blink/renderer/platform/graphics/paint/display_item_cache_skipper.h" -#include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h" -#include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h" namespace blink { -void BoxPainter::Paint(const PaintInfo& paint_info) { - // Default implementation. Just pass paint through to the children. - ScopedPaintState paint_state(layout_box_, paint_info); - PaintChildren(paint_state.GetPaintInfo()); -} - -void BoxPainter::PaintChildren(const PaintInfo& paint_info) { - if (paint_info.DescendantPaintingBlocked()) - return; - - PaintInfo child_info(paint_info); - for (LayoutObject* child = layout_box_.SlowFirstChild(); child; - child = child->NextSibling()) { - if (auto* foreign_object = DynamicTo<LayoutNGSVGForeignObject>(child)) { - SVGForeignObjectPainter(*foreign_object).PaintLayer(paint_info); - } else { - child->Paint(child_info); - } - } -} - -void BoxPainter::PaintBoxDecorationBackground( - const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - if (layout_box_.StyleRef().Visibility() != EVisibility::kVisible) - return; - - PhysicalRect paint_rect; - const DisplayItemClient* background_client = nullptr; - absl::optional<ScopedBoxContentsPaintState> contents_paint_state; - bool painting_background_in_contents_space = - paint_info.IsPaintingBackgroundInContentsSpace(); - gfx::Rect visual_rect; - if (painting_background_in_contents_space) { - // For the case where we are painting the background in the contents space, - // we need to include the entire overflow rect. - paint_rect = layout_box_.PhysicalLayoutOverflowRect(); - contents_paint_state.emplace(paint_info, paint_offset, layout_box_); - paint_rect.Move(contents_paint_state->PaintOffset()); - - // The background painting code assumes that the borders are part of the - // paint_rect so we expand the paint_rect by the border size when painting - // the background into the scrolling contents layer. - paint_rect.Expand(layout_box_.BorderBoxOutsets()); - - background_client = &layout_box_.GetScrollableArea() - ->GetScrollingBackgroundDisplayItemClient(); - visual_rect = - layout_box_.GetScrollableArea()->ScrollingBackgroundVisualRect( - paint_offset); - } else { - paint_rect = layout_box_.PhysicalBorderBoxRect(); - paint_rect.Move(paint_offset); - background_client = &layout_box_; - visual_rect = VisualRect(paint_offset); - } - - // Paint the background if we're visible and this block has a box decoration - // (background, border, appearance, or box shadow). - const ComputedStyle& style = layout_box_.StyleRef(); - if (style.Visibility() == EVisibility::kVisible && - layout_box_.HasBoxDecorationBackground()) { - PaintBoxDecorationBackgroundWithRect( - contents_paint_state ? contents_paint_state->GetPaintInfo() - : paint_info, - visual_rect, paint_rect, *background_client); - } - - RecordHitTestData(paint_info, paint_rect, *background_client); - RecordRegionCaptureData(paint_info, paint_rect, *background_client); - - // Record the scroll hit test after the non-scrolling background so - // background squashing is not affected. Hit test order would be equivalent - // if this were immediately before the non-scrolling background. - if (!painting_background_in_contents_space) - RecordScrollHitTestData(paint_info, *background_client); -} - -void BoxPainter::PaintBoxDecorationBackgroundWithRect( - const PaintInfo& paint_info, - const gfx::Rect& visual_rect, - const PhysicalRect& paint_rect, - const DisplayItemClient& background_client) { - const ComputedStyle& style = layout_box_.StyleRef(); - - absl::optional<DisplayItemCacheSkipper> cache_skipper; - if (RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled() && - BoxPainterBase::ShouldSkipPaintUnderInvalidationChecking(layout_box_)) - cache_skipper.emplace(paint_info.context); - - BoxDecorationData box_decoration_data(paint_info, layout_box_); - if (!box_decoration_data.ShouldPaint()) - return; - - if (DrawingRecorder::UseCachedDrawingIfPossible( - paint_info.context, background_client, - DisplayItem::kBoxDecorationBackground)) - return; - - DrawingRecorder recorder(paint_info.context, background_client, - DisplayItem::kBoxDecorationBackground, visual_rect); - GraphicsContextStateSaver state_saver(paint_info.context, false); - - bool needs_end_layer = false; - // FIXME: Should eventually give the theme control over whether the box - // shadow should paint, since controls could have custom shadows of their - // own. - if (box_decoration_data.ShouldPaintShadow()) { - BoxPainterBase::PaintNormalBoxShadow( - paint_info, paint_rect, style, PhysicalBoxSides(), - !box_decoration_data.ShouldPaintBackground()); - } - - if (BleedAvoidanceIsClipping( - box_decoration_data.GetBackgroundBleedAvoidance())) { - state_saver.Save(); - FloatRoundedRect border = - RoundedBorderGeometry::PixelSnappedRoundedBorder(style, paint_rect); - paint_info.context.ClipRoundedRect(border); - - if (box_decoration_data.GetBackgroundBleedAvoidance() == - kBackgroundBleedClipLayer) { - paint_info.context.BeginLayer(); - needs_end_layer = true; - } - } - - // If we have a native theme appearance, paint that before painting our - // background. The theme will tell us whether or not we should also paint the - // CSS background. - gfx::Rect snapped_paint_rect = ToPixelSnappedRect(paint_rect); - ThemePainter& theme_painter = LayoutTheme::GetTheme().Painter(); - bool theme_painted = - box_decoration_data.HasAppearance() && - !theme_painter.Paint(layout_box_, paint_info, snapped_paint_rect); - if (!theme_painted) { - if (box_decoration_data.ShouldPaintBackground()) { - PaintBackground(paint_info, paint_rect, - box_decoration_data.BackgroundColor(), - box_decoration_data.GetBackgroundBleedAvoidance()); - } - if (box_decoration_data.HasAppearance()) { - theme_painter.PaintDecorations(layout_box_.GetNode(), - layout_box_.GetDocument(), style, - paint_info, snapped_paint_rect); - } - } - - if (box_decoration_data.ShouldPaintShadow()) { - BoxPainterBase::PaintInsetBoxShadowWithBorderRect(paint_info, paint_rect, - style); - } - - // The theme will tell us whether or not we should also paint the CSS - // border. - if (box_decoration_data.ShouldPaintBorder()) { - if (!theme_painted) { - theme_painted = - box_decoration_data.HasAppearance() && - !theme_painter.PaintBorderOnly(layout_box_.GetNode(), style, - paint_info, snapped_paint_rect); - } - if (!theme_painted) { - BoxPainterBase::PaintBorder( - layout_box_, layout_box_.GetDocument(), layout_box_.GeneratingNode(), - paint_info, paint_rect, style, - box_decoration_data.GetBackgroundBleedAvoidance()); - } - } - - if (needs_end_layer) - paint_info.context.EndLayer(); -} - -void BoxPainter::PaintBackground(const PaintInfo& paint_info, - const PhysicalRect& paint_rect, - const Color& background_color, - BackgroundBleedAvoidance bleed_avoidance) { - if (layout_box_.BackgroundTransfersToView()) - return; - if (layout_box_.BackgroundIsKnownToBeObscured()) - return; - BackgroundImageGeometry geometry(layout_box_); - BoxModelObjectPainter box_model_painter(layout_box_); - box_model_painter.PaintFillLayers(paint_info, background_color, - layout_box_.StyleRef().BackgroundLayers(), - paint_rect, geometry, bleed_avoidance); -} - -void BoxPainter::PaintMask(const PaintInfo& paint_info, - const PhysicalOffset& paint_offset) { - DCHECK_EQ(PaintPhase::kMask, paint_info.phase); - - if (!layout_box_.HasMask() || - layout_box_.StyleRef().Visibility() != EVisibility::kVisible) - return; - - if (DrawingRecorder::UseCachedDrawingIfPossible( - paint_info.context, layout_box_, paint_info.phase)) - return; - - PhysicalRect paint_rect(paint_offset, layout_box_.Size()); - BoxDrawingRecorder recorder(paint_info.context, layout_box_, paint_info.phase, - paint_offset); - PaintMaskImages(paint_info, paint_rect); -} - -void BoxPainter::PaintMaskImages(const PaintInfo& paint_info, - const PhysicalRect& paint_rect) { - // For mask images legacy layout painting handles multi-line boxes by giving - // the full width of the element, not the current line box, thereby clipping - // the offending edges. - BackgroundImageGeometry geometry(layout_box_); - BoxModelObjectPainter painter(layout_box_); - painter.PaintMaskImages(paint_info, paint_rect, layout_box_, geometry, - PhysicalBoxSides()); -} - void BoxPainter::RecordHitTestData(const PaintInfo& paint_info, const PhysicalRect& paint_rect, const DisplayItemClient& background_client) {
diff --git a/third_party/blink/renderer/core/paint/box_painter.h b/third_party/blink/renderer/core/paint/box_painter.h index a40c0209..a1929ddf 100644 --- a/third_party/blink/renderer/core/paint/box_painter.h +++ b/third_party/blink/renderer/core/paint/box_painter.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BOX_PAINTER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BOX_PAINTER_H_ -#include "third_party/blink/renderer/core/layout/background_bleed_avoidance.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.h" #include "third_party/blink/renderer/platform/geometry/layout_size.h" @@ -21,23 +20,6 @@ public: BoxPainter(const LayoutBox& layout_box) : layout_box_(layout_box) {} - void Paint(const PaintInfo&); - - void PaintChildren(const PaintInfo&); - void PaintBoxDecorationBackground(const PaintInfo&, - const PhysicalOffset& paint_offset); - void PaintMask(const PaintInfo&, const PhysicalOffset& paint_offset); - - void PaintMaskImages(const PaintInfo&, const PhysicalRect&); - - // |visual_rect| is for the drawing display item, covering overflowing box - // shadows and border image outsets. |paint_rect| is the border box rect in - // paint coordinates. - void PaintBoxDecorationBackgroundWithRect( - const PaintInfo& paint_info, - const gfx::Rect& visual_rect, - const PhysicalRect& paint_rect, - const DisplayItemClient& background_client); // Expands the bounds of the current paint chunk for hit test, and records // special touch action if any. This should be called in the background paint @@ -67,11 +49,6 @@ gfx::Rect VisualRect(const PhysicalOffset& paint_offset); private: - void PaintBackground(const PaintInfo&, - const PhysicalRect&, - const Color& background_color, - BackgroundBleedAvoidance = kBackgroundBleedNone); - const LayoutBox& layout_box_; };
diff --git a/third_party/blink/renderer/core/paint/build.gni b/third_party/blink/renderer/core/paint/build.gni index c292d8d1d..87df076 100644 --- a/third_party/blink/renderer/core/paint/build.gni +++ b/third_party/blink/renderer/core/paint/build.gni
@@ -9,8 +9,6 @@ "background_image_geometry.h", "block_flow_paint_invalidator.cc", "block_flow_paint_invalidator.h", - "block_painter.cc", - "block_painter.h", "block_paint_invalidator.cc", "block_paint_invalidator.h", "box_border_painter.cc",
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc index 8acc0a2..6ed97f6 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -703,7 +703,6 @@ // Apply overflow clip if needed. // reveal-caret-of-multiline-contenteditable.html needs this. - // TDOO(yoisn): We should share this code with |BlockPainter::Paint()| absl::optional<ScopedPaintChunkProperties> paint_chunk_properties; if (const auto* fragment = paint_state.FragmentToPaint()) { if (const auto* properties = fragment->PaintProperties()) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_fragment_painter.cc index ee0254f..b4c5aa7 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_fragment_painter.cc
@@ -18,12 +18,13 @@ const ComputedStyle& style_to_use) { const NGPhysicalBoxFragment& fragment = PhysicalFragment(); DCHECK(NGOutlineUtils::HasPaintedOutline(style_to_use, fragment.GetNode())); - Vector<PhysicalRect> outline_rects; + VectorOutlineRectCollector collector; LayoutObject::OutlineInfo info; fragment.AddSelfOutlineRects( paint_offset, style_to_use.OutlineRectsShouldIncludeBlockVisualOverflow(), - &outline_rects, &info); + collector, &info); + VectorOf<PhysicalRect> outline_rects = collector.TakeRects(); if (outline_rects.empty()) return;
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.cc b/third_party/blink/renderer/core/paint/replaced_painter.cc index fc9f5fa..2a95a52a 100644 --- a/third_party/blink/renderer/core/paint/replaced_painter.cc +++ b/third_party/blink/renderer/core/paint/replaced_painter.cc
@@ -9,19 +9,28 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/core/layout/layout_replaced.h" +#include "third_party/blink/renderer/core/layout/layout_theme.h" #include "third_party/blink/renderer/core/layout/layout_view.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" #include "third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.h" +#include "third_party/blink/renderer/core/paint/background_image_geometry.h" +#include "third_party/blink/renderer/core/paint/box_decoration_data.h" +#include "third_party/blink/renderer/core/paint/box_model_object_painter.h" #include "third_party/blink/renderer/core/paint/box_painter.h" +#include "third_party/blink/renderer/core/paint/box_painter_base.h" #include "third_party/blink/renderer/core/paint/highlight_painting_utils.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_info.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/rounded_border_geometry.h" #include "third_party/blink/renderer/core/paint/scoped_paint_state.h" #include "third_party/blink/renderer/core/paint/scrollable_area_painter.h" #include "third_party/blink/renderer/core/paint/selection_bounds_recorder.h" +#include "third_party/blink/renderer/core/paint/theme_painter.h" +#include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h" +#include "third_party/blink/renderer/platform/graphics/paint/display_item_cache_skipper.h" #include "third_party/blink/renderer/platform/graphics/paint/drawing_recorder.h" #include "third_party/blink/renderer/platform/graphics/paint/scoped_paint_chunk_properties.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" @@ -140,8 +149,7 @@ return; } - BoxPainter(layout_replaced_) - .PaintBoxDecorationBackground(local_paint_info, paint_offset); + PaintBoxDecorationBackground(local_paint_info, paint_offset); } // We're done. We don't bother painting any children. if (local_paint_info.phase == PaintPhase::kSelfBlockBackgroundOnly) @@ -149,7 +157,7 @@ } if (local_paint_info.phase == PaintPhase::kMask) { - BoxPainter(layout_replaced_).PaintMask(local_paint_info, paint_offset); + PaintMask(local_paint_info, paint_offset); return; } @@ -300,4 +308,217 @@ } } +void ReplacedPainter::PaintBoxDecorationBackground( + const PaintInfo& paint_info, + const PhysicalOffset& paint_offset) { + if (layout_replaced_.StyleRef().Visibility() != EVisibility::kVisible) { + return; + } + + PhysicalRect paint_rect; + const DisplayItemClient* background_client = nullptr; + absl::optional<ScopedBoxContentsPaintState> contents_paint_state; + bool painting_background_in_contents_space = + paint_info.IsPaintingBackgroundInContentsSpace(); + gfx::Rect visual_rect; + if (painting_background_in_contents_space) { + // For the case where we are painting the background in the contents space, + // we need to include the entire overflow rect. + paint_rect = layout_replaced_.PhysicalLayoutOverflowRect(); + contents_paint_state.emplace(paint_info, paint_offset, layout_replaced_); + paint_rect.Move(contents_paint_state->PaintOffset()); + + // The background painting code assumes that the borders are part of the + // paint_rect so we expand the paint_rect by the border size when painting + // the background into the scrolling contents layer. + paint_rect.Expand(layout_replaced_.BorderBoxOutsets()); + + background_client = &layout_replaced_.GetScrollableArea() + ->GetScrollingBackgroundDisplayItemClient(); + visual_rect = + layout_replaced_.GetScrollableArea()->ScrollingBackgroundVisualRect( + paint_offset); + } else { + paint_rect = layout_replaced_.PhysicalBorderBoxRect(); + paint_rect.Move(paint_offset); + background_client = &layout_replaced_; + visual_rect = BoxPainter(layout_replaced_).VisualRect(paint_offset); + } + + // Paint the background if we're visible and this block has a box decoration + // (background, border, appearance, or box shadow). + const ComputedStyle& style = layout_replaced_.StyleRef(); + if (style.Visibility() == EVisibility::kVisible && + layout_replaced_.HasBoxDecorationBackground()) { + PaintBoxDecorationBackgroundWithRect( + contents_paint_state ? contents_paint_state->GetPaintInfo() + : paint_info, + visual_rect, paint_rect, *background_client); + } + + BoxPainter(layout_replaced_) + .RecordHitTestData(paint_info, paint_rect, *background_client); + BoxPainter(layout_replaced_) + .RecordRegionCaptureData(paint_info, paint_rect, *background_client); + + // Record the scroll hit test after the non-scrolling background so + // background squashing is not affected. Hit test order would be equivalent + // if this were immediately before the non-scrolling background. + if (!painting_background_in_contents_space) { + BoxPainter(layout_replaced_) + .RecordScrollHitTestData(paint_info, *background_client); + } +} + +void ReplacedPainter::PaintBoxDecorationBackgroundWithRect( + const PaintInfo& paint_info, + const gfx::Rect& visual_rect, + const PhysicalRect& paint_rect, + const DisplayItemClient& background_client) { + const ComputedStyle& style = layout_replaced_.StyleRef(); + + absl::optional<DisplayItemCacheSkipper> cache_skipper; + if (RuntimeEnabledFeatures::PaintUnderInvalidationCheckingEnabled() && + BoxPainterBase::ShouldSkipPaintUnderInvalidationChecking( + layout_replaced_)) { + cache_skipper.emplace(paint_info.context); + } + + BoxDecorationData box_decoration_data(paint_info, layout_replaced_); + if (!box_decoration_data.ShouldPaint()) { + return; + } + + if (DrawingRecorder::UseCachedDrawingIfPossible( + paint_info.context, background_client, + DisplayItem::kBoxDecorationBackground)) { + return; + } + + DrawingRecorder recorder(paint_info.context, background_client, + DisplayItem::kBoxDecorationBackground, visual_rect); + GraphicsContextStateSaver state_saver(paint_info.context, false); + + bool needs_end_layer = false; + // FIXME: Should eventually give the theme control over whether the box + // shadow should paint, since controls could have custom shadows of their + // own. + if (box_decoration_data.ShouldPaintShadow()) { + BoxPainterBase::PaintNormalBoxShadow( + paint_info, paint_rect, style, PhysicalBoxSides(), + !box_decoration_data.ShouldPaintBackground()); + } + + if (BleedAvoidanceIsClipping( + box_decoration_data.GetBackgroundBleedAvoidance())) { + state_saver.Save(); + FloatRoundedRect border = + RoundedBorderGeometry::PixelSnappedRoundedBorder(style, paint_rect); + paint_info.context.ClipRoundedRect(border); + + if (box_decoration_data.GetBackgroundBleedAvoidance() == + kBackgroundBleedClipLayer) { + paint_info.context.BeginLayer(); + needs_end_layer = true; + } + } + + // If we have a native theme appearance, paint that before painting our + // background. The theme will tell us whether or not we should also paint the + // CSS background. + gfx::Rect snapped_paint_rect = ToPixelSnappedRect(paint_rect); + ThemePainter& theme_painter = LayoutTheme::GetTheme().Painter(); + bool theme_painted = + box_decoration_data.HasAppearance() && + !theme_painter.Paint(layout_replaced_, paint_info, snapped_paint_rect); + if (!theme_painted) { + if (box_decoration_data.ShouldPaintBackground()) { + PaintBackground(paint_info, paint_rect, + box_decoration_data.BackgroundColor(), + box_decoration_data.GetBackgroundBleedAvoidance()); + } + if (box_decoration_data.HasAppearance()) { + theme_painter.PaintDecorations(layout_replaced_.GetNode(), + layout_replaced_.GetDocument(), style, + paint_info, snapped_paint_rect); + } + } + + if (box_decoration_data.ShouldPaintShadow()) { + BoxPainterBase::PaintInsetBoxShadowWithBorderRect(paint_info, paint_rect, + style); + } + + // The theme will tell us whether or not we should also paint the CSS + // border. + if (box_decoration_data.ShouldPaintBorder()) { + if (!theme_painted) { + theme_painted = + box_decoration_data.HasAppearance() && + !theme_painter.PaintBorderOnly(layout_replaced_.GetNode(), style, + paint_info, snapped_paint_rect); + } + if (!theme_painted) { + BoxPainterBase::PaintBorder( + layout_replaced_, layout_replaced_.GetDocument(), + layout_replaced_.GeneratingNode(), paint_info, paint_rect, style, + box_decoration_data.GetBackgroundBleedAvoidance()); + } + } + + if (needs_end_layer) { + paint_info.context.EndLayer(); + } +} + +void ReplacedPainter::PaintBackground( + const PaintInfo& paint_info, + const PhysicalRect& paint_rect, + const Color& background_color, + BackgroundBleedAvoidance bleed_avoidance) { + if (layout_replaced_.BackgroundTransfersToView()) { + return; + } + if (layout_replaced_.BackgroundIsKnownToBeObscured()) { + return; + } + BackgroundImageGeometry geometry(layout_replaced_); + BoxModelObjectPainter box_model_painter(layout_replaced_); + box_model_painter.PaintFillLayers( + paint_info, background_color, + layout_replaced_.StyleRef().BackgroundLayers(), paint_rect, geometry, + bleed_avoidance); +} + +void ReplacedPainter::PaintMask(const PaintInfo& paint_info, + const PhysicalOffset& paint_offset) { + DCHECK_EQ(PaintPhase::kMask, paint_info.phase); + + if (!layout_replaced_.HasMask() || + layout_replaced_.StyleRef().Visibility() != EVisibility::kVisible) { + return; + } + + if (DrawingRecorder::UseCachedDrawingIfPossible( + paint_info.context, layout_replaced_, paint_info.phase)) { + return; + } + + PhysicalRect paint_rect(paint_offset, layout_replaced_.Size()); + BoxDrawingRecorder recorder(paint_info.context, layout_replaced_, + paint_info.phase, paint_offset); + PaintMaskImages(paint_info, paint_rect); +} + +void ReplacedPainter::PaintMaskImages(const PaintInfo& paint_info, + const PhysicalRect& paint_rect) { + // For mask images legacy layout painting handles multi-line boxes by giving + // the full width of the element, not the current line box, thereby clipping + // the offending edges. + BackgroundImageGeometry geometry(layout_replaced_); + BoxModelObjectPainter painter(layout_replaced_); + painter.PaintMaskImages(paint_info, paint_rect, layout_replaced_, geometry, + PhysicalBoxSides()); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/replaced_painter.h b/third_party/blink/renderer/core/paint/replaced_painter.h index 23abdc2..9350a371 100644 --- a/third_party/blink/renderer/core/paint/replaced_painter.h +++ b/third_party/blink/renderer/core/paint/replaced_painter.h
@@ -5,12 +5,21 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_REPLACED_PAINTER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_REPLACED_PAINTER_H_ +#include "third_party/blink/renderer/core/layout/background_bleed_avoidance.h" #include "third_party/blink/renderer/platform/geometry/layout_point.h" +#include "third_party/blink/renderer/platform/graphics/color.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +namespace gfx { +class Rect; +} // namespace gfx + namespace blink { struct PaintInfo; +struct PhysicalOffset; +struct PhysicalRect; +class DisplayItemClient; class ScopedPaintState; class LayoutReplaced; @@ -29,6 +38,26 @@ bool ShouldPaintBoxDecorationBackground(const PaintInfo&); void MeasureOverflowMetrics() const; + void PaintBoxDecorationBackground(const PaintInfo&, + const PhysicalOffset& paint_offset); + + // |visual_rect| is for the drawing display item, covering overflowing box + // shadows and border image outsets. |paint_rect| is the border box rect in + // paint coordinates. + void PaintBoxDecorationBackgroundWithRect( + const PaintInfo& paint_info, + const gfx::Rect& visual_rect, + const PhysicalRect& paint_rect, + const DisplayItemClient& background_client); + + void PaintBackground(const PaintInfo&, + const PhysicalRect&, + const Color& background_color, + BackgroundBleedAvoidance = kBackgroundBleedNone); + + void PaintMask(const PaintInfo&, const PhysicalOffset& paint_offset); + void PaintMaskImages(const PaintInfo&, const PhysicalRect&); + const LayoutReplaced& layout_replaced_; };
diff --git a/third_party/blink/renderer/core/paint/svg_foreign_object_painter.cc b/third_party/blink/renderer/core/paint/svg_foreign_object_painter.cc index e6256c1..f8d41c8f 100644 --- a/third_party/blink/renderer/core/paint/svg_foreign_object_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_foreign_object_painter.cc
@@ -6,7 +6,6 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_foreign_object.h" -#include "third_party/blink/renderer/core/paint/block_painter.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" #include "third_party/blink/renderer/core/paint/paint_layer_painter.h"
diff --git a/third_party/blink/renderer/core/paint/svg_root_painter.cc b/third_party/blink/renderer/core/paint/svg_root_painter.cc index 83cc039..23a2c881 100644 --- a/third_party/blink/renderer/core/paint/svg_root_painter.cc +++ b/third_party/blink/renderer/core/paint/svg_root_painter.cc
@@ -5,12 +5,14 @@ #include "third_party/blink/renderer/core/paint/svg_root_painter.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/core/layout/ng/svg/layout_ng_svg_foreign_object.h" #include "third_party/blink/renderer/core/layout/svg/layout_svg_root.h" #include "third_party/blink/renderer/core/layout/svg/svg_layout_support.h" #include "third_party/blink/renderer/core/paint/box_painter.h" #include "third_party/blink/renderer/core/paint/object_paint_properties.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/core/paint/scoped_svg_paint_state.h" +#include "third_party/blink/renderer/core/paint/svg_foreign_object_painter.h" #include "third_party/blink/renderer/core/svg/svg_svg_element.h" namespace blink { @@ -51,7 +53,20 @@ return; ScopedSVGPaintState paint_state(layout_svg_root_, paint_info); - BoxPainter(layout_svg_root_).PaintChildren(paint_info); + + if (paint_info.DescendantPaintingBlocked()) { + return; + } + + PaintInfo child_info(paint_info); + for (LayoutObject* child = layout_svg_root_.FirstChild(); child; + child = child->NextSibling()) { + if (auto* foreign_object = DynamicTo<LayoutNGSVGForeignObject>(child)) { + SVGForeignObjectPainter(*foreign_object).PaintLayer(paint_info); + } else { + child->Paint(child_info); + } + } } } // namespace blink
diff --git a/third_party/blink/renderer/core/streams/build.gni b/third_party/blink/renderer/core/streams/build.gni index c98d5a0..b129bd1 100644 --- a/third_party/blink/renderer/core/streams/build.gni +++ b/third_party/blink/renderer/core/streams/build.gni
@@ -5,6 +5,8 @@ blink_core_sources_streams = [ "byte_length_queuing_strategy.cc", "byte_length_queuing_strategy.h", + "byte_stream_tee_engine.cc", + "byte_stream_tee_engine.h", "count_queuing_strategy.cc", "count_queuing_strategy.h", "miscellaneous_operations.cc",
diff --git a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc new file mode 100644 index 0000000..14920c60 --- /dev/null +++ b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.cc
@@ -0,0 +1,712 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/streams/byte_stream_tee_engine.h" + +#include "third_party/blink/renderer/bindings/core/v8/script_function.h" +#include "third_party/blink/renderer/core/execution_context/agent.h" +#include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/streams/miscellaneous_operations.h" +#include "third_party/blink/renderer/core/streams/promise_handler.h" +#include "third_party/blink/renderer/core/streams/read_into_request.h" +#include "third_party/blink/renderer/core/streams/read_request.h" +#include "third_party/blink/renderer/core/streams/readable_byte_stream_controller.h" +#include "third_party/blink/renderer/core/streams/readable_stream.h" +#include "third_party/blink/renderer/core/streams/readable_stream_byob_reader.h" +#include "third_party/blink/renderer/core/streams/readable_stream_byob_request.h" +#include "third_party/blink/renderer/core/streams/readable_stream_default_reader.h" +#include "third_party/blink/renderer/core/streams/stream_algorithms.h" +#include "third_party/blink/renderer/core/streams/stream_promise_resolver.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/wtf/functional.h" + +namespace blink { + +class ByteStreamTeeEngine::PullAlgorithm final : public StreamAlgorithm { + public: + PullAlgorithm(ByteStreamTeeEngine* engine, int branch) + : engine_(engine), branch_(branch) { + DCHECK(branch == 0 || branch == 1); + } + + v8::Local<v8::Promise> Run(ScriptState* script_state, + int argc, + v8::Local<v8::Value> argv[]) override { + // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee + // This implements both pull1Algorithm and pull2Algorithm as they are + // identical except for the index they operate on. Standard comments are + // from pull1Algorithm. + // 17. Let pull1Algorithm be the following steps: + // a. If reading is true, + ExceptionState exception_state(script_state->GetIsolate(), + ExceptionState::kUnknownContext, "", ""); + if (engine_->reading_) { + // i. Set readAgainForBranch1 to true. + engine_->read_again_for_branch_[branch_] = true; + // ii. Return a promise resolved with undefined. + return PromiseResolveWithUndefined(script_state); + } + // b. Set reading to true. + engine_->reading_ = true; + // c. Let byobRequest be ! + // ReadableByteStreamControllerGetBYOBRequest(branch1.[[controller]]). + ReadableStreamBYOBRequest* byob_request = + ReadableByteStreamController::GetBYOBRequest( + engine_->controller_[branch_]); + // d. If byobRequest is null, perform pullWithDefaultReader. + if (!byob_request) { + engine_->PullWithDefaultReader(script_state, exception_state); + } else { + // e. Otherwise, perform pullWithBYOBReader, given byobRequest.[[view]] + // and false. + engine_->PullWithBYOBReader(script_state, byob_request->view(), branch_, + exception_state); + } + // f. Return a promise resolved with undefined. + return PromiseResolveWithUndefined(script_state); + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(engine_); + StreamAlgorithm::Trace(visitor); + } + + private: + Member<ByteStreamTeeEngine> engine_; + const int branch_; +}; + +class ByteStreamTeeEngine::CancelAlgorithm final : public StreamAlgorithm { + public: + CancelAlgorithm(ByteStreamTeeEngine* engine, int branch) + : engine_(engine), branch_(branch) { + DCHECK(branch == 0 || branch == 1); + } + + v8::Local<v8::Promise> Run(ScriptState* script_state, + int argc, + v8::Local<v8::Value> argv[]) override { + // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee + // This implements both cancel1Algorithm and cancel2Algorithm as they are + // identical except for the index they operate on. Standard comments are + // from cancel1Algorithm. + // 19. Let cancel1Algorithm be the following steps, taking a reason + // argument: + auto* isolate = script_state->GetIsolate(); + // a. Set canceled1 to true. + engine_->canceled_[branch_] = true; + // b. Set reason1 to reason. + DCHECK_EQ(argc, 1); + engine_->reason_[branch_].Reset(isolate, argv[0]); + // c. If canceled2 is true, + const int other_branch = 1 - branch_; + if (engine_->canceled_[other_branch]) { + // i. Let compositeReason be ! CreateArrayFromList(« reason1, reason2 + // »). + v8::Local<v8::Value> reason[] = {engine_->reason_[0].Get(isolate), + engine_->reason_[1].Get(isolate)}; + v8::Local<v8::Value> composite_reason = + v8::Array::New(script_state->GetIsolate(), reason, 2); + // ii. Let cancelResult be ! ReadableStreamCancel(stream, + // compositeReason). + auto cancel_result = ReadableStream::Cancel( + script_state, engine_->stream_, composite_reason); + // iii. Resolve cancelPromise with cancelResult. + engine_->cancel_promise_->Resolve(script_state, cancel_result); + } + // d. Return cancelPromise. + return engine_->cancel_promise_->V8Promise(isolate); + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(engine_); + StreamAlgorithm::Trace(visitor); + } + + private: + Member<ByteStreamTeeEngine> engine_; + const int branch_; +}; + +class ByteStreamTeeEngine::ByteTeeReadRequest final : public ReadRequest { + public: + explicit ByteTeeReadRequest(ByteStreamTeeEngine* engine) : engine_(engine) {} + + void ChunkSteps(ScriptState* script_state, + v8::Local<v8::Value> chunk) const override { + scoped_refptr<scheduler::EventLoop> event_loop = + ExecutionContext::From(script_state)->GetAgent()->event_loop(); + v8::Global<v8::Value> value(script_state->GetIsolate(), chunk); + event_loop->EnqueueMicrotask( + WTF::BindOnce(&ByteTeeReadRequest::ChunkStepsBody, WrapPersistent(this), + WrapPersistent(script_state), std::move(value))); + } + + void CloseSteps(ScriptState* script_state) const override { + // 1. Set reading to false. + engine_->reading_ = false; + ExceptionState exception_state(script_state->GetIsolate(), + ExceptionState::kUnknownContext, "", ""); + // 2. If canceled1 is false, perform ! + // ReadableByteStreamControllerClose(branch1.[[controller]]). + // 3. If canceled2 is false, perform ! + // ReadableByteStreamControllerClose(branch2.[[controller]]). + for (int branch = 0; branch < 2; ++branch) { + if (!engine_->canceled_[branch]) { + engine_->controller_[branch]->Close( + script_state, engine_->controller_[branch], exception_state); + if (exception_state.HadException()) { + // Instead of returning a rejection, which is inconvenient here, + // call ControllerError(). The only difference this makes is that it + // happens synchronously, but that should not be observable. + ReadableByteStreamController::Error(script_state, + engine_->controller_[branch], + exception_state.GetException()); + exception_state.ClearException(); + return; + } + } + } + // 4. If branch1.[[controller]].[[pendingPullIntos]] is not empty, perform + // ! ReadableByteStreamControllerRespond(branch1.[[controller]], 0). + // 5. If branch2.[[controller]].[[pendingPullIntos]] is not empty, perform + // ! ReadableByteStreamControllerRespond(branch2.[[controller]], 0). + for (int branch = 0; branch < 2; ++branch) { + if (!engine_->controller_[branch]->pending_pull_intos_.empty()) { + ReadableByteStreamController::Respond( + script_state, engine_->controller_[branch], 0, exception_state); + if (exception_state.HadException()) { + // Instead of returning a rejection, which is inconvenient here, + // call ControllerError(). The only difference this makes is that it + // happens synchronously, but that should not be observable. + ReadableByteStreamController::Error(script_state, + engine_->controller_[branch], + exception_state.GetException()); + exception_state.ClearException(); + return; + } + } + } + // 6. If canceled1 is false or canceled2 is false, resolve cancelPromise + // with undefined. + if (!engine_->canceled_[0] || !engine_->canceled_[1]) { + engine_->cancel_promise_->ResolveWithUndefined(script_state); + } + } + + void ErrorSteps(ScriptState* script_state, + v8::Local<v8::Value> e) const override { + // 1. Set reading to false. + engine_->reading_ = false; + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(engine_); + ReadRequest::Trace(visitor); + } + + private: + void ChunkStepsBody(ScriptState* script_state, + v8::Global<v8::Value> value) const { + // 1. Set readAgainForBranch1 to false. + engine_->read_again_for_branch_[0] = false; + // 2. Set readAgainForBranch2 to false. + engine_->read_again_for_branch_[1] = false; + + ExceptionState exception_state(script_state->GetIsolate(), + ExceptionState::kUnknownContext, "", ""); + + // 3. Let chunk1 and chunk2 be chunk. + NotShared<DOMUint8Array> chunk[2]; + NotShared<DOMUint8Array> buffer_view = + NativeValueTraits<NotShared<DOMUint8Array>>::NativeValue( + script_state->GetIsolate(), value.Get(script_state->GetIsolate()), + exception_state); + chunk[0] = buffer_view; + chunk[1] = buffer_view; + + // 4. If canceled1 is false and canceled2 is false, + if (!engine_->canceled_[0] && !engine_->canceled_[1]) { + // a. Let cloneResult be CloneAsUint8Array(chunk). + auto* clone_result = engine_->CloneAsUint8Array(buffer_view.Get()); + // b. If cloneResult is an abrupt completion, + // i. Perform ! + // ReadableByteStreamControllerError(branch1.[[controller]], + // cloneResult.[[Value]]). + // ii. Perform ! + // ReadableByteStreamControllerError(branch2.[[controller]], + // cloneResult.[[Value]]). + // iii. Resolve cancelPromise with ! + // ReadableStreamCancel(stream, cloneResult.[[Value]]). + // iv. Return. + // This is not needed as DOMArrayBuffer::Create(), which is used in + // CloneAsUint8Array(), is designed to crash if it cannot allocate the + // memory. + + // c. Otherwise, set chunk2 to cloneResult.[[Value]]. + chunk[1] = NotShared<DOMUint8Array>(clone_result); + } + + // 5. If canceled1 is false, perform ! + // ReadableByteStreamControllerEnqueue(branch1.[[controller]], chunk1). + // 6. If canceled2 is false, perform ! + // ReadableByteStreamControllerEnqueue(branch2.[[controller]], chunk2). + for (int branch = 0; branch < 2; ++branch) { + if (!engine_->canceled_[branch]) { + ReadableByteStreamController::Enqueue(script_state, + engine_->controller_[branch], + chunk[branch], exception_state); + if (exception_state.HadException()) { + // Instead of returning a rejection, which is inconvenient here, + // call ControllerError(). The only difference this makes is that it + // happens synchronously, but that should not be observable. + ReadableByteStreamController::Error(script_state, + engine_->controller_[branch], + exception_state.GetException()); + exception_state.ClearException(); + return; + } + } + } + + // 7. Set reading to false. + engine_->reading_ = false; + + // 8. If readAgainForBranch1 is true, perform pull1Algorithm. + if (engine_->read_again_for_branch_[0]) { + auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 0); + pull_algorithm->Run(script_state, 0, nullptr); + // 9. Otherwise, if readAgainForBranch2 is true, perform pull2Algorithm. + } else if (engine_->read_again_for_branch_[1]) { + auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 1); + pull_algorithm->Run(script_state, 0, nullptr); + } + } + + Member<ByteStreamTeeEngine> engine_; +}; + +class ByteStreamTeeEngine::ByteTeeReadIntoRequest final + : public ReadIntoRequest { + public: + explicit ByteTeeReadIntoRequest(ByteStreamTeeEngine* engine, + ReadableStream* byob_branch, + ReadableStream* other_branch, + bool for_branch_2) + : engine_(engine), + byob_branch_(byob_branch), + other_branch_(other_branch), + for_branch_2_(for_branch_2) {} + + void ChunkSteps(ScriptState* script_state, + DOMArrayBufferView* chunk) const override { + scoped_refptr<scheduler::EventLoop> event_loop = + ExecutionContext::From(script_state)->GetAgent()->event_loop(); + event_loop->EnqueueMicrotask(WTF::BindOnce( + &ByteTeeReadIntoRequest::ChunkStepsBody, WrapPersistent(this), + WrapPersistent(script_state), WrapPersistent(chunk))); + } + + void CloseSteps(ScriptState* script_state, + DOMArrayBufferView* chunk) const override { + // 1. Set reading to false. + engine_->reading_ = false; + // 2. Let byobCanceled be canceled2 if forBranch2 is true, and canceled1 + // otherwise. + auto byob_canceled = + for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; + // 3. Let otherCanceled be canceled2 if forBranch2 is false, and canceled1 + // otherwise. + auto other_canceled = + !for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; + // 4. If byobCanceled is false, perform ! + // ReadableByteStreamControllerClose(byobBranch.[[controller]]). + ExceptionState exception_state(script_state->GetIsolate(), + ExceptionState::kUnknownContext, "", ""); + if (!byob_canceled) { + ReadableStreamController* controller = + byob_branch_->readable_stream_controller_; + ReadableByteStreamController* byte_controller = + To<ReadableByteStreamController>(controller); + byte_controller->Close(script_state, byte_controller, exception_state); + DCHECK(!exception_state.HadException()); + } + // 5. If otherCanceled is false, perform ! + // ReadableByteStreamControllerClose(otherBranch.[[controller]]). + if (!other_canceled) { + ReadableStreamController* controller = + other_branch_->readable_stream_controller_; + ReadableByteStreamController* byte_controller = + To<ReadableByteStreamController>(controller); + byte_controller->Close(script_state, byte_controller, exception_state); + DCHECK(!exception_state.HadException()); + } + // 6. If chunk is not undefined, + if (chunk) { + // a. Assert: chunk.[[ByteLength]] is 0. + DCHECK_EQ(chunk->byteLength(), 0u); + // b. If byobCanceled is false, perform ! + // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], + // chunk). + if (!byob_canceled) { + ReadableStreamController* controller = + byob_branch_->readable_stream_controller_; + ReadableByteStreamController::RespondWithNewView( + script_state, To<ReadableByteStreamController>(controller), + NotShared<DOMArrayBufferView>(chunk), exception_state); + DCHECK(!exception_state.HadException()); + } + // c. If otherCanceled is false and + // otherBranch.[[controller]].[[pendingPullIntos]] is not empty, + // perform ! + // ReadableByteStreamControllerRespond(otherBranch.[[controller]], + // 0). + ReadableStreamController* controller = + other_branch_->readable_stream_controller_; + if (!other_canceled && !To<ReadableByteStreamController>(controller) + ->pending_pull_intos_.empty()) { + ReadableByteStreamController::Respond( + script_state, To<ReadableByteStreamController>(controller), 0, + exception_state); + DCHECK(!exception_state.HadException()); + } + } + // 7. If byobCanceled is false or otherCanceled is false, resolve + // cancelPromise with undefined. + if (!byob_canceled || !other_canceled) { + engine_->cancel_promise_->ResolveWithUndefined(script_state); + } + } + + void ErrorSteps(ScriptState* script_state, + v8::Local<v8::Value> e) const override { + // 1. Set reading to false. + engine_->reading_ = false; + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(engine_); + visitor->Trace(byob_branch_); + visitor->Trace(other_branch_); + ReadIntoRequest::Trace(visitor); + } + + private: + void ChunkStepsBody(ScriptState* script_state, + DOMArrayBufferView* chunk) const { + // 1. Set readAgainForBranch1 to false. + engine_->read_again_for_branch_[0] = false; + // 2. Set readAgainForBranch2 to false. + engine_->read_again_for_branch_[1] = false; + // 3. Let byobCanceled be canceled2 if forBranch2 is true, and canceled1 + // otherwise. + auto byob_canceled = + for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; + // 4. Let otherCanceled be canceled2 if forBranch2 is false, and canceled1 + // otherwise. + auto other_canceled = + !for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; + // 5. If otherCanceled is false, + ExceptionState exception_state(script_state->GetIsolate(), + ExceptionState::kUnknownContext, "", ""); + if (!other_canceled) { + // a. Let cloneResult be CloneAsUint8Array(chunk). + auto* clone_result = engine_->CloneAsUint8Array(chunk); + // b. If cloneResult is an abrupt completion, + // i. Perform ! + // ReadableByteStreamControllerError(byobBranch.[[controller]], + // cloneResult.[[Value]]). + // ii. Perform ! + // ReadableByteStreamControllerError(otherBranch.[[controller]], + // cloneResult.[[Value]]). + // iii. Resolve cancelPromise with ! + // ReadableStreamCancel(stream, cloneResult.[[Value]]). + // iv. Return. + // This is not needed as DOMArrayBuffer::Create(), which is used in + // CloneAsUint8Array(), is designed to crash if it cannot allocate the + // memory. + + // c. Otherwise, let clonedChunk be cloneResult.[[Value]]. + NotShared<DOMArrayBufferView> cloned_chunk = + NotShared<DOMArrayBufferView>(clone_result); + + // d. If byobCanceled is false, perform ! + // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], + // chunk). + if (!byob_canceled) { + ReadableStreamController* byob_controller = + byob_branch_->readable_stream_controller_; + ReadableByteStreamController::RespondWithNewView( + script_state, To<ReadableByteStreamController>(byob_controller), + NotShared<DOMArrayBufferView>(chunk), exception_state); + DCHECK(!exception_state.HadException()); + } + // e. Perform ! + // ReadableByteStreamControllerEnqueue(otherBranch.[[controller]], + // clonedChunk). + ReadableStreamController* other_controller = + other_branch_->readable_stream_controller_; + ReadableByteStreamController::Enqueue( + script_state, To<ReadableByteStreamController>(other_controller), + cloned_chunk, exception_state); + DCHECK(!exception_state.HadException()); + // 6. Otherwise, if byobCanceled is false, perform ! + // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], + // chunk). + } else if (!byob_canceled) { + ReadableStreamController* controller = + byob_branch_->readable_stream_controller_; + ReadableByteStreamController::RespondWithNewView( + script_state, To<ReadableByteStreamController>(controller), + NotShared<DOMArrayBufferView>(chunk), exception_state); + DCHECK(!exception_state.HadException()); + } + // 7. Set reading to false. + engine_->reading_ = false; + // 8. If readAgainForBranch1 is true, perform pull1Algorithm. + if (engine_->read_again_for_branch_[0]) { + auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 0); + pull_algorithm->Run(script_state, 0, nullptr); + // 9. Otherwise, if readAgainForBranch2 is true, perform pull2Algorithm. + } else if (engine_->read_again_for_branch_[1]) { + auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 1); + pull_algorithm->Run(script_state, 0, nullptr); + } + } + + Member<ByteStreamTeeEngine> engine_; + Member<ReadableStream> byob_branch_; + Member<ReadableStream> other_branch_; + bool for_branch_2_; +}; + +void ByteStreamTeeEngine::ForwardReaderError( + ScriptState* script_state, + ReadableStreamGenericReader* this_reader) { + // 14. Let forwardReaderError be the following steps, taking a thisReader + // argument: + class RejectFunction final : public PromiseHandler { + public: + explicit RejectFunction(ByteStreamTeeEngine* engine, + ReadableStreamGenericReader* reader) + : engine_(engine), reader_(reader) {} + + void CallWithLocal(ScriptState* script_state, + v8::Local<v8::Value> r) override { + // a. Upon rejection of thisReader.[[closedPromise]] with reason r, + // i. If thisReader is not reader, return. + if (engine_->reader_ != reader_) { + return; + } + // ii. Perform ! + // ReadableByteStreamControllerError(branch1.[[controller]], r). + ReadableByteStreamController::Error(script_state, engine_->controller_[0], + r); + // iii. Perform ! + // ReadableByteStreamControllerError(branch2.[[controller]], r). + ReadableByteStreamController::Error(script_state, engine_->controller_[1], + r); + // iv. If canceled1 is false or canceled2 is false, resolve + // cancelPromise with undefined. + if (!engine_->canceled_[0] || !engine_->canceled_[1]) { + engine_->cancel_promise_->ResolveWithUndefined(script_state); + } + } + + void Trace(Visitor* visitor) const override { + visitor->Trace(engine_); + visitor->Trace(reader_); + PromiseHandler::Trace(visitor); + } + + private: + Member<ByteStreamTeeEngine> engine_; + Member<ReadableStreamGenericReader> reader_; + }; + + StreamThenPromise( + script_state->GetContext(), + this_reader->ClosedPromise()->V8Promise(script_state->GetIsolate()), + nullptr, + MakeGarbageCollected<ScriptFunction>( + script_state, + MakeGarbageCollected<RejectFunction>(this, this_reader))); +} + +void ByteStreamTeeEngine::PullWithDefaultReader( + ScriptState* script_state, + ExceptionState& exception_state) { + // 15. Let pullWithDefaultReader be the following steps: + // a. If reader implements ReadableStreamBYOBReader, + if (reader_->IsBYOBReader()) { + // i. Assert: reader.[[readIntoRequests]] is empty. + ReadableStreamGenericReader* reader = reader_; + ReadableStreamBYOBReader* byob_reader = + To<ReadableStreamBYOBReader>(reader); + DCHECK(byob_reader->read_into_requests_.empty()); + // ii. Perform ! ReadableStreamBYOBReaderRelease(reader). + ReadableStreamBYOBReader::Release(script_state, byob_reader); + // iii. Set reader to ! AcquireReadableStreamDefaultReader(stream). + reader_ = ReadableStream::AcquireDefaultReader(script_state, stream_, + exception_state); + DCHECK(!exception_state.HadException()); + // iv. Perform forwardReaderError, given reader. + ForwardReaderError(script_state, reader_); + } + // b. Let readRequest be a read request with the following items: + auto* read_request = MakeGarbageCollected<ByteTeeReadRequest>(this); + // c. Perform ! ReadableStreamDefaultReaderRead(reader, readRequest). + ReadableStreamGenericReader* reader = reader_; + ReadableStreamDefaultReader::Read( + script_state, To<ReadableStreamDefaultReader>(reader), read_request); +} + +void ByteStreamTeeEngine::PullWithBYOBReader(ScriptState* script_state, + NotShared<DOMArrayBufferView> view, + bool for_branch_2, + ExceptionState& exception_state) { + // 16. Let pullWithBYOBReader be the following steps, given view and + // forBranch2: + // a. If reader implements ReadableStreamDefaultReader, + if (reader_->IsDefaultReader()) { + // i. Assert: reader.[[readRequests]] is empty. + ReadableStreamGenericReader* reader = reader_; + ReadableStreamDefaultReader* default_reader = + To<ReadableStreamDefaultReader>(reader); + DCHECK(default_reader->read_requests_.empty()); + // ii. Perform ! ReadableStreamDefaultReaderRelease(reader). + ReadableStreamDefaultReader::Release(script_state, default_reader); + // iii. Set reader to ! AcquireReadableStreamBYOBReader(stream). + reader_ = ReadableStream::AcquireBYOBReader(script_state, stream_, + exception_state); + DCHECK(!exception_state.HadException()); + // iv. Perform forwardReaderError, given reader. + ForwardReaderError(script_state, reader_); + } + // b. Let byobBranch be branch2 if forBranch2 is true, and branch1 + // otherwise. + ReadableStream* byob_branch = for_branch_2 ? branch_[1] : branch_[0]; + // c. Let otherBranch be branch2 if forBranch2 is false, and branch1 + // otherwise. + ReadableStream* other_branch = !for_branch_2 ? branch_[1] : branch_[0]; + // d. Let readIntoRequest be a read-into request with the following items: + auto* read_into_request = MakeGarbageCollected<ByteTeeReadIntoRequest>( + this, byob_branch, other_branch, for_branch_2); + // e. Perform ! ReadableStreamBYOBReaderRead(reader, view, + // readIntoRequest). + ReadableStreamGenericReader* reader = reader_; + ReadableStreamBYOBReader::Read(script_state, + To<ReadableStreamBYOBReader>(reader), view, + read_into_request, exception_state); + DCHECK(!exception_state.HadException()); +} + +DOMUint8Array* ByteStreamTeeEngine::CloneAsUint8Array( + DOMArrayBufferView* chunk) { + auto* cloned_buffer = + DOMArrayBuffer::Create(chunk->buffer()->Data(), chunk->byteLength()); + return DOMUint8Array::Create(cloned_buffer, chunk->byteOffset(), + chunk->byteLength()); +} + +void ByteStreamTeeEngine::Start(ScriptState* script_state, + ReadableStream* stream, + ExceptionState& exception_state) { + // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee + // 1. Assert: stream implements ReadableStream. + DCHECK(stream); + + stream_ = stream; + + // 2. Assert: stream.[[controller]] implements ReadableByteStreamController. + DCHECK(stream->readable_stream_controller_->IsByteStreamController()); + + // 3. Let reader be ? AcquireReadableStreamDefaultReader(stream). + reader_ = ReadableStream::AcquireDefaultReader(script_state, stream, + exception_state); + + // 4. Let reading be false. + DCHECK(!reading_); + + // 5. Let readAgainForBranch1 be false. + DCHECK(!read_again_for_branch_[0]); + + // 6. Let readAgainForBranch2 be false. + DCHECK(!read_again_for_branch_[1]); + + // 7. Let canceled1 be false. + DCHECK(!canceled_[0]); + + // 8. Let canceled2 be false. + DCHECK(!canceled_[1]); + + // 9. Let reason1 be undefined. + DCHECK(reason_[0].IsEmpty()); + + // 10. Let reason2 be undefined. + DCHECK(reason_[1].IsEmpty()); + + // 11. Let branch1 be undefined. + DCHECK(!branch_[0]); + + // 12. Let branch2 be undefined. + DCHECK(!branch_[1]); + + // 13. Let cancelPromise be a new promise. + cancel_promise_ = MakeGarbageCollected<StreamPromiseResolver>(script_state); + + // 17. Let pull1Algorithm be the following steps: + // (See PullAlgorithm::Run()). + auto* pull1_algorithm = MakeGarbageCollected<PullAlgorithm>(this, 0); + + // 18. Let pull2Algorithm be the following steps: + // (both algorithms share a single implementation). + auto* pull2_algorithm = MakeGarbageCollected<PullAlgorithm>(this, 1); + + // 19. Let cancel1Algorithm be the following steps, taking a reason argument: + // (See CancelAlgorithm::Run()). + auto* cancel1_algorithm = MakeGarbageCollected<CancelAlgorithm>(this, 0); + + // 20. Let cancel2Algorithm be the following steps, taking a reason argument: + // (both algorithms share a single implementation). + auto* cancel2_algorithm = MakeGarbageCollected<CancelAlgorithm>(this, 1); + + // 21. Let startAlgorithm be an algorithm that returns undefined. + auto* start_algorithm = CreateTrivialStartAlgorithm(); + + // 22. Set branch1 to ! CreateReadableByteStream(startAlgorithm, + // pull1Algorithm, cancel1Algorithm). + branch_[0] = ReadableStream::CreateByteStream( + script_state, start_algorithm, pull1_algorithm, cancel1_algorithm, + exception_state); + if (exception_state.HadException()) { + return; + } + + // 23. Set branch2 to ! CreateReadableByteStream(startAlgorithm, + // pull2Algorithm, cancel2Algorithm). + branch_[1] = ReadableStream::CreateByteStream( + script_state, start_algorithm, pull2_algorithm, cancel2_algorithm, + exception_state); + if (exception_state.HadException()) { + return; + } + + for (int branch = 0; branch < 2; ++branch) { + ReadableStreamController* controller = + branch_[branch]->readable_stream_controller_; + // We just created the branches above. It is obvious that they are byte + // stream controllers. + controller_[branch] = To<ReadableByteStreamController>(controller); + } + + // 24. Perform forwardReaderError, given reader. + ForwardReaderError(script_state, reader_); + + // Step 25. Return « branch1, branch2 ». + // is performed by the caller. +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h new file mode 100644 index 0000000..1e2c513 --- /dev/null +++ b/third_party/blink/renderer/core/streams/byte_stream_tee_engine.h
@@ -0,0 +1,88 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_BYTE_STREAM_TEE_ENGINE_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_BYTE_STREAM_TEE_ENGINE_H_ + +#include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/heap/member.h" +#include "third_party/blink/renderer/platform/heap/visitor.h" +#include "v8/include/v8.h" + +namespace blink { + +class ExceptionState; +class ReadableByteStreamController; +class ReadableStream; +class ReadableStreamGenericReader; +class ScriptState; +class StreamPromiseResolver; + +// Implementation of "ReadableByteStreamTee()" from the standard. +// https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee +class ByteStreamTeeEngine final : public GarbageCollected<ByteStreamTeeEngine> { + public: + ByteStreamTeeEngine() = default; + ByteStreamTeeEngine(const ByteStreamTeeEngine&) = delete; + ByteStreamTeeEngine& operator=(const ByteStreamTeeEngine&) = delete; + + // Create the streams and start copying data. + void Start(ScriptState*, ReadableStream*, ExceptionState&); + + // Branch1() and Branch2() are null until Start() is called. + ReadableStream* Branch1() const { return branch_[0]; } + ReadableStream* Branch2() const { return branch_[1]; } + + void Trace(Visitor* visitor) const { + visitor->Trace(stream_); + visitor->Trace(reader_); + visitor->Trace(reason_[0]); + visitor->Trace(reason_[1]); + visitor->Trace(branch_[0]); + visitor->Trace(branch_[1]); + visitor->Trace(controller_[0]); + visitor->Trace(controller_[1]); + visitor->Trace(cancel_promise_); + } + + private: + class PullAlgorithm; + class CancelAlgorithm; + + class ByteTeeReadRequest; + class ByteTeeReadIntoRequest; + + void ForwardReaderError(ScriptState*, + ReadableStreamGenericReader* this_reader); + + void PullWithDefaultReader(ScriptState*, ExceptionState&); + + void PullWithBYOBReader(ScriptState*, + NotShared<DOMArrayBufferView> view, + bool for_branch_2, + ExceptionState&); + + // https://streams.spec.whatwg.org/#abstract-opdef-cloneasuint8array + DOMUint8Array* CloneAsUint8Array(DOMArrayBufferView* chunk); + + Member<ReadableStream> stream_; + Member<ReadableStreamGenericReader> reader_; + Member<StreamPromiseResolver> cancel_promise_; + bool reading_ = false; + + // The standard contains a number of pairs of variables with one for each + // stream. These are implemented as arrays here. While they are 1-indexed in + // the standard, they are 0-indexed here; ie. "canceled_[0]" here corresponds + // to "canceled1" in the standard. + bool canceled_[2] = {false, false}; + bool read_again_for_branch_[2] = {false, false}; + TraceWrapperV8Reference<v8::Value> reason_[2]; + Member<ReadableStream> branch_[2]; + Member<ReadableByteStreamController> controller_[2]; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_STREAMS_BYTE_STREAM_TEE_ENGINE_H_
diff --git a/third_party/blink/renderer/core/streams/readable_byte_stream_controller.h b/third_party/blink/renderer/core/streams/readable_byte_stream_controller.h index 5139348..8cbeb74 100644 --- a/third_party/blink/renderer/core/streams/readable_byte_stream_controller.h +++ b/third_party/blink/renderer/core/streams/readable_byte_stream_controller.h
@@ -67,6 +67,7 @@ void Trace(Visitor*) const override; private: + friend class ByteStreamTeeEngine; friend class ReadableStream; friend class ReadableStreamBYOBReader; friend class ReadableStreamBYOBRequest;
diff --git a/third_party/blink/renderer/core/streams/readable_stream.cc b/third_party/blink/renderer/core/streams/readable_stream.cc index f15173d..feeb485 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.cc +++ b/third_party/blink/renderer/core/streams/readable_stream.cc
@@ -20,13 +20,13 @@ #include "third_party/blink/renderer/core/execution_context/agent.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/frame/web_feature.h" +#include "third_party/blink/renderer/core/streams/byte_stream_tee_engine.h" #include "third_party/blink/renderer/core/streams/miscellaneous_operations.h" #include "third_party/blink/renderer/core/streams/promise_handler.h" #include "third_party/blink/renderer/core/streams/read_into_request.h" #include "third_party/blink/renderer/core/streams/read_request.h" #include "third_party/blink/renderer/core/streams/readable_byte_stream_controller.h" #include "third_party/blink/renderer/core/streams/readable_stream_byob_reader.h" -#include "third_party/blink/renderer/core/streams/readable_stream_byob_request.h" #include "third_party/blink/renderer/core/streams/readable_stream_controller.h" #include "third_party/blink/renderer/core/streams/readable_stream_default_controller.h" #include "third_party/blink/renderer/core/streams/readable_stream_generic_reader.h" @@ -873,742 +873,6 @@ bool is_reading_ = false; }; -class ReadableStream::ByteStreamTeeEngine final - : public GarbageCollected<ByteStreamTeeEngine> { - public: - ByteStreamTeeEngine() = default; - ByteStreamTeeEngine(const ByteStreamTeeEngine&) = delete; - ByteStreamTeeEngine& operator=(const ByteStreamTeeEngine&) = delete; - - // Create the streams and start copying data. - void Start(ScriptState*, ReadableStream*, ExceptionState&); - - // Branch1() and Branch2() are null until Start() is called. - ReadableStream* Branch1() const { return branch_[0]; } - ReadableStream* Branch2() const { return branch_[1]; } - - void Trace(Visitor* visitor) const { - visitor->Trace(stream_); - visitor->Trace(reader_); - visitor->Trace(reason_[0]); - visitor->Trace(reason_[1]); - visitor->Trace(branch_[0]); - visitor->Trace(branch_[1]); - visitor->Trace(controller_[0]); - visitor->Trace(controller_[1]); - visitor->Trace(cancel_promise_); - } - - private: - class PullAlgorithm final : public StreamAlgorithm { - public: - PullAlgorithm(ByteStreamTeeEngine* engine, int branch) - : engine_(engine), branch_(branch) { - DCHECK(branch == 0 || branch == 1); - } - - v8::Local<v8::Promise> Run(ScriptState* script_state, - int argc, - v8::Local<v8::Value> argv[]) override; - void Trace(Visitor* visitor) const override; - - private: - Member<ByteStreamTeeEngine> engine_; - const int branch_; - }; - - class CancelAlgorithm; - - void ForwardReaderError(ScriptState* script_state, - ReadableStreamGenericReader* this_reader) { - // 14. Let forwardReaderError be the following steps, taking a thisReader - // argument: - class RejectFunction final : public PromiseHandler { - public: - explicit RejectFunction(ByteStreamTeeEngine* engine, - ReadableStreamGenericReader* reader) - : engine_(engine), reader_(reader) {} - - void CallWithLocal(ScriptState* script_state, - v8::Local<v8::Value> r) override { - // a. Upon rejection of thisReader.[[closedPromise]] with reason r, - // i. If thisReader is not reader, return. - if (engine_->reader_ != reader_) { - return; - } - // ii. Perform ! - // ReadableByteStreamControllerError(branch1.[[controller]], r). - ReadableByteStreamController::Error(script_state, - engine_->controller_[0], r); - // iii. Perform ! - // ReadableByteStreamControllerError(branch2.[[controller]], r). - ReadableByteStreamController::Error(script_state, - engine_->controller_[1], r); - // iv. If canceled1 is false or canceled2 is false, resolve - // cancelPromise with undefined. - if (!engine_->canceled_[0] || !engine_->canceled_[1]) { - engine_->cancel_promise_->ResolveWithUndefined(script_state); - } - } - - void Trace(Visitor* visitor) const override { - visitor->Trace(engine_); - visitor->Trace(reader_); - PromiseHandler::Trace(visitor); - } - - private: - Member<ByteStreamTeeEngine> engine_; - Member<ReadableStreamGenericReader> reader_; - }; - - StreamThenPromise( - script_state->GetContext(), - this_reader->ClosedPromise()->V8Promise(script_state->GetIsolate()), - nullptr, - MakeGarbageCollected<ScriptFunction>( - script_state, - MakeGarbageCollected<RejectFunction>(this, this_reader))); - } - - void PullWithDefaultReader(ScriptState* script_state, - ExceptionState& exception_state) { - // 15. Let pullWithDefaultReader be the following steps: - // a. If reader implements ReadableStreamBYOBReader, - if (reader_->IsBYOBReader()) { - // i. Assert: reader.[[readIntoRequests]] is empty. - ReadableStreamGenericReader* reader = reader_; - ReadableStreamBYOBReader* byob_reader = - To<ReadableStreamBYOBReader>(reader); - DCHECK(byob_reader->read_into_requests_.empty()); - // ii. Perform ! ReadableStreamBYOBReaderRelease(reader). - ReadableStreamBYOBReader::Release(script_state, byob_reader); - // iii. Set reader to ! AcquireReadableStreamDefaultReader(stream). - reader_ = ReadableStream::AcquireDefaultReader(script_state, stream_, - exception_state); - DCHECK(!exception_state.HadException()); - // iv. Perform forwardReaderError, given reader. - ForwardReaderError(script_state, reader_); - } - // b. Let readRequest be a read request with the following items: - auto* read_request = MakeGarbageCollected<ByteTeeReadRequest>(this); - // c. Perform ! ReadableStreamDefaultReaderRead(reader, readRequest). - ReadableStreamGenericReader* reader = reader_; - ReadableStreamDefaultReader::Read( - script_state, To<ReadableStreamDefaultReader>(reader), read_request); - } - - void PullWithBYOBReader(ScriptState* script_state, - NotShared<DOMArrayBufferView> view, - bool for_branch_2, - ExceptionState& exception_state) { - // 16. Let pullWithBYOBReader be the following steps, given view and - // forBranch2: - // a. If reader implements ReadableStreamDefaultReader, - if (reader_->IsDefaultReader()) { - // i. Assert: reader.[[readRequests]] is empty. - ReadableStreamGenericReader* reader = reader_; - ReadableStreamDefaultReader* default_reader = - To<ReadableStreamDefaultReader>(reader); - DCHECK(default_reader->read_requests_.empty()); - // ii. Perform ! ReadableStreamDefaultReaderRelease(reader). - ReadableStreamDefaultReader::Release(script_state, default_reader); - // iii. Set reader to ! AcquireReadableStreamBYOBReader(stream). - reader_ = ReadableStream::AcquireBYOBReader(script_state, stream_, - exception_state); - DCHECK(!exception_state.HadException()); - // iv. Perform forwardReaderError, given reader. - ForwardReaderError(script_state, reader_); - } - // b. Let byobBranch be branch2 if forBranch2 is true, and branch1 - // otherwise. - ReadableStream* byob_branch = for_branch_2 ? branch_[1] : branch_[0]; - // c. Let otherBranch be branch2 if forBranch2 is false, and branch1 - // otherwise. - ReadableStream* other_branch = !for_branch_2 ? branch_[1] : branch_[0]; - // d. Let readIntoRequest be a read-into request with the following items: - auto* read_into_request = MakeGarbageCollected<ByteTeeReadIntoRequest>( - this, byob_branch, other_branch, for_branch_2); - // e. Perform ! ReadableStreamBYOBReaderRead(reader, view, - // readIntoRequest). - ReadableStreamGenericReader* reader = reader_; - ReadableStreamBYOBReader::Read(script_state, - To<ReadableStreamBYOBReader>(reader), view, - read_into_request, exception_state); - DCHECK(!exception_state.HadException()); - } - - DOMUint8Array* CloneAsUint8Array(DOMArrayBufferView* chunk) { - auto* cloned_buffer = - DOMArrayBuffer::Create(chunk->buffer()->Data(), chunk->byteLength()); - return DOMUint8Array::Create(cloned_buffer, chunk->byteOffset(), - chunk->byteLength()); - } - - class ByteTeeReadRequest final : public ReadRequest { - public: - explicit ByteTeeReadRequest(ByteStreamTeeEngine* engine) - : engine_(engine) {} - - void ChunkSteps(ScriptState* script_state, - v8::Local<v8::Value> chunk) const override { - scoped_refptr<scheduler::EventLoop> event_loop = - ExecutionContext::From(script_state)->GetAgent()->event_loop(); - v8::Global<v8::Value> value(script_state->GetIsolate(), chunk); - event_loop->EnqueueMicrotask(WTF::BindOnce( - &ByteTeeReadRequest::ChunkStepsBody, WrapPersistent(this), - WrapPersistent(script_state), std::move(value))); - } - - void CloseSteps(ScriptState* script_state) const override { - // 1. Set reading to false. - engine_->reading_ = false; - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kUnknownContext, "", ""); - // 2. If canceled1 is false, perform ! - // ReadableByteStreamControllerClose(branch1.[[controller]]). - // 3. If canceled2 is false, perform ! - // ReadableByteStreamControllerClose(branch2.[[controller]]). - for (int branch = 0; branch < 2; ++branch) { - if (!engine_->canceled_[branch]) { - engine_->controller_[branch]->Close( - script_state, engine_->controller_[branch], exception_state); - if (exception_state.HadException()) { - // Instead of returning a rejection, which is inconvenient here, - // call ControllerError(). The only difference this makes is that it - // happens synchronously, but that should not be observable. - ReadableByteStreamController::Error(script_state, - engine_->controller_[branch], - exception_state.GetException()); - exception_state.ClearException(); - return; - } - } - } - // 4. If branch1.[[controller]].[[pendingPullIntos]] is not empty, perform - // ! ReadableByteStreamControllerRespond(branch1.[[controller]], 0). - // 5. If branch2.[[controller]].[[pendingPullIntos]] is not empty, perform - // ! ReadableByteStreamControllerRespond(branch2.[[controller]], 0). - for (int branch = 0; branch < 2; ++branch) { - if (!engine_->controller_[branch]->pending_pull_intos_.empty()) { - ReadableByteStreamController::Respond( - script_state, engine_->controller_[branch], 0, exception_state); - if (exception_state.HadException()) { - // Instead of returning a rejection, which is inconvenient here, - // call ControllerError(). The only difference this makes is that it - // happens synchronously, but that should not be observable. - ReadableByteStreamController::Error(script_state, - engine_->controller_[branch], - exception_state.GetException()); - exception_state.ClearException(); - return; - } - } - } - // 6. If canceled1 is false or canceled2 is false, resolve cancelPromise - // with undefined. - if (!engine_->canceled_[0] || !engine_->canceled_[1]) { - engine_->cancel_promise_->ResolveWithUndefined(script_state); - } - } - - void ErrorSteps(ScriptState* script_state, - v8::Local<v8::Value> e) const override { - // 1. Set reading to false. - engine_->reading_ = false; - } - - void Trace(Visitor* visitor) const override { - visitor->Trace(engine_); - ReadRequest::Trace(visitor); - } - - private: - void ChunkStepsBody(ScriptState* script_state, - v8::Global<v8::Value> value) const { - // 1. Set readAgainForBranch1 to false. - engine_->read_again_for_branch_[0] = false; - // 2. Set readAgainForBranch2 to false. - engine_->read_again_for_branch_[1] = false; - - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kUnknownContext, "", ""); - - // 3. Let chunk1 and chunk2 be chunk. - NotShared<DOMUint8Array> chunk[2]; - NotShared<DOMUint8Array> buffer_view = - NativeValueTraits<NotShared<DOMUint8Array>>::NativeValue( - script_state->GetIsolate(), value.Get(script_state->GetIsolate()), - exception_state); - chunk[0] = buffer_view; - chunk[1] = buffer_view; - - // 4. If canceled1 is false and canceled2 is false, - if (!engine_->canceled_[0] && !engine_->canceled_[1]) { - // a. Let cloneResult be CloneAsUint8Array(chunk). - auto* clone_result = engine_->CloneAsUint8Array(buffer_view.Get()); - // b. If cloneResult is an abrupt completion, - // i. Perform ! - // ReadableByteStreamControllerError(branch1.[[controller]], - // cloneResult.[[Value]]). - // ii. Perform ! - // ReadableByteStreamControllerError(branch2.[[controller]], - // cloneResult.[[Value]]). - // iii. Resolve cancelPromise with ! - // ReadableStreamCancel(stream, cloneResult.[[Value]]). - // iv. Return. - // This is not needed as DOMArrayBuffer::Create(), which is used in - // CloneAsUint8Array(), is designed to crash if it cannot allocate the - // memory. - - // c. Otherwise, set chunk2 to cloneResult.[[Value]]. - chunk[1] = NotShared<DOMUint8Array>(clone_result); - } - - // 5. If canceled1 is false, perform ! - // ReadableByteStreamControllerEnqueue(branch1.[[controller]], chunk1). - // 6. If canceled2 is false, perform ! - // ReadableByteStreamControllerEnqueue(branch2.[[controller]], chunk2). - for (int branch = 0; branch < 2; ++branch) { - if (!engine_->canceled_[branch]) { - ReadableByteStreamController::Enqueue(script_state, - engine_->controller_[branch], - chunk[branch], exception_state); - if (exception_state.HadException()) { - // Instead of returning a rejection, which is inconvenient here, - // call ControllerError(). The only difference this makes is that it - // happens synchronously, but that should not be observable. - ReadableByteStreamController::Error(script_state, - engine_->controller_[branch], - exception_state.GetException()); - exception_state.ClearException(); - return; - } - } - } - - // 7. Set reading to false. - engine_->reading_ = false; - - // 8. If readAgainForBranch1 is true, perform pull1Algorithm. - if (engine_->read_again_for_branch_[0]) { - auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 0); - pull_algorithm->Run(script_state, 0, nullptr); - // 9. Otherwise, if readAgainForBranch2 is true, perform pull2Algorithm. - } else if (engine_->read_again_for_branch_[1]) { - auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 1); - pull_algorithm->Run(script_state, 0, nullptr); - } - } - - Member<ByteStreamTeeEngine> engine_; - }; - - class ByteTeeReadIntoRequest final : public ReadIntoRequest { - public: - explicit ByteTeeReadIntoRequest(ByteStreamTeeEngine* engine, - ReadableStream* byob_branch, - ReadableStream* other_branch, - bool for_branch_2) - : engine_(engine), - byob_branch_(byob_branch), - other_branch_(other_branch), - for_branch_2_(for_branch_2) {} - - void ChunkSteps(ScriptState* script_state, - DOMArrayBufferView* chunk) const override { - scoped_refptr<scheduler::EventLoop> event_loop = - ExecutionContext::From(script_state)->GetAgent()->event_loop(); - event_loop->EnqueueMicrotask(WTF::BindOnce( - &ByteTeeReadIntoRequest::ChunkStepsBody, WrapPersistent(this), - WrapPersistent(script_state), WrapPersistent(chunk))); - } - - void CloseSteps(ScriptState* script_state, - DOMArrayBufferView* chunk) const override { - // 1. Set reading to false. - engine_->reading_ = false; - // 2. Let byobCanceled be canceled2 if forBranch2 is true, and canceled1 - // otherwise. - auto byob_canceled = - for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; - // 3. Let otherCanceled be canceled2 if forBranch2 is false, and canceled1 - // otherwise. - auto other_canceled = - !for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; - // 4. If byobCanceled is false, perform ! - // ReadableByteStreamControllerClose(byobBranch.[[controller]]). - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kUnknownContext, "", ""); - if (!byob_canceled) { - ReadableStreamController* controller = - byob_branch_->readable_stream_controller_; - ReadableByteStreamController* byte_controller = - To<ReadableByteStreamController>(controller); - byte_controller->Close(script_state, byte_controller, exception_state); - DCHECK(!exception_state.HadException()); - } - // 5. If otherCanceled is false, perform ! - // ReadableByteStreamControllerClose(otherBranch.[[controller]]). - if (!other_canceled) { - ReadableStreamController* controller = - other_branch_->readable_stream_controller_; - ReadableByteStreamController* byte_controller = - To<ReadableByteStreamController>(controller); - byte_controller->Close(script_state, byte_controller, exception_state); - DCHECK(!exception_state.HadException()); - } - // 6. If chunk is not undefined, - if (chunk) { - // a. Assert: chunk.[[ByteLength]] is 0. - DCHECK_EQ(chunk->byteLength(), 0u); - // b. If byobCanceled is false, perform ! - // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], - // chunk). - if (!byob_canceled) { - ReadableStreamController* controller = - byob_branch_->readable_stream_controller_; - ReadableByteStreamController::RespondWithNewView( - script_state, To<ReadableByteStreamController>(controller), - NotShared<DOMArrayBufferView>(chunk), exception_state); - DCHECK(!exception_state.HadException()); - } - // c. If otherCanceled is false and - // otherBranch.[[controller]].[[pendingPullIntos]] is not empty, - // perform ! - // ReadableByteStreamControllerRespond(otherBranch.[[controller]], - // 0). - ReadableStreamController* controller = - other_branch_->readable_stream_controller_; - if (!other_canceled && !To<ReadableByteStreamController>(controller) - ->pending_pull_intos_.empty()) { - ReadableByteStreamController::Respond( - script_state, To<ReadableByteStreamController>(controller), 0, - exception_state); - DCHECK(!exception_state.HadException()); - } - } - // 7. If byobCanceled is false or otherCanceled is false, resolve - // cancelPromise with undefined. - if (!byob_canceled || !other_canceled) { - engine_->cancel_promise_->ResolveWithUndefined(script_state); - } - } - - void ErrorSteps(ScriptState* script_state, - v8::Local<v8::Value> e) const override { - // 1. Set reading to false. - engine_->reading_ = false; - } - - void Trace(Visitor* visitor) const override { - visitor->Trace(engine_); - visitor->Trace(byob_branch_); - visitor->Trace(other_branch_); - ReadIntoRequest::Trace(visitor); - } - - private: - void ChunkStepsBody(ScriptState* script_state, - DOMArrayBufferView* chunk) const { - // 1. Set readAgainForBranch1 to false. - engine_->read_again_for_branch_[0] = false; - // 2. Set readAgainForBranch2 to false. - engine_->read_again_for_branch_[1] = false; - // 3. Let byobCanceled be canceled2 if forBranch2 is true, and canceled1 - // otherwise. - auto byob_canceled = - for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; - // 4. Let otherCanceled be canceled2 if forBranch2 is false, and canceled1 - // otherwise. - auto other_canceled = - !for_branch_2_ ? engine_->canceled_[1] : engine_->canceled_[0]; - // 5. If otherCanceled is false, - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kUnknownContext, "", ""); - if (!other_canceled) { - // a. Let cloneResult be CloneAsUint8Array(chunk). - auto* clone_result = engine_->CloneAsUint8Array(chunk); - // b. If cloneResult is an abrupt completion, - // i. Perform ! - // ReadableByteStreamControllerError(byobBranch.[[controller]], - // cloneResult.[[Value]]). - // ii. Perform ! - // ReadableByteStreamControllerError(otherBranch.[[controller]], - // cloneResult.[[Value]]). - // iii. Resolve cancelPromise with ! - // ReadableStreamCancel(stream, cloneResult.[[Value]]). - // iv. Return. - // This is not needed as DOMArrayBuffer::Create(), which is used in - // CloneAsUint8Array(), is designed to crash if it cannot allocate the - // memory. - - // c. Otherwise, let clonedChunk be cloneResult.[[Value]]. - NotShared<DOMArrayBufferView> cloned_chunk = - NotShared<DOMArrayBufferView>(clone_result); - - // d. If byobCanceled is false, perform ! - // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], - // chunk). - if (!byob_canceled) { - ReadableStreamController* byob_controller = - byob_branch_->readable_stream_controller_; - ReadableByteStreamController::RespondWithNewView( - script_state, To<ReadableByteStreamController>(byob_controller), - NotShared<DOMArrayBufferView>(chunk), exception_state); - DCHECK(!exception_state.HadException()); - } - // e. Perform ! - // ReadableByteStreamControllerEnqueue(otherBranch.[[controller]], - // clonedChunk). - ReadableStreamController* other_controller = - other_branch_->readable_stream_controller_; - ReadableByteStreamController::Enqueue( - script_state, To<ReadableByteStreamController>(other_controller), - cloned_chunk, exception_state); - DCHECK(!exception_state.HadException()); - // 6. Otherwise, if byobCanceled is false, perform ! - // ReadableByteStreamControllerRespondWithNewView(byobBranch.[[controller]], - // chunk). - } else if (!byob_canceled) { - ReadableStreamController* controller = - byob_branch_->readable_stream_controller_; - ReadableByteStreamController::RespondWithNewView( - script_state, To<ReadableByteStreamController>(controller), - NotShared<DOMArrayBufferView>(chunk), exception_state); - DCHECK(!exception_state.HadException()); - } - // 7. Set reading to false. - engine_->reading_ = false; - // 8. If readAgainForBranch1 is true, perform pull1Algorithm. - if (engine_->read_again_for_branch_[0]) { - auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 0); - pull_algorithm->Run(script_state, 0, nullptr); - // 9. Otherwise, if readAgainForBranch2 is true, perform pull2Algorithm. - } else if (engine_->read_again_for_branch_[1]) { - auto* pull_algorithm = MakeGarbageCollected<PullAlgorithm>(engine_, 1); - pull_algorithm->Run(script_state, 0, nullptr); - } - } - - Member<ByteStreamTeeEngine> engine_; - Member<ReadableStream> byob_branch_; - Member<ReadableStream> other_branch_; - bool for_branch_2_; - }; - - Member<ReadableStream> stream_; - Member<ReadableStreamGenericReader> reader_; - Member<StreamPromiseResolver> cancel_promise_; - bool reading_ = false; - - // The standard contains a number of pairs of variables with one for each - // stream. These are implemented as arrays here. While they are 1-indexed in - // the standard, they are 0-indexed here; ie. "canceled_[0]" here corresponds - // to "canceled1" in the standard. - bool canceled_[2] = {false, false}; - bool read_again_for_branch_[2] = {false, false}; - TraceWrapperV8Reference<v8::Value> reason_[2]; - Member<ReadableStream> branch_[2]; - Member<ReadableByteStreamController> controller_[2]; -}; - -v8::Local<v8::Promise> ReadableStream::ByteStreamTeeEngine::PullAlgorithm::Run( - ScriptState* script_state, - int argc, - v8::Local<v8::Value> argv[]) { - // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee - // This implements both pull1Algorithm and pull2Algorithm as they are - // identical except for the index they operate on. Standard comments are - // from pull1Algorithm. - // 17. Let pull1Algorithm be the following steps: - // a. If reading is true, - ExceptionState exception_state(script_state->GetIsolate(), - ExceptionState::kUnknownContext, "", ""); - if (engine_->reading_) { - // i. Set readAgainForBranch1 to true. - engine_->read_again_for_branch_[branch_] = true; - // ii. Return a promise resolved with undefined. - return PromiseResolveWithUndefined(script_state); - } - // b. Set reading to true. - engine_->reading_ = true; - // c. Let byobRequest be ! - // ReadableByteStreamControllerGetBYOBRequest(branch1.[[controller]]). - ReadableStreamBYOBRequest* byob_request = - ReadableByteStreamController::GetBYOBRequest( - engine_->controller_[branch_]); - // d. If byobRequest is null, perform pullWithDefaultReader. - if (!byob_request) { - engine_->PullWithDefaultReader(script_state, exception_state); - } else { - // e. Otherwise, perform pullWithBYOBReader, given byobRequest.[[view]] - // and false. - engine_->PullWithBYOBReader(script_state, byob_request->view(), branch_, - exception_state); - } - // f. Return a promise resolved with undefined. - return PromiseResolveWithUndefined(script_state); -} - -void ReadableStream::ByteStreamTeeEngine::PullAlgorithm::Trace( - Visitor* visitor) const { - visitor->Trace(engine_); - StreamAlgorithm::Trace(visitor); -} - -class ReadableStream::ByteStreamTeeEngine::CancelAlgorithm final - : public StreamAlgorithm { - public: - CancelAlgorithm(ByteStreamTeeEngine* engine, int branch) - : engine_(engine), branch_(branch) { - DCHECK(branch == 0 || branch == 1); - } - - v8::Local<v8::Promise> Run(ScriptState* script_state, - int argc, - v8::Local<v8::Value> argv[]) override { - // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee - // This implements both cancel1Algorithm and cancel2Algorithm as they are - // identical except for the index they operate on. Standard comments are - // from cancel1Algorithm. - // 19. Let cancel1Algorithm be the following steps, taking a reason - // argument: - auto* isolate = script_state->GetIsolate(); - // a. Set canceled1 to true. - engine_->canceled_[branch_] = true; - // b. Set reason1 to reason. - DCHECK_EQ(argc, 1); - engine_->reason_[branch_].Reset(isolate, argv[0]); - // c. If canceled2 is true, - const int other_branch = 1 - branch_; - if (engine_->canceled_[other_branch]) { - // i. Let compositeReason be ! CreateArrayFromList(« reason1, reason2 - // »). - v8::Local<v8::Value> reason[] = {engine_->reason_[0].Get(isolate), - engine_->reason_[1].Get(isolate)}; - v8::Local<v8::Value> composite_reason = - v8::Array::New(script_state->GetIsolate(), reason, 2); - // ii. Let cancelResult be ! ReadableStreamCancel(stream, - // compositeReason). - auto cancel_result = ReadableStream::Cancel( - script_state, engine_->stream_, composite_reason); - // iii. Resolve cancelPromise with cancelResult. - engine_->cancel_promise_->Resolve(script_state, cancel_result); - } - // d. Return cancelPromise. - return engine_->cancel_promise_->V8Promise(isolate); - } - - void Trace(Visitor* visitor) const override { - visitor->Trace(engine_); - StreamAlgorithm::Trace(visitor); - } - - private: - Member<ByteStreamTeeEngine> engine_; - const int branch_; -}; - -void ReadableStream::ByteStreamTeeEngine::Start( - ScriptState* script_state, - ReadableStream* stream, - ExceptionState& exception_state) { - // https://streams.spec.whatwg.org/#abstract-opdef-readablebytestreamtee - // 1. Assert: stream implements ReadableStream. - DCHECK(stream); - - stream_ = stream; - - // 2. Assert: stream.[[controller]] implements ReadableByteStreamController. - DCHECK(stream->readable_stream_controller_->IsByteStreamController()); - - // 3. Let reader be ? AcquireReadableStreamDefaultReader(stream). - reader_ = ReadableStream::AcquireDefaultReader(script_state, stream, - exception_state); - - // 4. Let reading be false. - DCHECK(!reading_); - - // 5. Let readAgainForBranch1 be false. - DCHECK(!read_again_for_branch_[0]); - - // 6. Let readAgainForBranch2 be false. - DCHECK(!read_again_for_branch_[1]); - - // 7. Let canceled1 be false. - DCHECK(!canceled_[0]); - - // 8. Let canceled2 be false. - DCHECK(!canceled_[1]); - - // 9. Let reason1 be undefined. - DCHECK(reason_[0].IsEmpty()); - - // 10. Let reason2 be undefined. - DCHECK(reason_[1].IsEmpty()); - - // 11. Let branch1 be undefined. - DCHECK(!branch_[0]); - - // 12. Let branch2 be undefined. - DCHECK(!branch_[1]); - - // 13. Let cancelPromise be a new promise. - cancel_promise_ = MakeGarbageCollected<StreamPromiseResolver>(script_state); - - // 17. Let pull1Algorithm be the following steps: - // (See PullAlgorithm::Run()). - auto* pull1_algorithm = MakeGarbageCollected<PullAlgorithm>(this, 0); - - // 18. Let pull2Algorithm be the following steps: - // (both algorithms share a single implementation). - auto* pull2_algorithm = MakeGarbageCollected<PullAlgorithm>(this, 1); - - // 19. Let cancel1Algorithm be the following steps, taking a reason argument: - // (See CancelAlgorithm::Run()). - auto* cancel1_algorithm = MakeGarbageCollected<CancelAlgorithm>(this, 0); - - // 20. Let cancel2Algorithm be the following steps, taking a reason argument: - // (both algorithms share a single implementation). - auto* cancel2_algorithm = MakeGarbageCollected<CancelAlgorithm>(this, 1); - - // 21. Let startAlgorithm be an algorithm that returns undefined. - auto* start_algorithm = CreateTrivialStartAlgorithm(); - - // 22. Set branch1 to ! CreateReadableByteStream(startAlgorithm, - // pull1Algorithm, cancel1Algorithm). - branch_[0] = ReadableStream::CreateByteStream( - script_state, start_algorithm, pull1_algorithm, cancel1_algorithm, - exception_state); - if (exception_state.HadException()) { - return; - } - - // 23. Set branch2 to ! CreateReadableByteStream(startAlgorithm, - // pull2Algorithm, cancel2Algorithm). - branch_[1] = ReadableStream::CreateByteStream( - script_state, start_algorithm, pull2_algorithm, cancel2_algorithm, - exception_state); - if (exception_state.HadException()) { - return; - } - - for (int branch = 0; branch < 2; ++branch) { - ReadableStreamController* controller = - branch_[branch]->readable_stream_controller_; - // We just created the branches above. It is obvious that they are byte - // stream controllers. - controller_[branch] = To<ReadableByteStreamController>(controller); - } - - // 24. Perform forwardReaderError, given reader. - ForwardReaderError(script_state, reader_); - - // Step 25. Return « branch1, branch2 ». - // is performed by the caller. -} - ReadableStream* ReadableStream::Create(ScriptState* script_state, ExceptionState& exception_state) { return Create(script_state,
diff --git a/third_party/blink/renderer/core/streams/readable_stream.h b/third_party/blink/renderer/core/streams/readable_stream.h index df9065d..e6eff2ca 100644 --- a/third_party/blink/renderer/core/streams/readable_stream.h +++ b/third_party/blink/renderer/core/streams/readable_stream.h
@@ -301,6 +301,7 @@ void Trace(Visitor*) const override; private: + friend class ByteStreamTeeEngine; friend class ReadableByteStreamController; friend class ReadableStreamBYOBReader; friend class ReadableStreamDefaultController; @@ -312,7 +313,6 @@ class CancelAlgorithm; class PipeToEngine; class ReadHandleImpl; - class ByteStreamTeeEngine; // https://streams.spec.whatwg.org/#rs-constructor void InitInternal(ScriptState*,
diff --git a/third_party/blink/renderer/core/streams/readable_stream_byob_reader.h b/third_party/blink/renderer/core/streams/readable_stream_byob_reader.h index be6dc9b..8413603 100644 --- a/third_party/blink/renderer/core/streams/readable_stream_byob_reader.h +++ b/third_party/blink/renderer/core/streams/readable_stream_byob_reader.h
@@ -58,6 +58,7 @@ void Trace(Visitor*) const override; private: + friend class ByteStreamTeeEngine; friend class ReadableByteStreamController; friend class ReadableStream;
diff --git a/third_party/blink/renderer/core/streams/readable_stream_default_reader.h b/third_party/blink/renderer/core/streams/readable_stream_default_reader.h index ef41666..fb53542 100644 --- a/third_party/blink/renderer/core/streams/readable_stream_default_reader.h +++ b/third_party/blink/renderer/core/streams/readable_stream_default_reader.h
@@ -74,6 +74,7 @@ bool HasPendingActivity() const final; private: + friend class ByteStreamTeeEngine; friend class ReadableByteStreamController; friend class ReadableStreamController; friend class ReadableStreamDefaultController;
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h index 3807626..4138cc23 100644 --- a/third_party/blink/renderer/core/style/computed_style.h +++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -846,7 +846,7 @@ } // font-size-adjust - FontSizeAdjust FontSizeAdjust() const { + blink::FontSizeAdjust FontSizeAdjust() const { return GetFontDescription().SizeAdjust(); } bool HasFontSizeAdjust() const {
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc index fdd14c9..2c01cce01 100644 --- a/third_party/blink/renderer/core/timing/performance.cc +++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -432,6 +432,13 @@ entries, long_animation_frame_buffer_, maybe_name); } + if (RuntimeEnabledFeatures::VisibilityStateEntryEnabled( + GetExecutionContext()) && + visibility_state_buffer_.size()) { + entries = MergePerformanceEntryVectors(entries, visibility_state_buffer_, + maybe_name); + } + return entries; }
diff --git a/third_party/blink/renderer/core/timing/performance_entry.h b/third_party/blink/renderer/core/timing/performance_entry.h index 51b15b1..448f4c4 100644 --- a/third_party/blink/renderer/core/timing/performance_entry.h +++ b/third_party/blink/renderer/core/timing/performance_entry.h
@@ -98,8 +98,20 @@ static bool StartTimeCompareLessThan(PerformanceEntry* a, PerformanceEntry* b) { - if (a->startTime() == b->startTime()) - return a->index_ < b->index_; + if (a->startTime() == b->startTime()) { + // The navigation entry is created lazily, and we want it to always be + // first for compatibility. + // TODO: create NT entry eagerly so that we don't have to do this + // https://bugs.chromium.org/p/chromium/issues/detail?id=1432565 + if (a->EntryTypeEnum() == kNavigation) { + return true; + } else if (b->EntryTypeEnum() == kNavigation) { + return false; + } else { + return a->index_ < b->index_; + } + } + return a->startTime() < b->startTime(); } @@ -119,7 +131,7 @@ HashSet<PerformanceEntryType>, valid_timeline_entry_types, ({kNavigation, kMark, kMeasure, kResource, kTaskAttribution, kPaint, kFirstInput, kBackForwardCacheRestoration, kSoftNavigation, - kLongAnimationFrame})); + kLongAnimationFrame, kVisibilityState})); return valid_timeline_entry_types.Contains(entry_type); }
diff --git a/third_party/blink/renderer/core/timing/performance_observer.cc b/third_party/blink/renderer/core/timing/performance_observer.cc index f426e1ed..f2dad9f 100644 --- a/third_party/blink/renderer/core/timing/performance_observer.cc +++ b/third_party/blink/renderer/core/timing/performance_observer.cc
@@ -241,6 +241,11 @@ if (filter_options_ & PerformanceEntry::kLongTask) { UseCounter::Count(GetExecutionContext(), WebFeature::kLongTaskObserver); } + if (filter_options_ & PerformanceEntry::kVisibilityState) { + UseCounter::Count(GetExecutionContext(), + WebFeature::kVisibilityStateObserver); + } + requires_dropped_entries_ = true; if (is_registered_) performance_->UpdatePerformanceObserverFilterOptions();
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc index 8c7846d..be6cd5e 100644 --- a/third_party/blink/renderer/core/timing/window_performance.cc +++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -682,10 +682,8 @@ DCHECK(RuntimeEnabledFeatures::VisibilityStateEntryEnabled()); VisibilityStateEntry* entry = MakeGarbageCollected<VisibilityStateEntry>( PageHiddenStateString(!is_visible), - MonotonicTimeToDOMHighResTimeStamp(timestamp), - DomWindow()); // Todo(haoliuk): Add WPT for - // VisibilityStateEntry. See - // crbug.com/1320878. + MonotonicTimeToDOMHighResTimeStamp(timestamp), DomWindow()); + if (HasObserverFor(PerformanceEntry::kVisibilityState)) NotifyObserversOfEntry(*entry);
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc index 313d70f..9f8a4de 100644 --- a/third_party/blink/renderer/core/timing/window_performance_test.cc +++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -310,7 +310,7 @@ performance_->mark(GetScriptState(), AtomicString::Number(i), nullptr, exception_state); } - PerformanceEntryVector entries = performance_->getEntries(); + PerformanceEntryVector entries = performance_->getEntriesByType("mark"); EXPECT_EQ(17U, entries.size()); for (int i = 0; i < 8; i++) { EXPECT_EQ(AtomicString::Number(i), entries[i]->name());
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc index 16f7796..ad2c9649 100644 --- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc +++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -54,8 +54,9 @@ #include "third_party/blink/renderer/core/fetch/trust_token_to_mojom.h" #include "third_party/blink/renderer/core/fileapi/blob.h" #include "third_party/blink/renderer/core/fileapi/file.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/fileapi/public_url_manager.h" #include "third_party/blink/renderer/core/frame/csp/content_security_policy.h" #include "third_party/blink/renderer/core/frame/deprecation/deprecation.h" @@ -243,25 +244,23 @@ class XMLHttpRequest::BlobLoader final : public GarbageCollected<XMLHttpRequest::BlobLoader>, - public FileReaderClient { + public FileReaderLoaderClient { public: BlobLoader(XMLHttpRequest* xhr, scoped_refptr<BlobDataHandle> handle) : xhr_(xhr), loader_(MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadByClient, this, xhr->GetExecutionContext()->GetTaskRunner( TaskType::kFileReading))) { loader_->Start(std::move(handle)); } - // FileReaderClient functions. - FileErrorCode DidStartLoading(uint64_t, uint64_t) override { - return FileErrorCode::kOK; - } - FileErrorCode DidReceiveData(const char* data, unsigned length) override { + // FileReaderLoaderClient functions. + void DidStartLoading() override {} + void DidReceiveDataForClient(const char* data, unsigned length) override { DCHECK_LE(length, static_cast<unsigned>(INT_MAX)); xhr_->DidReceiveData(data, length); - return FileErrorCode::kOK; } void DidFinishLoading() override { xhr_->DidFinishLoadingFromBlob(); } void DidFail(FileErrorCode error) override { xhr_->DidFailLoadingFromBlob(); } @@ -269,7 +268,7 @@ void Cancel() { loader_->Cancel(); } void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(xhr_); visitor->Trace(loader_); }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc b/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc index 5030cbf..3634547 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_menu_list_option.cc
@@ -186,13 +186,24 @@ DCHECK(ax_menu_list->GetLayoutObject()); WTF::Vector<gfx::Rect> options_bounds = To<AXMenuList>(ax_menu_list)->GetOptionsBounds(); - if (options_bounds.size()) { - int index = To<HTMLOptionElement>(GetNode())->index(); - DCHECK_GT(options_bounds.size(), (unsigned int)index); + // TODO(lusanpad): Update fix once we figure out what is causing + // https://crbug.com/1429881. + unsigned int index = + static_cast<unsigned int>(To<HTMLOptionElement>(GetNode())->index()); + if (options_bounds.size() && index < options_bounds.size()) { out_bounds_in_container = gfx::RectF(options_bounds.at(index)); - } else if (ax_menu_list->GetLayoutObject()) { - ax_menu_list->GetRelativeBounds(out_container, out_bounds_in_container, - out_container_transform, clips_children); + } else { +#if defined(ADDRESS_SANITIZER) + if (options_bounds.size() && index >= options_bounds.size()) { + LOG(FATAL) << "Out of bounds option index=" << index + << " should be less than " << options_bounds.size() + << "\n* Object = " << ToString(true, true); + } +#endif + if (ax_menu_list->GetLayoutObject()) { + ax_menu_list->GetRelativeBounds(out_container, out_bounds_in_container, + out_container_transform, clips_children); + } } }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc index 6a740228..6a2a011 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -663,19 +663,16 @@ return; } -#if DCHECK_IS_ON() - DCHECK(ax_object_cache_); +#if defined(AX_FAIL_FAST_BUILD) + SANITIZER_CHECK(ax_object_cache_); // AXInlineTextBox objects are the only objects that are safe to remove during // serialization. This occurs when a the serializer reaches a static text // object and its ignored state changes. Ignored static text boxes should not // have any inline textbox children, and they are removed by ClearChildren(). - DCHECK(!ax_object_cache_->IsFrozen() || IsAXInlineTextBox()) + SANITIZER_CHECK(!ax_object_cache_->IsFrozen() || IsAXInlineTextBox()) << "Do not detach children while the tree is frozen, in order to avoid " "an object detaching itself in the middle of computing its own " "accessibility properties."; -#endif - -#if defined(AX_FAIL_FAST_BUILD) SANITIZER_CHECK(!is_adding_children_) << ToString(true, true); #endif
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index 7779f1e..5e414cbcf 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -2190,7 +2190,7 @@ } // Clear children of ancestors in order to ensure this detached object is not - // cached an ancestor's list of children: + // cached in an ancestor's list of children: // Any ancestor up to the first included ancestor can contain the now-detached // child in it's cached children, and therefore must update children. AXObject* ax_ancestor = ChildrenChanged(obj->CachedParentObject()); @@ -2198,7 +2198,7 @@ return; } - DCHECK(!IsFrozen()) + SANITIZER_CHECK(!IsFrozen()) << "Attempting to change children on an ancestor is dangerous during " "serialization, because the ancestor may have already been " "visited. Reaching this line indicates that AXObjectCacheImpl did "
diff --git a/third_party/blink/renderer/modules/accessibility/blink_ax_tree_source.cc b/third_party/blink/renderer/modules/accessibility/blink_ax_tree_source.cc index 92a5a18e..22101f4 100644 --- a/third_party/blink/renderer/modules/accessibility/blink_ax_tree_source.cc +++ b/third_party/blink/renderer/modules/accessibility/blink_ax_tree_source.cc
@@ -310,7 +310,8 @@ auto* child = node->ChildAtIncludingIgnored(static_cast<int>(index)); // The child may be invalid due to issues in blink accessibility code. - if (!child || child->IsDetached()) { + CHECK(child); + if (child->IsDetached()) { DCHECK(false) << "Should not try to serialize an invalid child:" << "\nParent: " << node->ToString(true).Utf8() << "\nChild: " << child->ToString(true).Utf8();
diff --git a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc index aa7a5b04..7515ff5 100644 --- a/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc +++ b/third_party/blink/renderer/modules/ad_auction/validate_blink_interest_group_test.cc
@@ -551,7 +551,7 @@ CreateMinimalInterestGroup(); // Name length that will result in a `blink_interest_group` having an - // estimated size of exactly `kMaxInterestGroupSize`, which is 51200 bytes. + // estimated size of exactly `kMaxInterestGroupSize`, which is 1048576 bytes. // Note that kMaxInterestGroupSize is actually one greater than the maximum // size, so no need to add 1 to exceed it. blink_interest_group->name = ""; @@ -563,8 +563,8 @@ blink_interest_group->name = String(long_string); ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. long_string = std::string(kTooLongNameLength - 1, 'n'); @@ -602,8 +602,8 @@ ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. too_long_name = std::string(kTooLongNameLength - 1, 'n'); @@ -641,8 +641,8 @@ ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. too_long_name = std::string(kTooLongNameLength - 1, 'n'); @@ -685,8 +685,8 @@ ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. too_long_name = std::string(kTooLongNameLength - 1, 'n'); @@ -730,8 +730,8 @@ ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. too_long_name = std::string(kTooLongNameLength - 1, 'n'); @@ -780,8 +780,8 @@ ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too long should still work. too_long_name = std::string(kTooLongNameLength - 1, 'n'); @@ -792,9 +792,10 @@ TEST_F(ValidateBlinkInterestGroupTest, TooLargeAds) { mojom::blink::InterestGroupPtr blink_interest_group = CreateMinimalInterestGroup(); - blink_interest_group->name = "paddingTo51200"; + blink_interest_group->name = + WTF::String("paddingTo1048576" + std::string(24, 'P')); blink_interest_group->ad_components.emplace(); - for (int i = 0; i < 682; ++i) { + for (int i = 0; i < 13980; ++i) { // Each ad component is 75 bytes. auto mojo_ad_component1 = mojom::blink::InterestGroupAd::New(); mojo_ad_component1->render_url = @@ -806,8 +807,8 @@ } ExpectInterestGroupIsNotValid( blink_interest_group, /*expected_error_field_name=*/"size", - /*expected_error_field_value=*/"51200", - /*expected_error=*/"interest groups must be less than 51200 bytes"); + /*expected_error_field_value=*/"1048576", + /*expected_error=*/"interest groups must be less than 1048576 bytes"); // Almost too big should still work. blink_interest_group->ad_components->resize(681);
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h index acc6346..17df1b3 100644 --- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h +++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.h
@@ -14,6 +14,7 @@ #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/heap/prefinalizer.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -101,8 +102,10 @@ // BroadcastChannelClient receiver for messages sent from the browser to // this channel and BroadcastChannelClient remote for messages sent from // this channel to the browser. + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::BroadcastChannelClient> receiver_{ this}; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::BroadcastChannelClient> remote_client_; // Notifies the scheduler that a broadcast channel is active. @@ -114,6 +117,7 @@ // ConnectToChannel messages (with ordering preserved) to the // RenderFrameHostImpl associated with this frame. When a BroadcastChannel is // instantiated from a worker execution context, this member is not used. + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::BroadcastChannelProvider> associated_remote_; };
diff --git a/third_party/blink/renderer/modules/cache_storage/cache.h b/third_party/blink/renderer/modules/cache_storage/cache.h index 0473c16c..dd6888e 100644 --- a/third_party/blink/renderer/modules/cache_storage/cache.h +++ b/third_party/blink/renderer/modules/cache_storage/cache.h
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/wtf/forward.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" @@ -134,6 +135,7 @@ Member<GlobalFetch::ScopedFetcher> scoped_fetcher_; Member<CacheStorageBlobClientList> blob_client_list_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::CacheStorageCache> cache_remote_; };
diff --git a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc index e000329..28ae65a 100644 --- a/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc +++ b/third_party/blink/renderer/modules/cache_storage/inspector_cache_storage_agent.cc
@@ -20,8 +20,9 @@ #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/inspector/inspected_frames.h" @@ -448,7 +449,7 @@ class CachedResponseFileReaderLoaderClient final : public GarbageCollected<CachedResponseFileReaderLoaderClient>, - public FileReaderClient { + public FileReaderLoaderClient { public: static void Load(scoped_refptr<base::SingleThreadTaskRunner> task_runner, scoped_refptr<BlobDataHandle> blob, @@ -462,9 +463,7 @@ CachedResponseFileReaderLoaderClient& operator=( const CachedResponseFileReaderLoaderClient&) = delete; - FileErrorCode DidStartLoading(uint64_t, uint64_t) override { - return FileErrorCode::kOK; - } + void DidStartLoading() override {} void DidFinishLoading() override { std::unique_ptr<CachedResponse> response = @@ -483,14 +482,13 @@ dispose(); } - FileErrorCode DidReceiveData(const char* data, + void DidReceiveDataForClient(const char* data, unsigned data_length) override { data_->Append(data, data_length); - return FileErrorCode::kOK; } void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(loader_); } @@ -498,21 +496,25 @@ scoped_refptr<base::SingleThreadTaskRunner> task_runner, scoped_refptr<BlobDataHandle>&& blob, std::unique_ptr<RequestCachedResponseCallback>&& callback) - : loader_(MakeGarbageCollected<FileReaderLoader>(this, - std::move(task_runner))), + : loader_( + MakeGarbageCollected<FileReaderLoader>(FileReadType::kReadByClient, + this, + std::move(task_runner))), callback_(std::move(callback)), - data_(SharedBuffer::Create()) { + data_(SharedBuffer::Create()), + keep_alive_(this) { loader_->Start(std::move(blob)); } ~CachedResponseFileReaderLoaderClient() override = default; private: - void dispose() { loader_ = nullptr; } + void dispose() { keep_alive_.Clear(); } Member<FileReaderLoader> loader_; std::unique_ptr<RequestCachedResponseCallback> callback_; scoped_refptr<SharedBuffer> data_; + SelfKeepAlive<CachedResponseFileReaderLoaderClient> keep_alive_; }; } // namespace
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc index 20d95536..5ba91856 100644 --- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc +++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.cc
@@ -43,6 +43,7 @@ #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/blob.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/frame/deprecation/deprecation.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/html/canvas/html_canvas_element.h" @@ -277,6 +278,7 @@ const ImageBitmapOptions* options) : ExecutionContextLifecycleObserver(ExecutionContext::From(script_state)), loader_(MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsArrayBuffer, this, GetExecutionContext()->GetTaskRunner(TaskType::kFileReading))), factory_(&factory), @@ -337,9 +339,8 @@ } } -void ImageBitmapFactories::ImageBitmapLoader::DidFinishLoading( - FileReaderData data) { - auto contents = std::move(data).AsArrayBufferContents(); +void ImageBitmapFactories::ImageBitmapLoader::DidFinishLoading() { + auto contents = loader_->TakeContents().AsArrayBufferContents(); loader_.Clear(); if (!contents.IsValid()) { RejectPromise(kAllocationFailureImageBitmapRejectionReason); @@ -348,9 +349,7 @@ ScheduleAsyncImageBitmapDecoding(std::move(contents)); } -void ImageBitmapFactories::ImageBitmapLoader::DidFail( - FileErrorCode error_code) { - FileReaderAccumulator::DidFail(error_code); +void ImageBitmapFactories::ImageBitmapLoader::DidFail(FileErrorCode) { RejectPromise(kUndecodableImageBitmapRejectionReason); } @@ -429,7 +428,7 @@ void ImageBitmapFactories::ImageBitmapLoader::Trace(Visitor* visitor) const { ExecutionContextLifecycleObserver::Trace(visitor); - FileReaderAccumulator::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(factory_); visitor->Trace(resolver_); visitor->Trace(options_);
diff --git a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h index 420db36..afad69f4 100644 --- a/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h +++ b/third_party/blink/renderer/modules/canvas/imagebitmap/image_bitmap_factories.h
@@ -37,8 +37,8 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_image_bitmap_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_typedefs.h" #include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/modules/modules_export.h" @@ -144,7 +144,7 @@ class ImageBitmapLoader final : public GarbageCollected<ImageBitmapLoader>, public ExecutionContextLifecycleObserver, - public FileReaderAccumulator { + public FileReaderLoaderClient { public: static ImageBitmapLoader* Create(ImageBitmapFactories& factory, absl::optional<gfx::Rect> crop_rect, @@ -183,8 +183,10 @@ // ExecutionContextLifecycleObserver void ContextDestroyed() override; - // FileReaderClient - void DidFinishLoading(FileReaderData) override; + // FileReaderLoaderClient + void DidStartLoading() override {} + void DidReceiveData() override {} + void DidFinishLoading() override; void DidFail(FileErrorCode) override; Member<FileReaderLoader> loader_;
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc index 1e5c40d..4132e20 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.cc
@@ -12,6 +12,7 @@ #include "third_party/blink/renderer/core/dom/document_fragment.h" #include "third_party/blink/renderer/core/editing/serializers/serialization.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/web_feature.h" @@ -343,31 +344,34 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(!file_reader_); file_reader_ = MakeGarbageCollected<FileReaderLoader>( - this, std::move(file_reading_task_runner_)); + FileReadType::kReadAsArrayBuffer, this, + std::move(file_reading_task_runner_)); file_reader_->Start(blob->GetBlobDataHandle()); } -// FileReaderClient implementation. -void ClipboardWriter::DidFinishLoading(FileReaderData contents) { +// FileReaderLoaderClient implementation. + +void ClipboardWriter::DidStartLoading() {} +void ClipboardWriter::DidReceiveData() {} + +void ClipboardWriter::DidFinishLoading() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DOMArrayBuffer* array_buffer = std::move(contents).AsDOMArrayBuffer(); + DOMArrayBuffer* array_buffer = + file_reader_->TakeContents().AsDOMArrayBuffer(); DCHECK(array_buffer); self_keep_alive_.Clear(); - file_reader_ = nullptr; StartWrite(array_buffer, clipboard_task_runner_); } void ClipboardWriter::DidFail(FileErrorCode error_code) { - FileReaderAccumulator::DidFail(error_code); self_keep_alive_.Clear(); - file_reader_ = nullptr; promise_->RejectFromReadOrDecodeFailure(); } void ClipboardWriter::Trace(Visitor* visitor) const { - FileReaderAccumulator::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(promise_); visitor->Trace(system_clipboard_); visitor->Trace(file_reader_);
diff --git a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h index 2d24f95c..980255e 100644 --- a/third_party/blink/renderer/modules/clipboard/clipboard_writer.h +++ b/third_party/blink/renderer/modules/clipboard/clipboard_writer.h
@@ -8,7 +8,7 @@ #include "base/sequence_checker.h" #include "base/task/single_thread_task_runner.h" #include "third_party/blink/renderer/core/fileapi/blob.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/modules/clipboard/clipboard_promise.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/self_keep_alive.h" @@ -52,7 +52,7 @@ // SelfKeepAlive, and keeps itself alive afterwards during cross-thread // operations by using WrapCrossThreadPersistent. class ClipboardWriter : public GarbageCollected<ClipboardWriter>, - public FileReaderAccumulator { + public FileReaderLoaderClient { public: // For writing sanitized and custom MIME types. // IsValidType() must return true on types passed into `mime_type`. @@ -74,8 +74,10 @@ // Begins the sequence of writing the Blob to the system clipbaord. void WriteToSystem(Blob* blob); - // FileReaderClient. - void DidFinishLoading(FileReaderData) override; + // FileReaderLoaderClient. + void DidStartLoading() override; + void DidReceiveData() override; + void DidFinishLoading() override; void DidFail(FileErrorCode) override; void Trace(Visitor*) const override; @@ -113,6 +115,7 @@ Member<FileReaderLoader> file_reader_; // Access to the global sanitized system clipboard. Member<SystemClipboard> system_clipboard_; + // Oilpan: ClipboardWriter must remain alive until Member<T>::Clear() is // called, to keep the FileReaderLoader alive and avoid unexpected UaPs. SelfKeepAlive<ClipboardWriter> self_keep_alive_{this};
diff --git a/third_party/blink/renderer/modules/hid/hid.h b/third_party/blink/renderer/modules/hid/hid.h index 7df0b5e..fd4eb5a4 100644 --- a/third_party/blink/renderer/modules/hid/hid.h +++ b/third_party/blink/renderer/modules/hid/hid.h
@@ -21,6 +21,7 @@ #include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h" #include "third_party/blink/renderer/platform/supplementable.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -112,6 +113,7 @@ Vector<device::mojom::blink::HidDeviceInfoPtr>); HeapMojoRemote<mojom::blink::HidService> service_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<device::mojom::blink::HidManagerClient> receiver_{ this}; HeapHashSet<Member<ScriptPromiseResolver>> get_devices_promises_;
diff --git a/third_party/blink/renderer/modules/indexeddb/BUILD.gn b/third_party/blink/renderer/modules/indexeddb/BUILD.gn index 57cb281..4b6ab8b 100644 --- a/third_party/blink/renderer/modules/indexeddb/BUILD.gn +++ b/third_party/blink/renderer/modules/indexeddb/BUILD.gn
@@ -31,7 +31,6 @@ "idb_key_range.h", "idb_metadata.cc", "idb_metadata.h", - "idb_name_and_version.h", "idb_object_store.cc", "idb_object_store.h", "idb_open_db_request.cc", @@ -75,7 +74,6 @@ testonly = true sources = [ - "idb_factory_test.cc", "idb_key_path_test.cc", "idb_request_test.cc", "idb_test_helper.cc",
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc index 51de4ef..bff9d53 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
@@ -53,7 +53,6 @@ #include "third_party/blink/renderer/modules/indexed_db_names.h" #include "third_party/blink/renderer/modules/indexeddb/idb_database.h" #include "third_party/blink/renderer/modules/indexeddb/idb_key.h" -#include "third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_transaction.h" @@ -68,150 +67,6 @@ namespace blink { -namespace { - -class WebIDBGetDBNamesCallbacksImpl : public WebIDBCallbacks { - public: - explicit WebIDBGetDBNamesCallbacksImpl( - ScriptPromiseResolver* promise_resolver) - : promise_resolver_(promise_resolver) { - async_task_context_.Schedule( - ExecutionContext::From(promise_resolver_->GetScriptState()), - indexed_db_names::kIndexedDB); - } - - ~WebIDBGetDBNamesCallbacksImpl() override { - if (!promise_resolver_) - return; - - auto* script_state = promise_resolver_->GetScriptState(); - if (!script_state->ContextIsValid()) - return; - - async_task_context_.Cancel(); - promise_resolver_->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, - "An unexpected shutdown occured before the " - "databases() promise could be resolved")); - } - - void SetState(base::WeakPtr<WebIDBCursor> cursor, - int64_t transaction_id) override {} - - void Error(mojom::blink::IDBException code, const String& message) override { - if (!promise_resolver_) - return; - - probe::AsyncTask async_task( - ExecutionContext::From(promise_resolver_->GetScriptState()), - &async_task_context_, "error"); - promise_resolver_->Reject(MakeGarbageCollected<DOMException>( - DOMExceptionCode::kUnknownError, - "The databases() promise was rejected.")); - } - - void SuccessNamesAndVersionsList( - Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions) override { - if (!promise_resolver_) - return; - DCHECK(!async_task_.has_value()); - - HeapVector<Member<IDBDatabaseInfo>> name_and_version_list; - name_and_version_list.ReserveInitialCapacity(name_and_version_list.size()); - for (const mojom::blink::IDBNameAndVersionPtr& name_version : - names_and_versions) { - const IDBNameAndVersion idb_name_and_version(name_version->name, - name_version->version); - IDBDatabaseInfo* idb_info = IDBDatabaseInfo::Create(); - idb_info->setName(name_version->name); - idb_info->setVersion(name_version->version); - name_and_version_list.push_back(idb_info); - } - - async_task_.emplace( - ExecutionContext::From(promise_resolver_->GetScriptState()), - &async_task_context_, "success"); - promise_resolver_->Resolve(name_and_version_list); - // Note: Resolve may cause |this| to be deleted. async_task_ will be - // completed in the destructor. - } - - void SuccessCursor( - mojo::PendingAssociatedRemote<mojom::blink::IDBCursor> cursor_info, - std::unique_ptr<IDBKey> key, - std::unique_ptr<IDBKey> primary_key, - absl::optional<std::unique_ptr<IDBValue>> optional_value) override { - NOTREACHED(); - } - - void SuccessCursorPrefetch( - Vector<std::unique_ptr<IDBKey>> keys, - Vector<std::unique_ptr<IDBKey>> primary_keys, - Vector<std::unique_ptr<IDBValue>> values) override { - NOTREACHED(); - } - - void SuccessDatabase( - mojo::PendingAssociatedRemote<mojom::blink::IDBDatabase> pending_backend, - const IDBDatabaseMetadata& metadata) override { - NOTREACHED(); - } - - void SuccessKey(std::unique_ptr<IDBKey> key) override { NOTREACHED(); } - - void SuccessValue(mojom::blink::IDBReturnValuePtr return_value) override { - NOTREACHED(); - } - - void SuccessArray(Vector<mojom::blink::IDBReturnValuePtr> values) override { - NOTREACHED(); - } - - void SuccessArrayArray( - Vector<Vector<mojom::blink::IDBReturnValuePtr>> all_values) override { - NOTREACHED(); - } - - void SuccessInteger(int64_t value) override { NOTREACHED(); } - - void Success() override { NOTREACHED(); } - - void SuccessCursorContinue( - std::unique_ptr<IDBKey> key, - std::unique_ptr<IDBKey> primary_key, - absl::optional<std::unique_ptr<IDBValue>> value) override { - NOTREACHED(); - } - - void ReceiveGetAllResults( - bool key_only, - mojo::PendingReceiver<mojom::blink::IDBDatabaseGetAllResultSink> receiver) - override { - NOTREACHED(); - } - - void Blocked(int64_t old_version) override { NOTREACHED(); } - - void UpgradeNeeded( - mojo::PendingAssociatedRemote<mojom::blink::IDBDatabase> pending_database, - int64_t old_version, - mojom::IDBDataLoss data_loss, - const String& data_loss_message, - const IDBDatabaseMetadata& metadata) override { - NOTREACHED(); - } - - void DetachRequestFromCallback() override { NOTREACHED(); } - - private: - probe::AsyncTaskContext async_task_context_; - GC_PLUGIN_IGNORE("crbug.com/1404924") - absl::optional<probe::AsyncTask> async_task_; - Persistent<ScriptPromiseResolver> promise_resolver_; -}; - -} // namespace - static const char kPermissionDeniedErrorMessage[] = "The user denied permission to access the database."; @@ -275,7 +130,7 @@ ExecutionContext* context = ExecutionContext::From(script_state); DCHECK(context->IsContextThread()); - if (!IsContextValid(ExecutionContext::From(script_state))) { + if (!IsContextValid(context)) { resolver->Reject(); return resolver->Promise(); } @@ -313,16 +168,46 @@ return; } - auto callbacks = std::make_unique<WebIDBGetDBNamesCallbacksImpl>(resolver); - callbacks->SetState(nullptr, WebIDBCallbacksImpl::kNoTransaction); - - auto& factory = GetFactory(context); - factory->GetDatabaseInfo(GetCallbacksProxy(std::move(callbacks))); + GetFactory(context)->GetDatabaseInfo( + WTF::BindOnce(&IDBFactory::DidGetDatabaseInfo, WrapWeakPersistent(this), + WrapPersistent(resolver))); } -void IDBFactory::GetDatabaseInfo( +void IDBFactory::DidGetDatabaseInfo( + ScriptPromiseResolver* resolver, + Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions, + mojom::blink::IDBErrorPtr error) { + if (!resolver) { + return; + } + ScriptState* script_state = resolver->GetScriptState(); + if (!script_state->ContextIsValid()) { + return; + } + + if (error) { + resolver->Reject(MakeGarbageCollected<DOMException>( + static_cast<DOMExceptionCode>(error->error_code), + error->error_message)); + return; + } + + HeapVector<Member<IDBDatabaseInfo>> name_and_version_list; + name_and_version_list.ReserveInitialCapacity(name_and_version_list.size()); + for (const mojom::blink::IDBNameAndVersionPtr& name_version : + names_and_versions) { + IDBDatabaseInfo* idb_info = IDBDatabaseInfo::Create(); + idb_info->setName(name_version->name); + idb_info->setVersion(name_version->version); + name_and_version_list.push_back(idb_info); + } + + resolver->Resolve(name_and_version_list); +} + +void IDBFactory::GetDatabaseInfoForDevTools( ScriptState* script_state, - std::unique_ptr<mojom::blink::IDBCallbacks> callbacks) { + mojom::blink::IDBFactory::GetDatabaseInfoCallback callback) { ExecutionContext* context = ExecutionContext::From(script_state); DCHECK(context->IsContextThread()); @@ -332,39 +217,39 @@ } if (!context->GetSecurityOrigin()->CanAccessDatabase()) { - callbacks->Error(mojom::blink::IDBException::kAbortError, - "Access to the IndexedDB API is denied in this context."); + std::move(callback).Run( + {}, mojom::blink::IDBError::New( + mojom::blink::IDBException::kAbortError, + "Access to the IndexedDB API is denied in this context.")); return; } AllowIndexedDB( - context, WTF::BindOnce(&IDBFactory::GetDatabaseInfoImplHelper, + context, WTF::BindOnce(&IDBFactory::GetDatabaseInfoForDevToolsHelper, WrapWeakPersistent(this), WrapPersistent(context), - std::move(callbacks))); + std::move(callback))); return; } -void IDBFactory::GetDatabaseInfoImplHelper( +void IDBFactory::GetDatabaseInfoForDevToolsHelper( ExecutionContext* context, - std::unique_ptr<mojom::blink::IDBCallbacks> callbacks) { + mojom::blink::IDBFactory::GetDatabaseInfoCallback callback) { if (context->IsContextDestroyed()) { - callbacks->Error(mojom::blink::IDBException::kAbortError, - "Access to the IndexedDB API is denied in this context."); + std::move(callback).Run( + {}, mojom::blink::IDBError::New( + mojom::blink::IDBException::kAbortError, + "Access to the IndexedDB API is denied in this context.")); return; } if (!allowed_.value()) { - callbacks->Error(mojom::blink::IDBException::kUnknownError, - kPermissionDeniedErrorMessage); + std::move(callback).Run({}, mojom::blink::IDBError::New( + mojom::blink::IDBException::kUnknownError, + kPermissionDeniedErrorMessage)); return; } - mojo::PendingAssociatedRemote<mojom::blink::IDBCallbacks> pending_callbacks; - mojo::MakeSelfOwnedAssociatedReceiver( - std::move(callbacks), - pending_callbacks.InitWithNewEndpointAndPassReceiver()); - - GetFactory(context)->GetDatabaseInfo(std::move(pending_callbacks)); + GetFactory(context)->GetDatabaseInfo(std::move(callback)); } IDBOpenDBRequest* IDBFactory::open(ScriptState* script_state,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.h b/third_party/blink/renderer/modules/indexeddb/idb_factory.h index 0252fdb..44e5b12 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_factory.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.h
@@ -81,16 +81,11 @@ ExceptionState&); ScriptPromise GetDatabaseInfo(ScriptState*, ExceptionState&); - void GetDatabaseInfoImpl(ExecutionContext* context, - ScriptPromiseResolver* resolver); // This method is exposed specifically for DevTools. - void GetDatabaseInfo(ScriptState*, - std::unique_ptr<mojom::blink::IDBCallbacks> callbacks); - - void GetDatabaseInfoImplHelper( - ExecutionContext* context, - std::unique_ptr<mojom::blink::IDBCallbacks> callbacks); + void GetDatabaseInfoForDevTools( + ScriptState*, + mojom::blink::IDBFactory::GetDatabaseInfoCallback callback); void SetFactoryForTesting(HeapMojoRemote<mojom::blink::IDBFactory> factory); @@ -126,6 +121,17 @@ const String& name, bool force_close); + void GetDatabaseInfoImpl(ExecutionContext* context, + ScriptPromiseResolver* resolver); + void DidGetDatabaseInfo( + ScriptPromiseResolver* resolver, + Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions, + mojom::blink::IDBErrorPtr error); + + void GetDatabaseInfoForDevToolsHelper( + ExecutionContext* context, + mojom::blink::IDBFactory::GetDatabaseInfoCallback callback); + void AllowIndexedDB(ExecutionContext* context, base::OnceCallback<void()> callback); void DidAllowIndexedDB(base::OnceCallback<void()> callback,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc deleted file mode 100644 index d13232d..0000000 --- a/third_party/blink/renderer/modules/indexeddb/idb_factory_test.cc +++ /dev/null
@@ -1,201 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/modules/indexeddb/idb_factory.h" - -#include <memory> -#include <utility> - -#include "base/memory/ptr_util.h" -#include "base/memory/scoped_refptr.h" -#include "mojo/public/cpp/bindings/associated_remote.h" -#include "mojo/public/cpp/bindings/pending_associated_remote.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/blink/public/mojom/indexeddb/indexeddb.mojom-blink.h" -#include "third_party/blink/public/platform/web_security_origin.h" -#include "third_party/blink/renderer/bindings/core/v8/script_function.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" -#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h" -#include "third_party/blink/renderer/bindings/core/v8/script_value.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h" -#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" -#include "third_party/blink/renderer/core/testing/dummy_page_holder.h" -#include "third_party/blink/renderer/modules/indexeddb/idb_database_error.h" -#include "third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h" -#include "third_party/blink/renderer/platform/bindings/exception_state.h" -#include "third_party/blink/renderer/platform/bindings/script_state.h" -#include "third_party/blink/renderer/platform/testing/testing_platform_support.h" - -namespace blink { -namespace { - -class TestHelperFunction : public ScriptFunction::Callable { - public: - explicit TestHelperFunction(bool* called_flag) : called_flag_(called_flag) {} - - ScriptValue Call(ScriptState* script_state, ScriptValue value) override { - *called_flag_ = true; - return value; - } - - private: - bool* called_flag_; -}; - -class BackendFactoryWithMockedDatabaseInfo : public mojom::blink::IDBFactory { - public: - explicit BackendFactoryWithMockedDatabaseInfo( - mojo::PendingReceiver<mojom::blink::IDBFactory> pending_receiver) - : receiver_(this, std::move(pending_receiver)) {} - - BackendFactoryWithMockedDatabaseInfo( - const BackendFactoryWithMockedDatabaseInfo&) = delete; - BackendFactoryWithMockedDatabaseInfo& operator=( - const BackendFactoryWithMockedDatabaseInfo&) = delete; - - void Open(mojo::PendingAssociatedRemote<mojom::blink::IDBCallbacks> - pending_callbacks, - mojo::PendingAssociatedRemote<mojom::blink::IDBDatabaseCallbacks> - database_callbacks, - const WTF::String& name, - int64_t version, - mojo::PendingAssociatedReceiver<mojom::blink::IDBTransaction> - version_change_transaction_receiver, - int64_t transaction_id) override { - NOTREACHED(); - } - - void DeleteDatabase(mojo::PendingAssociatedRemote<mojom::blink::IDBCallbacks> - pending_callbacks, - const WTF::String& name, - bool force_close) override { - NOTREACHED(); - } - - void GetDatabaseInfo(mojo::PendingAssociatedRemote<mojom::blink::IDBCallbacks> - pending_callbacks) override { - callbacks_ptr_->Bind(std::move(pending_callbacks)); - } - - void SetCallbacksPointer( - mojo::AssociatedRemote<mojom::blink::IDBCallbacks>* callbacks_ptr) { - callbacks_ptr_ = callbacks_ptr; - } - - private: - mojo::Receiver<mojom::blink::IDBFactory> receiver_; - mojo::AssociatedRemote<mojom::blink::IDBCallbacks>* callbacks_ptr_; -}; - -class IDBFactoryTest : public testing::Test { - public: - IDBFactoryTest(const IDBFactoryTest&) = delete; - IDBFactoryTest& operator=(const IDBFactoryTest&) = delete; - - protected: - IDBFactoryTest() = default; - ~IDBFactoryTest() override = default; - - ScopedTestingPlatformSupport<TestingPlatformSupport> platform_; -}; - -TEST_F(IDBFactoryTest, WebIDBGetDBInfoCallbacksResolvesPromise) { - V8TestingScope scope(KURL("https://example.com")); - - HeapMojoRemote<mojom::blink::IDBFactory> remote(scope.GetExecutionContext()); - auto mock_factory = std::make_unique<BackendFactoryWithMockedDatabaseInfo>( - remote.BindNewPipeAndPassReceiver( - scope.GetExecutionContext()->GetTaskRunner( - TaskType::kDatabaseAccess))); - - mojo::AssociatedRemote<mojom::blink::IDBCallbacks> callbacks; - mock_factory->SetCallbacksPointer(&callbacks); - auto* factory = MakeGarbageCollected<IDBFactory>(scope.GetExecutionContext()); - factory->SetFactoryForTesting(std::move(remote)); - - DummyExceptionStateForTesting exception_state; - ScriptPromise promise = - factory->GetDatabaseInfo(scope.GetScriptState(), exception_state); - - // Allow the GetDatabaseInfo message to propagate across mojo pipes. - platform_->RunUntilIdle(); - - bool on_fulfilled = false; - bool on_rejected = false; - promise.Then(MakeGarbageCollected<ScriptFunction>( - scope.GetScriptState(), - MakeGarbageCollected<TestHelperFunction>(&on_fulfilled)), - MakeGarbageCollected<ScriptFunction>( - scope.GetScriptState(), - MakeGarbageCollected<TestHelperFunction>(&on_rejected))); - - EXPECT_FALSE(on_fulfilled); - EXPECT_FALSE(on_rejected); - - Vector<mojom::blink::IDBNameAndVersionPtr> name_and_info_list; - callbacks->SuccessNamesAndVersionsList(std::move(name_and_info_list)); - - EXPECT_FALSE(on_fulfilled); - EXPECT_FALSE(on_rejected); - - // Allow the Success message to propagate across mojo pipes. This will also - // perform a microtask checkpoint, so an explicit call to do that is not - // needed. - platform_->RunUntilIdle(); - - EXPECT_TRUE(on_fulfilled); - EXPECT_FALSE(on_rejected); -} - -TEST_F(IDBFactoryTest, WebIDBGetDBNamesCallbacksRejectsPromise) { - V8TestingScope scope(KURL("https://example.com")); - - HeapMojoRemote<mojom::blink::IDBFactory> remote(scope.GetExecutionContext()); - auto mock_factory = std::make_unique<BackendFactoryWithMockedDatabaseInfo>( - remote.BindNewPipeAndPassReceiver( - scope.GetExecutionContext()->GetTaskRunner( - TaskType::kDatabaseAccess))); - - mojo::AssociatedRemote<mojom::blink::IDBCallbacks> callbacks; - mock_factory->SetCallbacksPointer(&callbacks); - auto* factory = MakeGarbageCollected<IDBFactory>(scope.GetExecutionContext()); - factory->SetFactoryForTesting(std::move(remote)); - - DummyExceptionStateForTesting exception_state; - ScriptPromise promise = - factory->GetDatabaseInfo(scope.GetScriptState(), exception_state); - - // Allow the GetDatabaseInfo message to propagate across mojo pipes. - platform_->RunUntilIdle(); - - bool on_fulfilled = false; - bool on_rejected = false; - promise.Then(MakeGarbageCollected<ScriptFunction>( - scope.GetScriptState(), - MakeGarbageCollected<TestHelperFunction>(&on_fulfilled)), - MakeGarbageCollected<ScriptFunction>( - scope.GetScriptState(), - MakeGarbageCollected<TestHelperFunction>(&on_rejected))); - - EXPECT_FALSE(on_fulfilled); - EXPECT_FALSE(on_rejected); - - callbacks->Error(mojom::blink::IDBException::kNoError, "message"); - - EXPECT_FALSE(on_fulfilled); - EXPECT_FALSE(on_rejected); - - // Allow the Error message to propagate across mojo pipes. This will also - // perform a microtask checkpoint, so an explicit call to do that is not - // needed. - platform_->RunUntilIdle(); - - EXPECT_FALSE(on_fulfilled); - EXPECT_TRUE(on_rejected); -} - -} // namespace -} // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h b/third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h deleted file mode 100644 index 891c6d4d..0000000 --- a/third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_NAME_AND_VERSION_H_ -#define THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_NAME_AND_VERSION_H_ - -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace blink { - -struct IDBNameAndVersion { - enum { kNoVersion = -1 }; - String name; - int64_t version; - - IDBNameAndVersion() : version(kNoVersion) {} - IDBNameAndVersion(String name, int64_t version) - : name(name), version(version) {} -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_INDEXEDDB_IDB_NAME_AND_VERSION_H_
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc index 815ae37a..6895e76 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc +++ b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/dom/dom_exception.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" #include "third_party/blink/renderer/modules/indexeddb/idb_request.h" #include "third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.h" @@ -27,7 +28,9 @@ DCHECK(IDBValueUnwrapper::IsWrapped(values_)); } -IDBRequestLoader::~IDBRequestLoader() {} +IDBRequestLoader::~IDBRequestLoader() { + // TODO(pwnall): Do we need to call loader_->Cancel() here? +} void IDBRequestLoader::Start() { #if DCHECK_IS_ON() @@ -84,21 +87,19 @@ file_reader_loading_ = true; #endif // DCHECK_IS_ON() loader_ = MakeGarbageCollected<FileReaderLoader>( - this, exection_context->GetTaskRunner(TaskType::kDatabaseAccess)); + FileReadType::kReadByClient, this, + exection_context->GetTaskRunner(TaskType::kDatabaseAccess)); loader_->Start(unwrapper.WrapperBlobHandle()); } -FileErrorCode IDBRequestLoader::DidStartLoading(uint64_t, uint64_t) { - return FileErrorCode::kOK; -} +void IDBRequestLoader::DidStartLoading() {} -FileErrorCode IDBRequestLoader::DidReceiveData(const char* data, +void IDBRequestLoader::DidReceiveDataForClient(const char* data, unsigned data_length) { DCHECK_LE(wrapped_data_.size() + data_length, wrapped_data_.capacity()) << "The reader returned more data than we were prepared for"; wrapped_data_.Append(data, data_length); - return FileErrorCode::kOK; } void IDBRequestLoader::DidFinishLoading() {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.h b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.h index feb52f0..44b571b 100644 --- a/third_party/blink/renderer/modules/indexeddb/idb_request_loader.h +++ b/third_party/blink/renderer/modules/indexeddb/idb_request_loader.h
@@ -8,8 +8,8 @@ #include <memory> #include "base/dcheck_is_on.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/member.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -31,7 +31,7 @@ // assumes that the overhead of creating and destroying a Vector is much smaller // than the IPC overhead required to load the Blob data into the renderer. class IDBRequestLoader : public GarbageCollected<IDBRequestLoader>, - public FileReaderClient { + public FileReaderLoaderClient { public: // Creates a loader that will unwrap IDBValues received by a IDBRequest. // @@ -50,13 +50,13 @@ // Halt the process of unwrapping values, if possible. void Cancel(); - // FileReaderClient implementation. - FileErrorCode DidStartLoading(uint64_t, uint64_t) override; - FileErrorCode DidReceiveData(const char* data, unsigned data_length) override; + // FileReaderLoaderClient implementaton. + void DidStartLoading() override; + void DidReceiveDataForClient(const char* data, unsigned data_length) override; void DidFinishLoading() override; void DidFail(FileErrorCode) override; void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(loader_); }
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc index a7602cb..53da1ed 100644 --- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc +++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -116,50 +116,22 @@ return protocol::Response::Success(); } -class GetDatabaseNamesCallback final : public mojom::blink::IDBCallbacks { - public: - explicit GetDatabaseNamesCallback( - std::unique_ptr<RequestDatabaseNamesCallback> request_callback) - : request_callback_(std::move(request_callback)) {} - ~GetDatabaseNamesCallback() override = default; - - void Error(mojom::blink::IDBException code, const String& message) override { - request_callback_->sendFailure( +void OnGotDatabaseNames( + std::unique_ptr<RequestDatabaseNamesCallback> request_callback, + Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions, + mojom::blink::IDBErrorPtr error) { + if (error) { + request_callback->sendFailure( protocol::Response::ServerError("Could not obtain database names.")); + return; } - void SuccessNamesAndVersionsList( - Vector<mojom::blink::IDBNameAndVersionPtr> names_and_versions) override { - auto database_names = std::make_unique<protocol::Array<String>>(); - for (const auto& name_and_version : names_and_versions) - database_names->emplace_back(name_and_version->name); - request_callback_->sendSuccess(std::move(database_names)); + auto database_names = std::make_unique<protocol::Array<String>>(); + for (const auto& name_and_version : names_and_versions) { + database_names->emplace_back(name_and_version->name); } - - void SuccessDatabase( - mojo::PendingAssociatedRemote<mojom::blink::IDBDatabase> pending_backend, - const IDBDatabaseMetadata& metadata) override { - NOTREACHED(); - } - - void SuccessInteger(int64_t value) override { NOTREACHED(); } - - void Success() override { NOTREACHED(); } - - void Blocked(int64_t old_version) override { NOTREACHED(); } - - void UpgradeNeeded( - mojo::PendingAssociatedRemote<mojom::blink::IDBDatabase> pending_database, - int64_t old_version, - mojom::blink::IDBDataLoss data_loss, - const String& data_loss_message, - const IDBDatabaseMetadata& metadata) override { - NOTREACHED(); - } - - private: - std::unique_ptr<RequestDatabaseNamesCallback> request_callback_; -}; + request_callback->sendSuccess(std::move(database_names)); +} class DeleteCallback final : public NativeEventListener { public: @@ -806,9 +778,9 @@ request_callback->sendFailure(protocol::Response::InternalError()); return; } - idb_factory->GetDatabaseInfo( + idb_factory->GetDatabaseInfoForDevTools( script_state, - std::make_unique<GetDatabaseNamesCallback>(std::move(request_callback))); + WTF::BindOnce(&OnGotDatabaseNames, std::move(request_callback))); } void InspectorIndexedDBAgent::requestDatabase(
diff --git a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h index 83ea1ec..c42dccc4 100644 --- a/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h +++ b/third_party/blink/renderer/modules/indexeddb/mock_web_idb_callbacks.h
@@ -14,7 +14,6 @@ #include "third_party/blink/public/web/web_heap.h" #include "third_party/blink/renderer/modules/indexeddb/idb_database_error.h" #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h" -#include "third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h" #include "third_party/blink/renderer/modules/indexeddb/web_idb_callbacks.h" namespace blink { @@ -41,9 +40,6 @@ const std::unique_ptr<IDBKey>& primaryKey, const absl::optional<std::unique_ptr<IDBValue>>& value)); - MOCK_METHOD1(SuccessNamesAndVersionsList, - void(Vector<mojom::blink::IDBNameAndVersionPtr>)); - void SuccessCursor( mojo::PendingAssociatedRemote<mojom::blink::IDBCursor> cursor_info, std::unique_ptr<IDBKey> key,
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc index c1eb7e4..9670040 100644 --- a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc +++ b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.cc
@@ -38,7 +38,6 @@ #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/modules/indexed_db_names.h" #include "third_party/blink/renderer/modules/indexeddb/idb_metadata.h" -#include "third_party/blink/renderer/modules/indexeddb/idb_name_and_version.h" #include "third_party/blink/renderer/modules/indexeddb/idb_request.h" #include "third_party/blink/renderer/modules/indexeddb/idb_request_queue_item.h" #include "third_party/blink/renderer/modules/indexeddb/idb_value.h" @@ -109,12 +108,6 @@ static_cast<DOMExceptionCode>(code), message)); } -void WebIDBCallbacksImpl::SuccessNamesAndVersionsList( - Vector<mojom::blink::IDBNameAndVersionPtr> name_and_version_list) { - // Only implemented in idb_factory.cc for the promise-based databases() call. - NOTREACHED(); -} - void WebIDBCallbacksImpl::SuccessCursor( mojo::PendingAssociatedRemote<mojom::blink::IDBCursor> cursor_info, std::unique_ptr<IDBKey> key,
diff --git a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h index dbb565f..a0774f7 100644 --- a/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h +++ b/third_party/blink/renderer/modules/indexeddb/web_idb_callbacks_impl.h
@@ -66,8 +66,6 @@ // Pointers transfer ownership. void Error(mojom::blink::IDBException code, const String& message) override; - void SuccessNamesAndVersionsList( - Vector<mojom::blink::IDBNameAndVersionPtr>) override; void SuccessCursor( mojo::PendingAssociatedRemote<mojom::blink::IDBCursor> cursor_info, std::unique_ptr<IDBKey> key,
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc index 25077876..9d4eff6 100644 --- a/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc +++ b/third_party/blink/renderer/modules/media_controls/media_controls_orientation_lock_delegate_test.cc
@@ -35,6 +35,7 @@ #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/web_test_support.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" #include "ui/display/mojom/screen_orientation.mojom-blink.h" #include "ui/gfx/geometry/rect.h" @@ -94,6 +95,7 @@ (device::mojom::ScreenOrientationLockType)); private: + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<device::mojom::blink::ScreenOrientation> receiver_{ this}; };
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc index 5baf2d7..d8133d7a 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc
@@ -38,11 +38,12 @@ struct MediaRecorderBitrates { const absl::optional<uint32_t> audio_bps; const absl::optional<uint32_t> video_bps; + const absl::optional<uint32_t> overall_bps; }; -// Boundaries of Opus bitrate from https://www.opus-codec.org/. +// Boundaries of Opus SILK bitrate from https://www.opus-codec.org/. const int kSmallestPossibleOpusBitRate = 5000; -const int kLargestAutoAllocatedOpusBitRate = 128000; +const int kLargestPossibleOpusBitRate = 510000; // Smallest Vpx bitrate that can be requested. // 75kbps is the min bitrate recommended by VP9 VOD settings for 320x240 videos. @@ -91,6 +92,44 @@ return AudioTrackRecorder::BitrateMode::kVariable; } +void LogConsoleMessage(ExecutionContext* context, const String& message) { + context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kJavaScript, + mojom::blink::ConsoleMessageLevel::kWarning, message)); +} + +uint32_t ClampAudioBitRate(ExecutionContext* context, uint32_t audio_bps) { + if (audio_bps > kLargestPossibleOpusBitRate) { + LogConsoleMessage( + context, + String::Format( + "Clamping calculated audio bitrate (%dbps) to the maximum (%dbps)", + audio_bps, kLargestPossibleOpusBitRate)); + return kLargestPossibleOpusBitRate; + } + if (audio_bps < kSmallestPossibleOpusBitRate) { + LogConsoleMessage( + context, + String::Format( + "Clamping calculated audio bitrate (%dbps) to the minimum (%dbps)", + audio_bps, kSmallestPossibleOpusBitRate)); + return kSmallestPossibleOpusBitRate; + } + return audio_bps; +} + +uint32_t ClampVideoBitRate(ExecutionContext* context, uint32_t video_bps) { + if (video_bps < kSmallestPossibleVpxBitRate) { + LogConsoleMessage( + context, + String::Format( + "Clamping calculated video bitrate (%dbps) to the minimum (%dbps)", + video_bps, kSmallestPossibleVpxBitRate)); + return kSmallestPossibleVpxBitRate; + } + return video_bps; +} + // Allocates the requested bit rates from |options| into the respective // |{audio,video}_bps| (where a value of zero indicates Platform to use // whatever it sees fit). If |options.bitsPerSecond()| is specified, it @@ -101,85 +140,31 @@ MediaRecorderBitrates GetBitratesFromOptions( ExceptionState& exception_state, ExecutionContext* context, - const MediaRecorderOptions* options, - MediaStream* stream) { - const bool use_video = !stream->getVideoTracks().empty(); - const bool use_audio = !stream->getAudioTracks().empty(); - + const MediaRecorderOptions* options) { // Clamp incoming values into a signed integer's range. // TODO(mcasas): This section would no be needed if the bit rates are signed // or double, see https://github.com/w3c/mediacapture-record/issues/48. constexpr uint32_t kMaxIntAsUnsigned = std::numeric_limits<int>::max(); - uint32_t overall_bps = 0; - if (options->hasBitsPerSecond()) { - overall_bps = std::min(options->bitsPerSecond(), kMaxIntAsUnsigned); + absl::optional<uint32_t> audio_bps; + if (options->hasAudioBitsPerSecond()) { + audio_bps = std::min(options->audioBitsPerSecond(), kMaxIntAsUnsigned); } absl::optional<uint32_t> video_bps; if (options->hasVideoBitsPerSecond()) { video_bps = std::min(options->videoBitsPerSecond(), kMaxIntAsUnsigned); } - absl::optional<uint32_t> audio_bps; - if (options->hasAudioBitsPerSecond()) { - audio_bps = std::min(options->audioBitsPerSecond(), kMaxIntAsUnsigned); + absl::optional<uint32_t> overall_bps; + if (options->hasBitsPerSecond()) { + overall_bps = std::min(options->bitsPerSecond(), kMaxIntAsUnsigned); + audio_bps = ClampAudioBitRate(context, overall_bps.value() / 10); + video_bps = overall_bps.value() >= audio_bps.value() + ? overall_bps.value() - audio_bps.value() + : 0u; + video_bps = ClampVideoBitRate(context, video_bps.value()); } - if (use_audio) { - // |overall_bps| overrides the specific audio and video bit rates. - if (options->hasBitsPerSecond()) { - if (use_video) - audio_bps = overall_bps / 10; - else - audio_bps = overall_bps; - } - // Limit audio bitrate values if set explicitly or calculated. - if (options->hasBitsPerSecond()) { - if (audio_bps.value() > kLargestAutoAllocatedOpusBitRate) { - context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, - mojom::ConsoleMessageLevel::kWarning, - "Clamping calculated audio bitrate (" + - String::Number(audio_bps.value()) + "bps) to the maximum (" + - String::Number(kLargestAutoAllocatedOpusBitRate) + "bps)")); - audio_bps = kLargestAutoAllocatedOpusBitRate; - } - - if (audio_bps.value() < kSmallestPossibleOpusBitRate) { - context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, - mojom::ConsoleMessageLevel::kWarning, - "Clamping calculated audio bitrate (" + - String::Number(audio_bps.value()) + "bps) to the minimum (" + - String::Number(kSmallestPossibleOpusBitRate) + "bps)")); - audio_bps = kSmallestPossibleOpusBitRate; - } - } - } - - if (use_video) { - // Allocate the remaining |overall_bps|, if any, to video. - if (options->hasBitsPerSecond()) { - video_bps = overall_bps >= audio_bps.value_or(0) - ? overall_bps - audio_bps.value_or(0) - : 0u; - } - - // Clamp the video bit rate. Avoid clamping if the user has not set it - // explicitly. - if (options->hasBitsPerSecond()) { - if (video_bps.value() < kSmallestPossibleVpxBitRate) { - context->AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::ConsoleMessageSource::kJavaScript, - mojom::ConsoleMessageLevel::kWarning, - "Clamping calculated video bitrate (" + - String::Number(video_bps.value()) + "bps) to the minimum (" + - String::Number(kSmallestPossibleVpxBitRate) + "bps)")); - video_bps = kSmallestPossibleVpxBitRate; - } - } - } - - return {audio_bps, video_bps}; + return {audio_bps, video_bps, overall_bps}; } } // namespace @@ -222,12 +207,12 @@ } const MediaRecorderBitrates bitrates = - GetBitratesFromOptions(exception_state, context, options, stream); + GetBitratesFromOptions(exception_state, context, options); const ContentType content_type(mime_type_); - if (!recorder_handler_->Initialize( - this, stream->Descriptor(), content_type.GetType(), - content_type.Parameter("codecs"), bitrates.audio_bps.value_or(0), - bitrates.video_bps.value_or(0), GetBitrateModeFromOptions(options))) { + if (!recorder_handler_->Initialize(this, stream->Descriptor(), + content_type.GetType(), + content_type.Parameter("codecs"), + GetBitrateModeFromOptions(options))) { exception_state.ThrowDOMException( DOMExceptionCode::kNotSupportedError, "Failed to initialize native MediaRecorder the type provided (" + @@ -236,6 +221,7 @@ audio_bits_per_second_ = bitrates.audio_bps.value_or(kDefaultAudioBitRate); video_bits_per_second_ = bitrates.video_bps.value_or(kDefaultVideoBitRate); + overall_bits_per_second_ = bitrates.overall_bps; } MediaRecorder::~MediaRecorder() = default; @@ -280,9 +266,28 @@ state_ = State::kRecording; - if (!recorder_handler_->Start(time_slice)) { + if (stream_->getAudioTracks().size() == 0) { + audio_bits_per_second_ = 0; + if (overall_bits_per_second_.has_value()) { + video_bits_per_second_ = ClampVideoBitRate( + GetExecutionContext(), overall_bits_per_second_.value()); + } + } + + if (stream_->getVideoTracks().size() == 0) { + video_bits_per_second_ = 0; + if (overall_bits_per_second_.has_value()) { + audio_bits_per_second_ = ClampAudioBitRate( + GetExecutionContext(), overall_bits_per_second_.value()); + } + } + + const ContentType content_type(mime_type_); + if (!recorder_handler_->Start(time_slice, content_type.GetType(), + audio_bits_per_second_, + video_bits_per_second_)) { exception_state.ThrowDOMException( - DOMExceptionCode::kUnknownError, + DOMExceptionCode::kNotSupportedError, "There was an error starting the MediaRecorder."); } }
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder.h index e426e45..15200c86 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder.h +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder.h
@@ -106,6 +106,7 @@ String mime_type_; uint32_t audio_bits_per_second_{0}; uint32_t video_bits_per_second_{0}; + absl::optional<uint32_t> overall_bits_per_second_; State state_ = State::kInactive; bool first_write_received_ = false;
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc index 229cb8c..36e9c124 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -34,6 +34,7 @@ #include "third_party/blink/renderer/platform/mediastream/media_stream_descriptor.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_source.h" #include "third_party/blink/renderer/platform/mediastream/webrtc_uma_histograms.h" +#include "third_party/blink/renderer/platform/network/mime/content_type.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" @@ -154,6 +155,15 @@ return AudioTrackRecorder::CodecId::kLast; } +bool CanSupportVideoType(const String& type) { + return EqualIgnoringASCIICase(type, "video/webm") || + EqualIgnoringASCIICase(type, "video/x-matroska"); +} + +bool CanSupportAudioType(const String& type) { + return EqualIgnoringASCIICase(type, "audio/webm"); +} + } // anonymous namespace MediaRecorderHandler::MediaRecorderHandler( @@ -167,9 +177,8 @@ if (type.empty()) return true; - const bool video = EqualIgnoringASCIICase(type, "video/webm") || - EqualIgnoringASCIICase(type, "video/x-matroska"); - const bool audio = !video && EqualIgnoringASCIICase(type, "audio/webm"); + const bool video = CanSupportVideoType(type); + const bool audio = !video && CanSupportAudioType(type); if (!video && !audio) return false; @@ -214,8 +223,6 @@ MediaStreamDescriptor* media_stream, const String& type, const String& codecs, - uint32_t audio_bits_per_second, - uint32_t video_bits_per_second, AudioTrackRecorder::BitrateMode audio_bitrate_mode) { DCHECK(IsMainThread()); // Save histogram data so we can see how much MediaStream Recorder is used. @@ -252,8 +259,6 @@ DCHECK(recorder); recorder_ = recorder; - audio_bits_per_second_ = audio_bits_per_second; - video_bits_per_second_ = video_bits_per_second; audio_bitrate_mode_ = audio_bitrate_mode; return true; } @@ -262,7 +267,10 @@ return audio_bitrate_mode_; } -bool MediaRecorderHandler::Start(int timeslice) { +bool MediaRecorderHandler::Start(int timeslice, + const String& type, + uint32_t audio_bits_per_second, + uint32_t video_bits_per_second) { DCHECK(IsMainThread()); DCHECK(!recording_); DCHECK(media_stream_); @@ -278,6 +286,9 @@ timeslice_ = base::Milliseconds(timeslice); slice_origin_timestamp_ = base::TimeTicks::Now(); + audio_bits_per_second_ = audio_bits_per_second; + video_bits_per_second_ = video_bits_per_second; + video_tracks_ = media_stream_->VideoComponents(); audio_tracks_ = media_stream_->AudioComponents(); @@ -298,6 +309,16 @@ return false; } + // For each track in tracks, if the User Agent cannot record the track using + // the current configuration, abort. See step 13 in + // https://w3c.github.io/mediacapture-record/MediaRecorder.html#dom-mediarecorder-start + if (!use_video_tracks && CanSupportVideoType(type)) { + return false; + } + if (!use_audio_tracks && CanSupportAudioType(type)) { + return false; + } + muxer_ = std::make_unique<media::WebmMuxer>( CodecIdToMediaAudioCodec(audio_codec_id_), use_video_tracks, use_audio_tracks,
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h index a3004111..d474789b 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
@@ -65,13 +65,14 @@ MediaStreamDescriptor* media_stream, const String& type, const String& codecs, - uint32_t audio_bits_per_second, - uint32_t video_bits_per_second, AudioTrackRecorder::BitrateMode audio_bitrate_mode); AudioTrackRecorder::BitrateMode AudioBitrateMode(); - bool Start(int timeslice); + bool Start(int timeslice, + const String& type, + uint32_t audio_bits_per_second, + uint32_t video_bits_per_second); void Stop(); void Pause(); void Resume();
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc index 7f9a36f..5408acb 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
@@ -305,13 +305,13 @@ const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); EXPECT_EQ(media_recorder_handler_->AudioBitrateMode(), AudioTrackRecorder::BitrateMode::kVariable); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kConstant)); EXPECT_EQ(media_recorder_handler_->AudioBitrateMode(), AudioTrackRecorder::BitrateMode::kConstant); @@ -325,13 +325,13 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); EXPECT_FALSE(recording()); EXPECT_FALSE(hasVideoRecorders()); EXPECT_FALSE(hasAudioRecorders()); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); EXPECT_TRUE(recording()); EXPECT_TRUE(hasVideoRecorders() || !GetParam().has_video); @@ -358,9 +358,9 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); InSequence s; const scoped_refptr<media::VideoFrame> video_frame = @@ -441,9 +441,9 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); InSequence s; const std::unique_ptr<media::AudioBus> audio_bus1 = NextAudioBus(); @@ -505,9 +505,9 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); InSequence s; const scoped_refptr<media::VideoFrame> video_frame = @@ -554,7 +554,7 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); StringBuilder actual_mime_type; @@ -585,9 +585,9 @@ const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); Mock::VerifyAndClearExpectations(recorder); media_recorder_handler_->Pause(); @@ -618,13 +618,13 @@ const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); media_recorder_handler_->Stop(); Mock::VerifyAndClearExpectations(recorder); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, mime_type, 0, 0)); EXPECT_CALL(*recorder, WriteData).Times(AtLeast(1)); media::Muxer::VideoParameters params(gfx::Size(), 1, media::VideoCodec::kVP9, @@ -673,9 +673,10 @@ V8TestingScope scope; auto* recorder = MakeGarbageCollected<MockMediaRecorder>(scope); media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), "video/webm", "vp9,opus", 0, 0, + recorder, registry_.test_stream(), "video/webm", "vp9,opus", AudioTrackRecorder::BitrateMode::kVariable); - media_recorder_handler_->Start(std::numeric_limits<int>::max()); + media_recorder_handler_->Start(std::numeric_limits<int>::max(), "video/webm", + 0, 0); // Feed some encoded data into the recorder. Expect that data cached by the // muxer is emitted on the call to Stop. @@ -691,9 +692,10 @@ V8TestingScope scope; auto* recorder = MakeGarbageCollected<MockMediaRecorder>(scope); media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), "video/webm", "vp9,opus", 0, 0, + recorder, registry_.test_stream(), "video/webm", "vp9,opus", AudioTrackRecorder::BitrateMode::kVariable); - media_recorder_handler_->Start(std::numeric_limits<int>::max()); + media_recorder_handler_->Start(std::numeric_limits<int>::max(), "video/webm", + 0, 0); // Feed some encoded data into the recorder. Expect that data cached by the // muxer is emitted on the call to Stop. @@ -710,9 +712,10 @@ V8TestingScope scope; auto* recorder = MakeGarbageCollected<MockMediaRecorder>(scope); media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), "video/webm", "vp9,opus", 0, 0, + recorder, registry_.test_stream(), "video/webm", "vp9,opus", AudioTrackRecorder::BitrateMode::kVariable); - media_recorder_handler_->Start(std::numeric_limits<int>::max()); + media_recorder_handler_->Start(std::numeric_limits<int>::max(), "video/webm", + 0, 0); // Feed some encoded data into the recorder. Expect that data cached by the // muxer is emitted on the call to Stop. @@ -764,7 +767,7 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), mime_type, codecs, 0, 0, + recorder, registry_.test_stream(), mime_type, codecs, AudioTrackRecorder::BitrateMode::kVariable)); String actual_mime_type = @@ -839,9 +842,9 @@ V8TestingScope scope; auto* recorder = MakeGarbageCollected<MockMediaRecorder>(scope); media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), "", "", 0, 0, + recorder, registry_.test_stream(), "", "", AudioTrackRecorder::BitrateMode::kVariable); - media_recorder_handler_->Start(0); + media_recorder_handler_->Start(0, "", 0, 0); const size_t kFrameSize = 42; auto frame = FakeEncodedVideoFrame::Builder() @@ -868,9 +871,9 @@ V8TestingScope scope; auto* recorder = MakeGarbageCollected<MockMediaRecorder>(scope); EXPECT_TRUE(media_recorder_handler_->Initialize( - recorder, registry_.test_stream(), "", "", 0, 0, + recorder, registry_.test_stream(), "", "", AudioTrackRecorder::BitrateMode::kVariable)); - EXPECT_TRUE(media_recorder_handler_->Start(0)); + EXPECT_TRUE(media_recorder_handler_->Start(0, "", 0, 0)); // NOTE, Asan: the prototype of WriteData which has a const char* as data // ptr plays badly with gmock which tries to interpret it as a null-terminated
diff --git a/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.cc b/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.cc index 4e50538..cf37d0a 100644 --- a/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.cc +++ b/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.cc
@@ -95,4 +95,16 @@ return state_ == webrtc::DataChannelInterface::kOpen; } +void MockDataChannel::SendAsync( + webrtc::DataBuffer buffer, + absl::AnyInvocable<void(webrtc::RTCError) &&> on_complete) { + if (!on_complete) { + return; + } + std::move(on_complete)( + state_ == webrtc::DataChannelInterface::kOpen + ? webrtc::RTCError::OK() + : webrtc::RTCError(webrtc::RTCErrorType::INVALID_STATE)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.h b/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.h index 837fcdd..95cd9f3 100644 --- a/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.h +++ b/third_party/blink/renderer/modules/peerconnection/mock_data_channel_impl.h
@@ -39,6 +39,9 @@ uint64_t buffered_amount() const override; void Close() override; bool Send(const webrtc::DataBuffer& buffer) override; + void SendAsync( + webrtc::DataBuffer buffer, + absl::AnyInvocable<void(webrtc::RTCError) &&> on_complete) override; // For testing. void changeState(DataState state);
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc index c9cb884..5db6d8a 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
@@ -247,15 +247,10 @@ } void RTCDataChannel::Observer::OnMessage(const webrtc::DataBuffer& buffer) { - // TODO(tommi): Figure out a way to transfer ownership of the buffer without - // having to create a copy. See webrtc bug 3967. - std::unique_ptr<webrtc::DataBuffer> new_buffer( - new webrtc::DataBuffer(buffer)); PostCrossThreadTask( *main_thread_, FROM_HERE, CrossThreadBindOnce(&RTCDataChannel::Observer::OnMessageImpl, - scoped_refptr<Observer>(this), - std::move(new_buffer))); + scoped_refptr<Observer>(this), buffer)); } bool RTCDataChannel::Observer::IsOkToCallOnTheNetworkThread() { @@ -276,8 +271,7 @@ blink_channel_->OnBufferedAmountChange(sent_data_size); } -void RTCDataChannel::Observer::OnMessageImpl( - std::unique_ptr<webrtc::DataBuffer> buffer) { +void RTCDataChannel::Observer::OnMessageImpl(webrtc::DataBuffer buffer) { DCHECK(main_thread_->BelongsToCurrentThread()); if (blink_channel_) blink_channel_->OnMessage(std::move(buffer)); @@ -636,26 +630,26 @@ } } -void RTCDataChannel::OnMessage(std::unique_ptr<webrtc::DataBuffer> buffer) { +void RTCDataChannel::OnMessage(webrtc::DataBuffer buffer) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (buffer->binary) { + if (buffer.binary) { if (binary_type_ == kBinaryTypeBlob) { // FIXME: Implement. return; } if (binary_type_ == kBinaryTypeArrayBuffer) { DOMArrayBuffer* dom_buffer = DOMArrayBuffer::Create( - buffer->data.cdata(), - base::checked_cast<unsigned>(buffer->data.size())); + buffer.data.cdata(), + base::checked_cast<unsigned>(buffer.data.size())); ScheduleDispatchEvent(MessageEvent::Create(dom_buffer)); return; } NOTREACHED(); } else { String text = - buffer->data.size() > 0 - ? String::FromUTF8(buffer->data.cdata<char>(), buffer->data.size()) + buffer.data.size() > 0 + ? String::FromUTF8(buffer.data.cdata<char>(), buffer.data.size()) : g_empty_string; if (!text) { LOG(ERROR) << "Failed convert received data to UTF16"; @@ -708,11 +702,25 @@ void RTCDataChannel::SendDataBuffer(webrtc::DataBuffer data_buffer) { // SCTP data channels queue the packet on failure and always return true, so // Send can be called asynchronously for them. - // TODO(webrtc:11547): Use SendAsync() when that has landed in WebRTC. We need - // to use Send() in the meantime (instead of posting first to the signaling - // thread as we did before) now that the call will go directly to the - // network thread. This is so that we can maintain correct operational order. - channel()->Send(data_buffer); + channel()->SendAsync(std::move(data_buffer), [](webrtc::RTCError error) { + // TODO(orphis): Use this callback in combination with SendAsync to report + // completion of the send API to the JS layer. + // The possible failures per the spec are: + // - Channel not in open state. Although we check the state in each Send() + // implementation, it's possible to have a short race between the WebRTC + // state and the Chrome state, i.e. sending while a remote close event is + // pending. In this case, it's safe to ignore send failures. + // - Data longer than the transport maxMessageSize (not yet implemented in + // WebRTC or Blink). + // - Send Buffers full (buffered amount accounting in Blink layer to check + // for it). + if (!error.ok()) { + // TODO(orphis): Add collect UMA stats about failure. + // Note that when we get this callback, we're on WebRTC's network thread + // So the callback needs to be propagated to the main (JS) thread. + LOG(ERROR) << "Send failed" << webrtc::ToString(error.type()); + } + }); } void RTCDataChannel::CreateFeatureHandleForScheduler() {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h index 8ef2097..78240bf8 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h +++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.h
@@ -147,7 +147,7 @@ // webrtc::DataChannelObserver implementation on the main thread. void OnStateChangeImpl(webrtc::DataChannelInterface::DataState state); void OnBufferedAmountChangeImpl(unsigned sent_data_size); - void OnMessageImpl(std::unique_ptr<webrtc::DataBuffer> buffer); + void OnMessageImpl(webrtc::DataBuffer buffer); const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; WeakPersistent<RTCDataChannel> blink_channel_; @@ -156,7 +156,7 @@ void OnStateChange(webrtc::DataChannelInterface::DataState state); void OnBufferedAmountChange(unsigned previous_amount); - void OnMessage(std::unique_ptr<webrtc::DataBuffer> buffer); + void OnMessage(webrtc::DataBuffer buffer); void Dispose();
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc index a5a89e4..a6ae6fc 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel_test.cc
@@ -158,6 +158,30 @@ return true; } + void SendAsync( + webrtc::DataBuffer buffer, + absl::AnyInvocable<void(webrtc::RTCError) &&> on_complete) override { + base::WaitableEvent waitable_event( + base::WaitableEvent::ResetPolicy::MANUAL, + base::WaitableEvent::InitialState::NOT_SIGNALED); + auto* adapter = new absl::AnyInvocable<void(webrtc::RTCError) &&>( + std::move(on_complete)); + + PostCrossThreadTask( + *signaling_thread_.get(), FROM_HERE, + CrossThreadBindOnce( + [](MockDataChannel* channel, uint64_t buffer_size, + absl::AnyInvocable<void(webrtc::RTCError) &&>* adapter) { + channel->SendOnSignalingThread(buffer_size); + if (*adapter) { + std::move (*adapter)(webrtc::RTCError::OK()); + } + delete adapter; + }, + CrossThreadUnretained(this), buffer.size(), + CrossThreadUnretained(adapter))); + } + // For testing. void ChangeState(DataState state) { RunSynchronous( @@ -329,8 +353,7 @@ auto* channel = MakeGarbageCollected<RTCDataChannel>( execution_context_, webrtc_channel, pc.get()); - std::unique_ptr<webrtc::DataBuffer> message(new webrtc::DataBuffer("A")); - channel->OnMessage(std::move(message)); + channel->OnMessage(webrtc::DataBuffer("A")); ASSERT_EQ(1U, channel->scheduled_events_.size()); EXPECT_EQ("message", channel->scheduled_events_.back()->type().Utf8()); }
diff --git a/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc b/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc index 300c0b473..46b4620 100644 --- a/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc +++ b/third_party/blink/renderer/modules/peerconnection/webrtc_audio_renderer_test.cc
@@ -137,7 +137,7 @@ : source_(new MockAudioRendererSource()), agent_group_scheduler_( blink::scheduler::WebThreadScheduler::MainThreadScheduler() - ->CreateWebAgentGroupScheduler()), + .CreateWebAgentGroupScheduler()), web_view_(blink::WebView::Create( /*client=*/nullptr, /*is_hidden=*/false,
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc index 28480f95..e721ab4d 100644 --- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc +++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -12,8 +12,9 @@ #include "third_party/blink/renderer/core/dom/events/event.h" #include "third_party/blink/renderer/core/events/message_event.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h" #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer_view.h" @@ -118,33 +119,35 @@ class PresentationConnection::BlobLoader final : public GarbageCollected<PresentationConnection::BlobLoader>, - public FileReaderAccumulator { + public FileReaderLoaderClient { public: BlobLoader(scoped_refptr<BlobDataHandle> blob_data_handle, PresentationConnection* presentation_connection, scoped_refptr<base::SingleThreadTaskRunner> task_runner) : presentation_connection_(presentation_connection), - loader_( - MakeGarbageCollected<FileReaderLoader>(this, - std::move(task_runner))) { + loader_(MakeGarbageCollected<FileReaderLoader>( + FileReadType::kReadAsArrayBuffer, + this, + std::move(task_runner))) { loader_->Start(std::move(blob_data_handle)); } ~BlobLoader() override = default; - // FileReaderAccumulator functions. - void DidFinishLoading(FileReaderData contents) override { - auto* buffer = std::move(contents).AsDOMArrayBuffer(); - presentation_connection_->DidFinishLoadingBlob(buffer); + // FileReaderLoaderClient functions. + void DidStartLoading() override {} + void DidReceiveData() override {} + void DidFinishLoading() override { + presentation_connection_->DidFinishLoadingBlob( + loader_->TakeContents().AsDOMArrayBuffer()); } void DidFail(FileErrorCode error_code) override { - FileReaderAccumulator::DidFail(error_code); presentation_connection_->DidFailLoadingBlob(error_code); } void Cancel() { loader_->Cancel(); } void Trace(Visitor* visitor) const override { - FileReaderAccumulator::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(presentation_connection_); visitor->Trace(loader_); }
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_registration.h b/third_party/blink/renderer/modules/service_worker/service_worker_registration.h index fcba6a2..5d6f355e 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_registration.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_registration.h
@@ -20,6 +20,7 @@ #include "third_party/blink/renderer/platform/heap/prefinalizer.h" #include "third_party/blink/renderer/platform/supplementable.h" #include "third_party/blink/renderer/platform/wtf/forward.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -130,12 +131,14 @@ // to the Mojo connection. It is bound on the // main thread for service worker clients (document), and is bound on the // service worker thread for service worker execution contexts. + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::ServiceWorkerRegistrationObjectHost> host_; // |receiver_| receives messages from the ServiceWorkerRegistrationObjectHost // in the browser process. It is bound on the main thread for service worker // clients (document), and is bound on the service worker thread for service // worker execution contexts. + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::ServiceWorkerRegistrationObject> receiver_{this};
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.h b/third_party/blink/renderer/modules/shared_storage/shared_storage.h index f2da437..cbfd126 100644 --- a/third_party/blink/renderer/modules/shared_storage/shared_storage.h +++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.h
@@ -13,6 +13,7 @@ #include "third_party/blink/renderer/modules/modules_export.h" #include "third_party/blink/renderer/platform/bindings/script_wrappable.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { @@ -86,6 +87,7 @@ GetSharedStorageWorkletServiceClient(ExecutionContext* execution_context); private: + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedRemote<mojom::blink::SharedStorageDocumentService> shared_storage_document_service_;
diff --git a/third_party/blink/renderer/modules/smart_card/smart_card_resource_manager.h b/third_party/blink/renderer/modules/smart_card/smart_card_resource_manager.h index 733bdfb6..2328b624 100644 --- a/third_party/blink/renderer/modules/smart_card/smart_card_resource_manager.h +++ b/third_party/blink/renderer/modules/smart_card/smart_card_resource_manager.h
@@ -17,6 +17,7 @@ #include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h" #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" #include "third_party/blink/renderer/platform/supplementable.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace blink { @@ -72,6 +73,7 @@ SmartCardReaderPresenceObserver* GetOrCreatePresenceObserver(); HeapMojoRemote<mojom::blink::SmartCardService> service_; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::SmartCardServiceClient> receiver_{ this}; HeapHashSet<Member<ScriptPromiseResolver>> get_readers_promises_;
diff --git a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc index 7a543d0..a99ca90 100644 --- a/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc +++ b/third_party/blink/renderer/modules/websockets/websocket_channel_impl.cc
@@ -52,8 +52,9 @@ #include "third_party/blink/renderer/bindings/core/v8/capture_source_location.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" #include "third_party/blink/renderer/core/fileapi/file_error.h" -#include "third_party/blink/renderer/core/fileapi/file_reader_client.h" +#include "third_party/blink/renderer/core/fileapi/file_read_type.h" #include "third_party/blink/renderer/core/fileapi/file_reader_loader.h" +#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/loader/base_fetch_context.h" @@ -129,7 +130,7 @@ class WebSocketChannelImpl::BlobLoader final : public GarbageCollected<WebSocketChannelImpl::BlobLoader>, - public FileReaderClient { + public FileReaderLoaderClient { public: BlobLoader(scoped_refptr<BlobDataHandle>, WebSocketChannelImpl*, @@ -138,14 +139,14 @@ void Cancel(); - // FileReaderClient functions. - FileErrorCode DidStartLoading(uint64_t, uint64_t) override; - FileErrorCode DidReceiveData(const char* data, unsigned data_length) override; + // FileReaderLoaderClient functions. + void DidStartLoading() override; + void DidReceiveDataForClient(const char* data, unsigned data_length) override; void DidFinishLoading() override; void DidFail(FileErrorCode) override; void Trace(Visitor* visitor) const override { - FileReaderClient::Trace(visitor); + FileReaderLoaderClient::Trace(visitor); visitor->Trace(channel_); visitor->Trace(loader_); } @@ -158,8 +159,6 @@ MessageData data_; size_t size_ = 0; size_t offset_ = 0; - - bool blob_too_large_ = false; }; WebSocketChannelImpl::BlobLoader::BlobLoader( @@ -167,8 +166,10 @@ WebSocketChannelImpl* channel, scoped_refptr<base::SingleThreadTaskRunner> task_runner) : channel_(channel), - loader_(MakeGarbageCollected<FileReaderLoader>(this, - std::move(task_runner))) { + loader_( + MakeGarbageCollected<FileReaderLoader>(FileReadType::kReadByClient, + this, + std::move(task_runner))) { loader_->Start(std::move(blob_data_handle)); } @@ -178,30 +179,29 @@ data_ = nullptr; } -FileErrorCode WebSocketChannelImpl::BlobLoader::DidStartLoading(uint64_t, - uint64_t) { +void WebSocketChannelImpl::BlobLoader::DidStartLoading() { const absl::optional<uint64_t> size = loader_->TotalBytes(); DCHECK(size); if (size.value() > std::numeric_limits<size_t>::max()) { - blob_too_large_ = true; - return FileErrorCode::kAbortErr; + loader_->Cancel(); + loader_ = nullptr; + channel_->BlobTooLarge(); + return; } size_ = static_cast<size_t>(size.value()); data_ = WebSocketChannelImpl::CreateMessageData( channel_->execution_context_->GetIsolate(), size_); - return FileErrorCode::kOK; } -FileErrorCode WebSocketChannelImpl::BlobLoader::DidReceiveData( +void WebSocketChannelImpl::BlobLoader::DidReceiveDataForClient( const char* data, unsigned data_length) { const size_t data_to_copy = std::min(size_ - offset_, static_cast<size_t>(data_length)); if (!data_to_copy) - return FileErrorCode::kOK; + return; memcpy(data_.get() + offset_, data, data_to_copy); offset_ += data_to_copy; - return FileErrorCode::kOK; } void WebSocketChannelImpl::BlobLoader::DidFinishLoading() { @@ -212,10 +212,6 @@ } void WebSocketChannelImpl::BlobLoader::DidFail(FileErrorCode error_code) { - if (error_code == FileErrorCode::kAbortErr && blob_too_large_) { - blob_too_large_ = false; - channel_->BlobTooLarge(); - } channel_->DidFailLoadingBlob(error_code); loader_ = nullptr; data_ = nullptr;
diff --git a/third_party/blink/renderer/platform/bindings/source_location.cc b/third_party/blink/renderer/platform/bindings/source_location.cc index dce90a0..0b42ccd 100644 --- a/third_party/blink/renderer/platform/bindings/source_location.cc +++ b/third_party/blink/renderer/platform/bindings/source_location.cc
@@ -97,6 +97,10 @@ void SourceLocation::WriteIntoTrace( perfetto::TracedProto<SourceLocation::Proto> proto) const { + if (!stack_trace_ || stack_trace_->isEmpty()) { + return; + } + proto->set_function_name( ToPlatformString(stack_trace_->topFunctionName()).Utf8()); proto->set_script_id(stack_trace_->topScriptId()); @@ -108,21 +112,23 @@ // TODO(https://crbug.com/1396277): This should be a WriteIntoTrace function // once v8 has support for perfetto tracing (which is currently missing for v8 // chromium). - if (stack_trace_) { - for (const auto& frame : stack_trace_->frames()) { - auto& stack_trace_pb = *(proto->add_stack_frames()); - stack_trace_pb.set_function_name( - ToPlatformString(frame.functionName).Utf8()); + for (const auto& frame : stack_trace_->frames()) { + auto& stack_trace_pb = *(proto->add_stack_frames()); + stack_trace_pb.set_function_name( + ToPlatformString(frame.functionName).Utf8()); - auto& script_location = *(stack_trace_pb.set_script_location()); - script_location.set_source_url(ToPlatformString(frame.sourceURL).Utf8()); - script_location.set_line_number(frame.lineNumber); - script_location.set_column_number(frame.columnNumber); - } + auto& script_location = *(stack_trace_pb.set_script_location()); + script_location.set_source_url(ToPlatformString(frame.sourceURL).Utf8()); + script_location.set_line_number(frame.lineNumber); + script_location.set_column_number(frame.columnNumber); } } void SourceLocation::WriteIntoTrace(perfetto::TracedValue context) const { + if (!stack_trace_ || stack_trace_->isEmpty()) { + return; + } + // TODO(altimin): Consider replacing nested dict-inside-array with just an // array here. auto array = std::move(context).WriteArray();
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h index 15e81be9..724e6418 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.h +++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.h
@@ -53,6 +53,7 @@ #include "third_party/blink/renderer/platform/platform_export.h" #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h" #include "third_party/blink/renderer/platform/wtf/forward.h" +#include "third_party/blink/renderer/platform/wtf/gc_plugin.h" namespace base { class UnguessableToken; @@ -269,6 +270,7 @@ bool should_use_isolated_code_cache_ = false; bool is_downloading_to_blob_ = false; + GC_PLUGIN_IGNORE("https://crbug.com/1381979") mojo::AssociatedReceiver<mojom::blink::ProgressClient> progress_receiver_{ this}; bool blob_finished_ = false;
diff --git a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc index b9ef86ed..30b3ea4e 100644 --- a/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc +++ b/third_party/blink/renderer/platform/p2p/ipc_socket_factory.cc
@@ -67,7 +67,23 @@ return true; } -const size_t kDefaultMaximumInFlightBytes = 64 * 1024; // 64 KB +// 640KB, 10x max UDP packet size. This controls the maximum size we can write +// to the IPC buffer, which is consumed by the shared network service process. +// +// If this buffer is too small, we'll see more MaxPendingBytesWouldBlock +// events and text log entries from WebRTC (search for kSendErrorLogLimit). +// As is, rate limiting in the layer in WebRTC that calls this layer, isn't very +// sophisticated and the cost of being blocked by this limit can be quite high. +// After being blocked, this implementation will fire an event once bytes have +// been freed up, which is then fanned out to all potentially waiting writers. +// That can create a storm of calls to `Send[To]` which may then cause multiple +// blocking errors again, both wasting CPU and spamming the log. +// The network service is single threaded and shared with other render +// processes. So having this max value large enough to accommodate multiple +// buffers, allows for more efficient bulk processing and less back-and-forth +// synchronizing between the render processes and network service. +// See also: bugs.webrtc.org/9622 and crbug/856088. +const size_t kDefaultMaximumInFlightBytes = 10 * 64 * 1024; // IpcPacketSocket implements rtc::AsyncPacketSocket interface // using P2PSocketClient that works over IPC-channel. It must be used
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 2ffb8c3..e470636 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1209,6 +1209,12 @@ base_feature: "none", }, { + name: "DelayOutOfViewportLazyImages", + depends_on: ["LazyImageLoading"], + public: true, + status: "experimental", + }, + { name: "DelegatedInkTrails", status: "stable", base_feature: "none",
diff --git a/third_party/blink/renderer/platform/scheduler/common/features.h b/third_party/blink/renderer/platform/scheduler/common/features.h index aee8b42..a18ec53 100644 --- a/third_party/blink/renderer/platform/scheduler/common/features.h +++ b/third_party/blink/renderer/platform/scheduler/common/features.h
@@ -21,11 +21,6 @@ "BlinkSchedulerBestEffortPriorityForFindInPage", base::FEATURE_DISABLED_BY_DEFAULT); -// Prioritizes one BeginMainFrame after input. -BASE_FEATURE(kPrioritizeCompositingAfterInput, - "PrioritizeCompositingAfterInput", - base::FEATURE_ENABLED_BY_DEFAULT); - // Enable setting high priority database task type from field trial parameters. BASE_FEATURE(kHighPriorityDatabaseTaskType, "HighPriorityDatabaseTaskType",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index 6216bff..f892f07 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -355,18 +355,19 @@ } // static -WebThreadScheduler* WebThreadScheduler::MainThreadScheduler() { +WebThreadScheduler& WebThreadScheduler::MainThreadScheduler() { auto* main_thread = Thread::MainThread(); // Enforce that this is not called before the main thread is initialized. - DCHECK(main_thread); - DCHECK(main_thread->Scheduler()); - DCHECK(main_thread->Scheduler()->ToMainThreadScheduler()); - - // This can return nullptr if the main thread scheduler is not a - // MainThreadSchedulerImpl, which can happen in tests. - return main_thread->Scheduler() - ->ToMainThreadScheduler() - ->ToWebMainThreadScheduler(); + CHECK(main_thread && main_thread->Scheduler() && + main_thread->Scheduler()->ToMainThreadScheduler()); + auto* scheduler = main_thread->Scheduler() + ->ToMainThreadScheduler() + ->ToWebMainThreadScheduler(); + // `scheduler` can be null if it isn't a MainThreadSchedulerImpl, which can + // happen in tests. Tests should use a real main thread scheduler if a + // `WebThreadScheduler` is needed. + CHECK(scheduler); + return *scheduler; } MainThreadSchedulerImpl::MainThreadOnly::MainThreadOnly( @@ -532,9 +533,6 @@ YesNoStateToString) {} MainThreadSchedulerImpl::SchedulingSettings::SchedulingSettings() { - prioritize_compositing_after_input = - base::FeatureList::IsEnabled(kPrioritizeCompositingAfterInput); - mbi_override_task_runner_handle = base::FeatureList::IsEnabled(kMbiOverrideTaskRunnerHandle); @@ -2621,8 +2619,7 @@ main_thread_only().should_prioritize_compositor_task_queue_after_delay = false; main_thread_only().prioritize_compositing_after_input = false; - } else if (scheduling_settings().prioritize_compositing_after_input && - queue && + } else if (queue && queue->queue_type() == MainThreadTaskQueue::QueueType::kInput && main_thread_only().did_handle_discrete_input_event) { // Assume this input will result in a frame, which we want to show ASAP.
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index a91a69c..8c77ac66 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -105,9 +105,6 @@ struct SchedulingSettings { SchedulingSettings(); - // Prioritise one BeginMainFrame after an input task. - bool prioritize_compositing_after_input; - // If enabled, base::SingleThreadTaskRunner::GetCurrentDefault() and // base::SequencedTaskRunner::GetCurrentDefault() returns the current active // per-ASG task runner instead of the per-thread task runner.
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index 788c0f8..4658842 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -3333,15 +3333,7 @@ EXPECT_EQ(base::Time::Now(), base::Time::FromJsTime(1000000.0)); } -class MainThreadSchedulerImplWithCompositingAfterInputPrioritizationTest - : public MainThreadSchedulerImplTest { - public: - MainThreadSchedulerImplWithCompositingAfterInputPrioritizationTest() - : MainThreadSchedulerImplTest({kPrioritizeCompositingAfterInput}, {}) {} -}; - -TEST_F(MainThreadSchedulerImplWithCompositingAfterInputPrioritizationTest, - CompositingAfterInput) { +TEST_F(MainThreadSchedulerImplTest, CompositingAfterInput) { Vector<String> run_order; // Input tasks don't cause compositor tasks to be prioritized unless an input @@ -3367,7 +3359,7 @@ run_order.clear(); } -TEST_F(MainThreadSchedulerImplWithCompositingAfterInputPrioritizationTest, +TEST_F(MainThreadSchedulerImplTest, CompositorNotPrioritizedAfterContinuousInput) { Vector<String> run_order;
diff --git a/third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h index 54ccc006..aeccd281 100644 --- a/third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h +++ b/third_party/blink/renderer/platform/scheduler/public/main_thread_scheduler.h
@@ -83,8 +83,8 @@ virtual v8::Isolate* Isolate() = 0; // Return a reference to an underlying main thread WebThreadScheduler object. - // Can be null if there is no underlying main thread WebThreadScheduler - // (e.g. worker threads). + // This will be null if the `MainThreadScheduler` object doesn't support this, + // which can happen in tests if not using a real scheduler. virtual scheduler::WebThreadScheduler* ToWebMainThreadScheduler() { return nullptr; }
diff --git a/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc b/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc index 56e94cc..319d186 100644 --- a/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc +++ b/third_party/blink/renderer/platform/scheduler/test/renderer_scheduler_test_support.cc
@@ -46,10 +46,10 @@ return std::make_unique<SimpleMockMainThreadScheduler>(); } -void RunIdleTasksForTesting(WebThreadScheduler* scheduler, +void RunIdleTasksForTesting(WebThreadScheduler& scheduler, base::OnceClosure callback) { MainThreadSchedulerImpl* scheduler_impl = - static_cast<MainThreadSchedulerImpl*>(scheduler); + static_cast<MainThreadSchedulerImpl*>(&scheduler); scheduler_impl->RunIdleTasksForTesting(std::move(callback)); }
diff --git a/third_party/blink/tools/run_wpt_tests.py b/third_party/blink/tools/run_wpt_tests.py index db38a24..e1959ff 100755 --- a/third_party/blink/tools/run_wpt_tests.py +++ b/third_party/blink/tools/run_wpt_tests.py
@@ -790,7 +790,7 @@ if tools_root not in sys.path: sys.path.insert(0, tools_root) # Remove current cached modules to force a reload. - module_pattern = re.compile(r'\bwpt(runner|serve)?\b') + module_pattern = re.compile(r'^(tools|wpt(runner|serve)?)\b') for name in list(sys.modules): if module_pattern.search(name): del sys.modules[name]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 0d14a0f..721f2a1 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -700,6 +700,9 @@ crbug.com/1046784 http/tests/devtools/elements/styles-3/styles-disable-then-delete.js [ Crash Failure Pass Timeout ] +# Temporarily disabled to unblock https://crrev.com/c/4417276 +crbug.com/1427397 http/tests/devtools/elements/styles-4/style-update-during-selector-edit.js [ Failure Pass ] + # Subpixel rounding differences that are incorrect. crbug.com/997202 compositing/overflow/scaled-overflow.html [ Failure ] # Flaky subpixel AA difference (not necessarily incorrect, but flaky) @@ -2960,7 +2963,6 @@ crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-image/MediaStreamTrack-getConstraints.https.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-insertable-streams/MediaStreamTrackGenerator-audio.https.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-record/MediaRecorder-mimetype.html [ Crash ] -crbug.com/1180993 [ Mac10.14 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Crash Failure ] crbug.com/626703 [ Mac10.14 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/screen-capture/getdisplaymedia.https.html [ Crash ] crbug.com/626703 [ Mac10.14 ] external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html [ Crash Timeout ] @@ -3215,7 +3217,6 @@ crbug.com/626703 [ Win ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/binary/004.html?wpt_flags=h2 [ Skip Timeout ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/constructor/013.html?wpt_flags=h2 [ Skip Timeout ] -crbug.com/626703 external/wpt/page-visibility/visibility-state-entry.tentative.html [ Skip Timeout ] crbug.com/626703 [ Mac12 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] crbug.com/626703 [ Mac13 Release ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] # TODO(crbug.com/1358135, crbug.com/1358147): Re-enable this test: Re-enable this test @@ -3637,7 +3638,7 @@ # [css-subgrid] crbug.com/618969 external/wpt/css/css-grid/subgrid/auto-track-sizing-001.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/auto-track-sizing-002.html [ Failure ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/baseline-001.html [ Crash Failure ] +crbug.com/618969 external/wpt/css/css-grid/subgrid/baseline-001.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/grid-gap-001.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/grid-gap-002.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/grid-gap-003.html [ Failure ] @@ -3655,10 +3656,8 @@ crbug.com/618969 external/wpt/css/css-grid/subgrid/orthogonal-writing-mode-002.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/orthogonal-writing-mode-003.html [ Failure ] crbug.com/618969 external/wpt/css/css-grid/subgrid/orthogonal-writing-mode-004.html [ Failure ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-001.html [ Crash Failure ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html [ Crash Failure Timeout ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-003.html [ Crash Failure ] -crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-004.html [ Crash ] +crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-001.html [ Failure ] +crbug.com/618969 external/wpt/css/css-grid/subgrid/subgrid-baseline-002.html [ Failure ] # [css-animations] @@ -5515,19 +5514,6 @@ # Security OWP fixit week crbug.com/1270355 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/009.html [ Timeout ] -# Sheriff 2021-11-18 -crbug.com/1180993 [ Fuchsia ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Linux ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac10.13 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac10.15 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac11 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac11-arm64 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac12 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac12-arm64 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac13 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Mac13-arm64 ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] -crbug.com/1180993 [ Win ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass Timeout ] - # Sheriff 2021-11-19 crbug.com/1186771 [ Mac ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ] crbug.com/894077 [ Linux ] virtual/android/fullscreen/video-fixed-background.html [ Failure Pass ] @@ -6866,3 +6852,6 @@ # Fails on newer Ubuntu versions. crbug.com/1432272 [ Linux ] virtual/unsafe_webgpu/regress/regress-1104580.html [ Crash Pass ] + +# Sheriff 2023-04-12 +crbug.com/1432666 [ Mac ] external/wpt/mediacapture-record/passthrough/MediaRecorder-passthrough.https.html [ Failure Pass ] \ No newline at end of file
diff --git a/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-div-with-frame-expected.txt b/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-div-with-frame-expected.txt index c595eb4b..28035fde 100644 --- a/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-div-with-frame-expected.txt +++ b/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-div-with-frame-expected.txt
@@ -1,7 +1,7 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x200 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x200 LayoutNGBlockFlow {BODY} at (0,0) size 800x200 -layer at (0,0) size 800x0 +layer at (0,0) LayoutNGBlockFlow {DIV} at (0,0) size 800x0 (display-locked)
diff --git a/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-frame-expected.txt b/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-frame-expected.txt index ec8604b..dddf478 100644 --- a/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-frame-expected.txt +++ b/third_party/blink/web_tests/compositing/iframes/content-visibility-hidden-frame-expected.txt
@@ -1,7 +1,7 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x200 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x200 LayoutNGBlockFlow {BODY} at (0,0) size 800x200 -layer at (8,7) size 10x10 +layer at (8,7) LayoutIFrame (positioned) {IFRAME} at (8,7) size 10x10 (display-locked)
diff --git a/third_party/blink/web_tests/editing/input/emacs-ctrl-o-expected.txt b/third_party/blink/web_tests/editing/input/emacs-ctrl-o-expected.txt index e063a76..c18d9045 100644 --- a/third_party/blink/web_tests/editing/input/emacs-ctrl-o-expected.txt +++ b/third_party/blink/web_tests/editing/input/emacs-ctrl-o-expected.txt
@@ -2,9 +2,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x156
diff --git a/third_party/blink/web_tests/editing/pasteboard/emacs-cntl-y-001-expected.txt b/third_party/blink/web_tests/editing/pasteboard/emacs-cntl-y-001-expected.txt index c930ef7..2712bb19 100644 --- a/third_party/blink/web_tests/editing/pasteboard/emacs-cntl-y-001-expected.txt +++ b/third_party/blink/web_tests/editing/pasteboard/emacs-cntl-y-001-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x184 [border: (2px solid #0000FF)]
diff --git a/third_party/blink/web_tests/editing/pasteboard/emacs-ctrl-k-y-001-expected.txt b/third_party/blink/web_tests/editing/pasteboard/emacs-ctrl-k-y-001-expected.txt index ec56702..4cc194c 100644 --- a/third_party/blink/web_tests/editing/pasteboard/emacs-ctrl-k-y-001-expected.txt +++ b/third_party/blink/web_tests/editing/pasteboard/emacs-ctrl-k-y-001-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x212 [border: (2px solid #0000FF)]
diff --git a/third_party/blink/web_tests/external/wpt/attribution-reporting/resources/reports.py b/third_party/blink/web_tests/external/wpt/attribution-reporting/resources/reports.py index 432f5c6..4d4c3fd 100644 --- a/third_party/blink/web_tests/external/wpt/attribution-reporting/resources/reports.py +++ b/third_party/blink/web_tests/external/wpt/attribution-reporting/resources/reports.py
@@ -13,8 +13,6 @@ Status = Tuple[int, str] Response = Tuple[Status, List[Header], str] -CLEAR_STASH = isomorphic_encode("clear_stash") - def decode_headers(headers: dict) -> dict: """Decodes the headers from wptserve. @@ -40,14 +38,8 @@ """Handles POST request for reports. Retrieves the report from the request body and stores the report in the - stash. If clear_stash is specified in the query params, clears the stash. + stash. """ - if request.GET.get(CLEAR_STASH): - clear_stash(request.server.stash) - return (200, "OK"), headers, json.dumps({ - "code": 200, - "message": "Stash successfully cleared.", - }) store_report( request.server.stash, get_request_origin(request), { "body": request.body.decode("utf-8"), @@ -97,12 +89,6 @@ return reports -def clear_stash(stash: Stash) -> None: - "Clears the stash." - stash.take(REPORTS) - return None - - def handle_reports(request: Request) -> Response: """Handles request to get or store reports.""" headers = [("Content-Type", "application/json")]
diff --git a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js index 32924a8d..973c586 100644 --- a/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js +++ b/third_party/blink/web_tests/external/wpt/fledge/tentative/join-leave-ad-interest-group.https.sub.window.js
@@ -462,21 +462,21 @@ all: [3,4,5] } }, - // Interest group dictionaries must be less than 50 KiB (51200 bytes), so test - // that here by using a large name on an otherwise valid interest group + // Interest group dictionaries must be less than 1 MB (1048576 bytes), so + // test that here by using a large name on an otherwise valid interest group // dictionary. The first case is the largest name value that still results in // a valid dictionary, whereas the second test case produces a dictionary // that's one byte too large. { expectJoinSucces: true, expectLeaveSucces: true, interestGroup: { ...BASE_INTEREST_GROUP, - name: 'a'.repeat(51152) }, + name: 'a'.repeat(1048528) }, testCaseName: "Largest possible interest group dictionary", }, { expectJoinSucces: false, expectLeaveSucces: true, interestGroup: { ...BASE_INTEREST_GROUP, - name: 'a'.repeat(51153) }, + name: 'a'.repeat(1048529) }, testCaseName: "Oversized interest group dictionary", }, ];
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-bitrate.https-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-bitrate.https-expected.txt deleted file mode 100644 index 5097645..0000000 --- a/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-bitrate.https-expected.txt +++ /dev/null
@@ -1,21 +0,0 @@ -This is a testharness.js-based test. -PASS Passing no bitrate config results in defaults -PASS Passing bitsPerSecond:0 results in targets close to 0 -PASS Passing only audioBitsPerSecond:0 results in 0 for audio, default for video -PASS Passing only videoBitsPerSecond:0 results in 0 for video, default for audio -PASS Passing bitsPerSecond:0 overrides audio/video-specific values -PASS Passing bitsPerSecond overrides audio/video zero values -PASS Passing bitsPerSecond sets audio/video bitrate values -PASS Passing only audioBitsPerSecond results in default for video -PASS Passing only videoBitsPerSecond results in default for audio -PASS Passing videoBitsPerSecond for audio-only stream still results in something for video -PASS Passing audioBitsPerSecond for video-only stream still results in something for audio -PASS Passing bitsPerSecond for audio-only stream still results in something for video -PASS Passing bitsPerSecond for video-only stream still results in something for audio -PASS Selected default track bitrates are not changed by start() -PASS Passed-in track bitrates are not changed by start() -PASS Passing bitsPerSecond for audio/video stream does not change track bitrates in start() -FAIL Passing bitsPerSecond for audio stream sets video track bitrate to 0 in start() assert_approx_equals: expected 500000 +/- 100000 but got 128000 -FAIL Passing bitsPerSecond for video stream sets audio track bitrate to 0 in start() assert_equals: expected 0 but got 128000 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt b/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt deleted file mode 100644 index c7381df..0000000 --- a/third_party/blink/web_tests/external/wpt/mediacapture-record/MediaRecorder-start-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL MediaRecorder cannot record the stream using the current configuration assert_throws_dom: function "() => mediaRecorder.start()" did not throw -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-record/utils/peerconnection.js b/third_party/blink/web_tests/external/wpt/mediacapture-record/utils/peerconnection.js index 26a925ab..8b0f266 100644 --- a/third_party/blink/web_tests/external/wpt/mediacapture-record/utils/peerconnection.js +++ b/third_party/blink/web_tests/external/wpt/mediacapture-record/utils/peerconnection.js
@@ -13,9 +13,9 @@ * @param {!RTCPeerConnection} pc2 The second peer connection. */ async function exchangeOfferAnswer(pc1, pc2) { - await pc1.setLocalDescription(await pc1.createOffer()); + await pc1.setLocalDescription(); await pc2.setRemoteDescription(pc1.localDescription); - await pc2.setLocalDescription(await pc2.createAnswer()); + await pc2.setLocalDescription(); await pc1.setRemoteDescription(pc2.localDescription); }
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html index 676672a..004e1a75 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html index 41c3ca7..683875d 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-crossdocument-sameorigin.html
@@ -18,8 +18,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html index a467ecf9..60d1653a 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html index b9fa97f..ee01e7f 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html
@@ -28,8 +28,8 @@ assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, link.href, "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html index 566bea3d..eaa7b52 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html
@@ -16,8 +16,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, link.href, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html index 77a5873..cee7d95b9 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -23,8 +23,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, iframe.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html index 41ac1b0..d0dad46b 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-crossdocument-sameorigin.html
@@ -15,8 +15,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html index 1eda74e..156d1cb 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin-sameorigindomain.sub.html
@@ -23,8 +23,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html index 5679236a..6d73262d 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-crossorigin.html
@@ -21,8 +21,8 @@ assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html index a7e4181..6516a60 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/location-samedocument-sameorigin.html
@@ -15,8 +15,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html index ea9ea47..1c411d9 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -24,8 +24,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, url + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html index 478483e2..c9168934 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-crossdocument-sameorigin.html
@@ -15,8 +15,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "?foo", "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html index 324adb3..74a6cae 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin-sameorigindomain.sub.html
@@ -24,8 +24,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, url + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html index 23dceb0..9b31744 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-crossorigin.html
@@ -22,8 +22,8 @@ assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, iframe.src + "#foo", "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html index 9ca85318..c357072 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/open-samedocument-sameorigin.html
@@ -15,8 +15,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, i.src + "#foo", "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html index f6110346..ffdaac7 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html index 05347335..b54a5a44 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-crossdocument-sameorigin.html
@@ -16,8 +16,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_false(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html index 9e64a01..e9ab1724 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin-sameorigindomain.sub.html
@@ -30,8 +30,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html index e53a1f9..69b12f2 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-crossorigin.html
@@ -28,8 +28,8 @@ assert_equals(e.data.formData, null, "formData"); assert_equals(e.data.destination.url, form.action, "destination.url"); assert_true(e.data.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.data.destination.key, null, "destination.key"); - assert_equals(e.data.destination.id, null, "destination.id"); + assert_equals(e.data.destination.key, "", "destination.key"); + assert_equals(e.data.destination.id, "", "destination.id"); assert_equals(e.data.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html index 43aa3226..8a0e1f1 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/cross-window/submit-samedocument-sameorigin.html
@@ -16,8 +16,8 @@ assert_equals(e.formData, null, "formData"); assert_equals(e.destination.url, form.action, "destination.url"); assert_true(e.destination.sameDocument, "destination.sameDocument"); - assert_equals(e.destination.key, null, "destination.key"); - assert_equals(e.destination.id, null, "destination.id"); + assert_equals(e.destination.key, "", "destination.key"); + assert_equals(e.destination.id, "", "destination.id"); assert_equals(e.destination.index, -1, "destination.index"); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-cross-origin.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-cross-origin.html index d8f2e383..ee09924 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-cross-origin.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-cross-origin.html
@@ -14,8 +14,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, "https://does-not-exist/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html index 90a612b..b9506984 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download-userInitiated.html
@@ -18,8 +18,8 @@ assert_equals(e.formData, null); assert_equals(new URL(e.destination.url).search, "?1"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download.html index c5ca306..05fb0ec 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-download.html
@@ -22,8 +22,8 @@ assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-fragment.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-fragment.html index b7706b7d..51221eb 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-fragment.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-fragment.html
@@ -14,8 +14,8 @@ assert_equals(e.formData, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html index b8e925a..68f5bf0 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-same-origin-cross-document.html
@@ -15,8 +15,8 @@ assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-userInitiated.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-userInitiated.html index b746bbe3..39192c9 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-userInitiated.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-userInitiated.html
@@ -17,8 +17,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); t.step_timeout(t.step_func_done(() => assert_equals(location.hash, "")), 0);
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-with-target.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-with-target.html index c2053a37..6407b963 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-with-target.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-anchor-with-target.html
@@ -20,8 +20,8 @@ assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.preventDefault(); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-after-detach.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-after-detach.html new file mode 100644 index 0000000..1dcb6ca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-after-detach.html
@@ -0,0 +1,33 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<iframe id="i" src="/common/blank.html"></iframe> +<script> +promise_test(async t => { + // Wait for after the load event so that the navigation doesn't get converted + // into a replace navigation. + await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0)); + + let destination_key = i.contentWindow.navigation.currentEntry.key; + let destination_id = i.contentWindow.navigation.currentEntry.id; + let destination_index = i.contentWindow.navigation.currentEntry.index; + await i.contentWindow.navigation.navigate("#1").finished; + + let back_destination; + i.contentWindow.navigation.onnavigate = e => back_destination = e.destination; + await i.contentWindow.navigation.back().finished; + + // Before detach, key/id/index are valid. + assert_equals(back_destination.key, destination_key); + assert_equals(back_destination.id, destination_id); + assert_equals(back_destination.index, destination_index); + + i.remove(); + + // After detach, key/id/index are invalid, but the url is still valid. + assert_equals(back_destination.key, ""); + assert_equals(back_destination.id, ""); + assert_equals(new URL(back_destination.url).pathname, "/common/blank.html"); + assert_equals(back_destination.index, -1); +}, "navigate event destination after iframe detach"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-dynamic-index.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-dynamic-index.html new file mode 100644 index 0000000..2e0f1ea --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-dynamic-index.html
@@ -0,0 +1,34 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="../navigation-methods/return-value/resources/helpers.js"></script> +<script> +promise_test(async t => { + // Wait for after the load event so that the navigation doesn't get converted + // into a replace navigation. + await new Promise(resolve => window.onload = () => t.step_timeout(resolve, 0)); + await navigation.navigate("#1").finished; + + let back_destination; + navigation.addEventListener("navigate", t.step_func(e => { + back_destination = e.destination; + assert_equals(back_destination.index, 0); + }), { once: true }); + await navigation.back().finished; + + // Disposing the destination entry of back_destination should update + // back_destination.index, even though back_destination's navigation has + // completed. + await navigation.navigate("#clobber_back", { history: "replace" }).finished; + assert_equals(back_destination.index, -1); + + navigation.addEventListener("navigate", t.step_func(e => { + assert_equals(e.destination.index, 1); + + // Dispose the destination entry and destination.index should update. + navigation.navigate("#clobber_forward"); + assert_equals(e.destination.index, -1); + }), { once: true }); + await assertBothRejectDOM(t, navigation.forward(), "AbortError"); +}, "navigate event destination.index should be dynamic"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-back-forward.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-back-forward.html index c118aa7a..c8b1043 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-back-forward.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-back-forward.html
@@ -16,8 +16,8 @@ assert_not_equals(e.destination, null); assert_not_equals(e.destination.getState(), undefined); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); }); navigation.back();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-navigate.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-navigate.html index 9c34c575..5dac40d 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-navigate.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-navigate.html
@@ -13,8 +13,8 @@ assert_not_equals(e.destination.getState(), undefined); assert_equals(e.destination.getState().statevar, "state"); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); }); navigation.navigate("#foo", { state: navState });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-reload.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-reload.html index b3afb72..a180e08 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-reload.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-destination-getState-reload.html
@@ -13,8 +13,8 @@ assert_not_equals(e.destination.getState(), undefined); assert_equals(e.destination.getState().statevar, "state"); assert_not_equals(e.destination.getState(), e.destination.getState()); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); e.intercept(); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-get.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-get.html index 69a49eb..87a102dd 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-get.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-get.html
@@ -15,8 +15,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href + "?"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); // Because it's a GET, not a POST
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-userInitiated.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-userInitiated.html index 454f077..40c5905 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-userInitiated.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-userInitiated.html
@@ -20,8 +20,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-with-target.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-with-target.html index b23ab3a7..f6fe05c 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-with-target.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form-with-target.html
@@ -18,8 +18,8 @@ assert_equals(new URL(e.destination.url).pathname, "/navigation-api/navigate-event/foo.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form.html index b537a9b5..c57d72c 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-form.html
@@ -15,8 +15,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_not_equals(e.formData, null); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-go-0.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-go-0.html index 96d98cf..b1f4142 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-go-0.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-go-0.html
@@ -14,8 +14,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).pathname, "/common/blank.html"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-pushState.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-pushState.html index 2f8c81c..266309a 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-pushState.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-pushState.html
@@ -13,8 +13,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-replaceState.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-replaceState.html index d8417fbf..ea6d3df 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-replaceState.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-history-replaceState.html
@@ -13,8 +13,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-iframe-location.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-iframe-location.html index 059b995..25d5147 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-iframe-location.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-iframe-location.html
@@ -17,8 +17,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-location.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-location.html index c5aa0be..a4d0c607 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-location.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-location.html
@@ -13,8 +13,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-meta-refresh.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-meta-refresh.html index 1f8ed30..9fa59b2 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-meta-refresh.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-meta-refresh.html
@@ -16,8 +16,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, i.contentWindow.location.href); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-navigation-navigate.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-navigation-navigate.html index 76f98c72..ffc8ea8 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-navigation-navigate.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-navigation-navigate.html
@@ -12,8 +12,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#foo"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); });
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-to-srcdoc.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-to-srcdoc.html index 26ad135..8bbb66a 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-to-srcdoc.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-to-srcdoc.html
@@ -17,8 +17,8 @@ assert_equals(e.downloadRequest, null); assert_equals(e.destination.url, "about:srcdoc"); assert_false(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open-self.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open-self.html index 274c8bc..a6e443f 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open-self.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open-self.html
@@ -12,8 +12,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open.html b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open.html index afc99827..1fe2402 100644 --- a/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open.html +++ b/third_party/blink/web_tests/external/wpt/navigation-api/navigate-event/navigate-window-open.html
@@ -17,8 +17,8 @@ assert_equals(e.downloadRequest, null); assert_equals(new URL(e.destination.url).hash, "#1"); assert_true(e.destination.sameDocument); - assert_equals(e.destination.key, null); - assert_equals(e.destination.id, null); + assert_equals(e.destination.key, ""); + assert_equals(e.destination.id, ""); assert_equals(e.destination.index, -1); assert_equals(e.formData, null); e.preventDefault();
diff --git a/third_party/blink/web_tests/external/wpt/page-visibility/resources/window_state_context.js b/third_party/blink/web_tests/external/wpt/page-visibility/resources/window_state_context.js index 40f10a5..fa96bf3b 100644 --- a/third_party/blink/web_tests/external/wpt/page-visibility/resources/window_state_context.js +++ b/third_party/blink/web_tests/external/wpt/page-visibility/resources/window_state_context.js
@@ -15,5 +15,23 @@ rect = await test_driver.minimize_window(); } - return {minimize, restore}; + function visibilityEventPromise() { + return new Promise(resolve => new PerformanceObserver( + (entries, observer) => { observer.disconnect(); resolve(); }).observe( + {type: "visibility-state"})) + } + + async function minimizeAndWait() { + const promise = visibilityEventPromise(); + await Promise.all([minimize(), promise]); + await new Promise(resolve => t.step_timeout(resolve, 0)); + } + + async function restoreAndWait() { + const promise = visibilityEventPromise(); + await Promise.all([restore(), promise]); + await new Promise(resolve => t.step_timeout(resolve, 0)); + } + + return {minimize, restore, minimizeAndWait, restoreAndWait}; }
diff --git a/third_party/blink/web_tests/external/wpt/page-visibility/visibility-state-entry.tentative.html b/third_party/blink/web_tests/external/wpt/page-visibility/visibility-state-entry.tentative.html index c62b6c58..0dbe634 100644 --- a/third_party/blink/web_tests/external/wpt/page-visibility/visibility-state-entry.tentative.html +++ b/third_party/blink/web_tests/external/wpt/page-visibility/visibility-state-entry.tentative.html
@@ -1,6 +1,6 @@ <!DOCTYPE HTML> <title>Test VisibleStateEntry</title> -<link rel="author" title="Noam Rosenthal" href="mailto:noam@chromium.org"> +<link rel="author" title="Noam Rosenthal" href="mailto:nrosenthal@chromium.org"> <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#page-visibility"> <meta name="timeout" content="long"> <script src="/resources/testharness.js"></script> @@ -15,68 +15,56 @@ }); promise_test(async t => { - const {minimize, restore} = window_state_context(t); + const {minimizeAndWait, restoreAndWait} = window_state_context(t); + const all = performance.getEntries(); let entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 1); assert_equals(entries[0].name, "visible"); assert_equals(entries[0].startTime, 0); assert_equals(entries[0].duration, 0); - await minimize(); + await minimizeAndWait(); entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 2); assert_equals(entries[1].name, "hidden"); assert_equals(entries[1].duration, 0); - await restore(); + await restoreAndWait(); + entries = performance.getEntriesByType("visibility-state"); assert_equals(entries.length, 3); assert_equals(entries[2].name, "visible"); assert_equals(entries[2].duration, 0); }, "Hiding/showing the page should create visibility-state entries"); promise_test(async t => { - const {minimize, restore} = window_state_context(t); - await minimize(); - const popup = window.open("resources/blank_page_green.html"); - t.add_cleanup(() => popup.close()); - await restore(); - let entries = popup.performance.getEntriesByType("visibility-state"); - assert_equals(entries.length, 2); + const {minimizeAndWait} = window_state_context(t); + await minimizeAndWait(); + const iframe = document.createElement("iframe"); + iframe.src = "resources/blank_page_green.html"; + const loaded = new Promise(resolve => iframe.addEventListener("load", resolve)); + t.add_cleanup(() => iframe.remove()); + document.body.appendChild(iframe); + await loaded; + const entries = iframe.contentWindow.performance.getEntriesByType("visibility-state"); assert_equals(entries[0].name, "hidden"); assert_equals(entries[0].startTime, 0); - assert_equals(entries[1].name, "visible"); - assert_greater_than(entries[1].startTime, 0); - }, "If a page starts as hidden, the first visibility-state entry should be hidden"); promise_test(async t => { const {minimize, restore} = window_state_context(t); - await minimize(); const observed = new Promise(resolve => new PerformanceObserver(list => { - const entries = list.getEntries(); - assert_equals(entries.length, 1); - assert_equals(entries[0].name, "visible"); - assert_greater_than(entries[0].startTime, 0); - assert_equals(entries[0].duration, 0); + if (list.getEntries()[0].name === "visible") resolve(); - }).observe({entryTypes: ['visibility-state'], buffered: true})); + }).observe({entryTypes: ['visibility-state']})); + await minimize(); await restore(); await observed; }, "Visibility state entries should be queued to performance observers"); promise_test(async t => { - const {minimize, restore} = window_state_context(t); - await minimize(); - await restore(); - await new Promise(resolve => new PerformanceObserver(list => { - const entries = list.getEntries(); - assert_equals(entries.length, 3); - assert_equals(entries[0].name, "visible"); - assert_equals(entries[0].startTime, 0); - assert_equals(entries[0].duration, 0); - assert_equals(entries[1].name, "hidden"); - assert_equals(entries[1].duration, 0); - assert_equals(entries[2].name, "visible"); - assert_equals(entries[2].duration, 0); - resolve(); - }).observe({entryTypes: ['visibility-state'], buffered: true})); -}, "Visibility state entries should respect the buffered flag"); + const entry = await new Promise(resolve => new PerformanceObserver( + (list, observer) => { + observer.disconnect(); + resolve(list.getEntries()[0]); + }).observe({type: "visibility-state", buffered: true})); + assert_equals(entry.name, "visible"); +}, "Visibility state observers should respect the buffered flag"); </script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html index f44a6828..375489c 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-duration-auto.tentative.html
@@ -13,7 +13,7 @@ width: 100px; height: 100px; } - #scroller > div { + #scroller > #content { height: 200px; width: 200px; } @@ -36,9 +36,9 @@ </style> <main> <div id=scroller> - <div></div> + <div id=content></div> + <div id=element></div> </div> - <div id=element></div> </main> <script> promise_test(async (t) => {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html index 7e5b6607..05fab3e4 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-print.html
@@ -41,8 +41,8 @@ <div id="scroller"> <div id="contents"></div> + <div id="box"></div> </div> -<div id="box"></div> <script> window.addEventListener('load', function() {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html index 9074f24..d2f2d8f 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/printing/scroll-timeline-specified-scroller-ref.html
@@ -23,8 +23,8 @@ <div id="scroller"> <div id="contents"></div> + <div id="box"></div> </div> -<div id="box"></div> <script> window.addEventListener('load', function() {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html index 2e910cb..3f1aeed 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/progress-based-animation-timeline.html
@@ -28,6 +28,7 @@ animation-duration: 10s; animation-timing-function: linear; animation-timeline: top_timeline; + position: absolute; } /* Ensure stable expectations if feature is not supported */ @supports not (animation-timeline:foo) { @@ -35,8 +36,10 @@ } </style> <main> - <div id=scroller1><div></div></div> - <div id=element></div> + <div id=scroller1> + <div></div> + <div id=element></div> + </div> </main> <script> window.onload = async () => {
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html index 37b4dfd..958ce496 100644 --- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html +++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/scroll-timeline-axis-writing-mode.html
@@ -41,15 +41,16 @@ scroll-timeline: timeline_inline_in_vertical inline; writing-mode: vertical-lr; } - #container > div { + .target { width: 0px; animation-name: expand; animation-duration: 10s; animation-timing-function: linear; + position: absolute; } /* Ensure stable expectations if feature is not supported */ @supports not (animation-timeline:foo) { - #container > div { animation-play-state: paused; } + .target { animation-play-state: paused; } } #element_initial_axis { animation-timeline: timeline_initial_axis; } #element_vertical { animation-timeline: timeline_vertical; } @@ -59,21 +60,33 @@ #element_block_in_vertical { animation-timeline: timeline_block_in_vertical; } #element_inline_in_vertical { animation-timeline: timeline_inline_in_vertical; } </style> -<div class=scroller id=timeline_initial_axis><div class=contents></div></div> -<div class=scroller id=timeline_vertical><div class=contents></div></div> -<div class=scroller id=timeline_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_block_in_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_inline_in_horizontal><div class=contents></div></div> -<div class=scroller id=timeline_block_in_vertical><div class=contents></div></div> -<div class=scroller id=timeline_inline_in_vertical><div class=contents></div></div> -<div id=container> - <div id=element_initial_axis></div> - <div id=element_vertical></div> - <div id=element_horizontal></div> - <div id=element_block_in_horizontal></div> - <div id=element_inline_in_horizontal></div> - <div id=element_block_in_vertical></div> - <div id=element_inline_in_vertical></div> +<div class=scroller id=timeline_initial_axis> + <div class=contents></div> + <div class=target id=element_initial_axis></div> +</div> +<div class=scroller id=timeline_vertical> + <div class=contents></div> + <div class=target id=element_vertical></div> +</div> +<div class=scroller id=timeline_horizontal> + <div class=contents></div> + <div class=target id=element_horizontal></div> +</div> +<div class=scroller id=timeline_block_in_horizontal> + <div class=contents></div> + <div class=target id=element_block_in_horizontal></div> +</div> +<div class=scroller id=timeline_inline_in_horizontal> + <div class=contents></div> + <div class=target id=element_inline_in_horizontal></div> +</div> +<div class=scroller id=timeline_block_in_vertical> + <div class=contents></div> + <div class=target id=element_block_in_vertical></div> +</div> +<div class=scroller id=timeline_inline_in_vertical> + <div class=contents></div> + <div class=target id=element_inline_in_vertical></div> </div> <script> // Animations linked to vertical scroll-timelines are at 75% progress.
diff --git a/third_party/blink/web_tests/fast/mediarecorder/MediaRecorder-bitrates.html b/third_party/blink/web_tests/fast/mediarecorder/MediaRecorder-bitrates.html index 3014a967..2fc94e9 100644 --- a/third_party/blink/web_tests/fast/mediarecorder/MediaRecorder-bitrates.html +++ b/third_party/blink/web_tests/fast/mediarecorder/MediaRecorder-bitrates.html
@@ -45,8 +45,10 @@ { video : kOkVideoBps, audio : kDefaultAudioBitRate }); const kOkAudioBps = 10000; -const kMinAudioBps = 5000; // https://www.opus-codec.org/ -const kMaxAudioBps = 128000; +// Boundaries of Opus SILK bitrate from https://www.opus-codec.org/. +const kMinAudioBps = 5000; +const kMaxAudioBps = 510000; + // Note that unspecified video bitrates are not clamped to a minimum. makeExpectedBitrateAsyncTest({ audioBitsPerSecond : kOkAudioBps }, 'Audio bitrate OK',
diff --git a/third_party/blink/web_tests/fast/overflow/transformed-frame-scrollIntoView-expected.txt b/third_party/blink/web_tests/fast/overflow/transformed-frame-scrollIntoView-expected.txt index e216a12..b513188 100644 --- a/third_party/blink/web_tests/fast/overflow/transformed-frame-scrollIntoView-expected.txt +++ b/third_party/blink/web_tests/fast/overflow/transformed-frame-scrollIntoView-expected.txt
@@ -1,18 +1,18 @@ -layer at (0,0) size 800x600 scrollY 200.00 scrollHeight 2016 - LayoutView at (0,0) size 800x600 -layer at (0,-200) size 800x2016 backgroundClip at (0,0) size 800x600 clip at (0,0) size 800x600 +layer at (0,0) scrollY 200.00 scrollHeight 2016 + LayoutNGView at (0,0) size 800x600 +layer at (0,-200) LayoutNGBlockFlow {HTML} at (0,0) size 800x2016 LayoutNGBlockFlow {BODY} at (8,8) size 784x2000 LayoutNGBlockFlow {DIV} at (0,0) size 784x2000 -layer at (0,0) size 300x200 hasTransform +layer at (0,0) hasTransform LayoutIFrame (positioned) {IFRAME} at (0,400) size 300x200 - layer at (0,0) size 300x200 scrollY 50.00 scrollHeight 1016 - LayoutView at (0,0) size 300x200 - layer at (0,-50) size 300x1016 backgroundClip at (0,0) size 300x200 clip at (0,0) size 300x200 + layer at (0,0) scrollY 50.00 scrollHeight 1016 + LayoutNGView at (0,0) size 300x200 + layer at (0,-50) LayoutNGBlockFlow {HTML} at (0,0) size 300x1016 LayoutNGBlockFlow {BODY} at (8,8) size 284x1000 LayoutNGBlockFlow {DIV} at (0,0) size 284x1000 - layer at (0,100) size 100x100 + layer at (0,100) LayoutNGBlockFlow (positioned) {DIV} at (0,150) size 100x100 [bgcolor=#008000] scrolled to 0,200 frame '<!--framePath //<!--frame0-->-->' scrolled to 0,50
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/editing/caret/caret-color-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/editing/caret/caret-color-expected.txt index 85b49831..f3b6915 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/editing/caret/caret-color-expected.txt +++ b/third_party/blink/web_tests/flag-specific/highdpi/editing/caret/caret-color-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 1200x900 - LayoutView at (0,0) size 1200x900 -layer at (0,0) size 1200x900 +layer at (0,0) + LayoutNGView at (0,0) size 1200x900 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1200x900 LayoutNGBlockFlow {BODY} at (12,12) size 1176x876 LayoutNGBlockFlow {P} at (0,0) size 1176x54
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/editing/inserting/insert-space-in-empty-doc-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/editing/inserting/insert-space-in-empty-doc-expected.txt index 15305a25..40747a5 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/editing/inserting/insert-space-in-empty-doc-expected.txt +++ b/third_party/blink/web_tests/flag-specific/highdpi/editing/inserting/insert-space-in-empty-doc-expected.txt
@@ -7,9 +7,9 @@ EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 1200x900 - LayoutView at (0,0) size 1200x900 -layer at (0,0) size 1200x900 +layer at (0,0) + LayoutNGView at (0,0) size 1200x900 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1200x900 LayoutNGBlockFlow {BODY} at (12,12) size 1176x876 LayoutNGBlockFlow {DIV} at (0,0) size 1176x84 [border: (3px solid #FF0000)]
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/selection-background-expected.txt b/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/selection-background-expected.txt index 109aad9..4ea69e14 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/selection-background-expected.txt +++ b/third_party/blink/web_tests/flag-specific/highdpi/editing/selection/selection-background-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 1200x900 - LayoutView at (0,0) size 1200x900 -layer at (0,0) size 1200x900 +layer at (0,0) + LayoutNGView at (0,0) size 1200x900 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1200x900 LayoutNGBlockFlow {BODY} at (12,12) size 1176x876 LayoutNGBlockFlow {P} at (0,0) size 1176x54
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css-expected.txt deleted file mode 100644 index b5880c2..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -Tests how SourceFormatter handles CSS sources - -Formatted: -@media screen { - html { - color: green; - foo-property: bar-value - } -} -} - -body { - background-color: black; -} - -Location mapping with formatted source: -Mapped locations: -0:15 -> 0:14 -> 0:15 -0:22 -> 1:9 -> 0:22 -0:65 -> 8:5 -> 0:65 -Live locations (updated: 3): -0:14 -1:9 -8:5 -Location mapping without formatted source: -Mapped locations: -0:15 -> 0:15 -> 0:15 -0:22 -> 0:22 -> 0:22 -0:65 -> 0:65 -> 0:65 -Live locations (updated: 6): -0:15 -0:22 -0:65 -
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css.js b/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css.js deleted file mode 100644 index a66aaf25..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-css.js +++ /dev/null
@@ -1,59 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function() { - TestRunner.addResult(`Tests how SourceFormatter handles CSS sources\n`); - await TestRunner.loadLegacyModule('sources'); await TestRunner.loadTestModule('sources_test_runner'); - await TestRunner.showPanel('sources'); - await TestRunner.addStylesheetTag('resources/style-formatter-obfuscated.css'); - - var uiSourceCode = await TestRunner.waitForUISourceCode('style-formatter-obfuscated.css'); - var formatData = await Formatter.SourceFormatter.instance().format(uiSourceCode); - var targetContent = (await formatData.formattedSourceCode.requestContent()).content; - - TestRunner.addResult(`Formatted:\n${targetContent}`); - - var originalContent = (await uiSourceCode.requestContent()).content; - var styleHeader = Bindings.cssWorkspaceBinding.uiLocationToRawLocations(uiSourceCode.uiLocation(0, 0))[0].header(); - var text = new TextUtils.Text(originalContent); - var liveLocationsPool = new Bindings.LiveLocationPool(); - var locationUpdateCount = 0; - var rawLocations = []; - var liveLocations = []; - for (var offset = originalContent.indexOf('{'); offset >= 0; offset = originalContent.indexOf('{', offset + 1)) { - var position = text.positionFromOffset(offset); - var rawLocation = new SDK.CSSLocation(styleHeader, position.lineNumber, position.columnNumber); - rawLocations.push(rawLocation); - liveLocations.push(await Bindings.cssWorkspaceBinding.createLiveLocation(rawLocation, () => { - locationUpdateCount++; - }, liveLocationsPool)); - } - - TestRunner.addResult('Location mapping with formatted source:'); - await dumpLocations(); - - await Formatter.SourceFormatter.instance().discardFormattedUISourceCode(formatData.formattedSourceCode); - - TestRunner.addResult('Location mapping without formatted source:'); - await dumpLocations(); - - TestRunner.completeTest(); - - async function dumpLocations() { - TestRunner.addResult('Mapped locations:'); - for (var rawLocation of rawLocations) { - var uiLocation = Bindings.cssWorkspaceBinding.rawLocationToUILocation(rawLocation); - var reverseRawLocation = Bindings.cssWorkspaceBinding.uiLocationToRawLocations(uiLocation)[0]; - TestRunner.addResult( - `${rawLocation.lineNumber}:${rawLocation.columnNumber} -> ${uiLocation.lineNumber}:${ - uiLocation.columnNumber} ` + - `-> ${reverseRawLocation.lineNumber}:${reverseRawLocation.columnNumber}`); - } - TestRunner.addResult(`Live locations (updated: ${locationUpdateCount}):`); - for (var liveLocation of liveLocations) { - var uiLocation = await liveLocation.uiLocation(); - TestRunner.addResult(`${uiLocation.lineNumber}:${uiLocation.columnNumber}`); - } - } -})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js-expected.txt deleted file mode 100644 index 3bf673b..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js-expected.txt +++ /dev/null
@@ -1,101 +0,0 @@ -Tests how SourceFormatter handles JS sources - -Formatted: -function formatted1() { - var variable1 = 0; -} - -function withComments() { - // comment - return "functionWithComments"; -} - -try { - onmessage = function(event) { - var source = event.data; - var formattedSource = beautify(source); - var mapping = buildMapping(source, formattedSource); - postMessage({ - formattedSource: formattedSource, - mapping: mapping - }) - } - ; - function beautify(source) { - var ast = parse.parse(source); - var beautifyOptions = { - indent_level: 4, - indent_start: 0, - quote_keys: false, - space_colon: false - }; - return process.gen_code(ast, beautifyOptions) - } - function buildMapping(source, formattedSource) { - var mapping = { - original: [], - formatted: [] - }; - var lastPosition = 0; - var regexp = /(^|[^\\])\b((?=\D)[\$\.\w]+)\b/g; - while (true) { - var match = regexp.exec(formattedSource); - if (!match) - break; - var position = source.indexOf(match[2], lastPosition); - if (position === -1) - throw "No match found in original source for " + match[2]; - mapping.original.push(position); - mapping.formatted.push(match.index + match[1].length); - lastPosition = position + match[2].length - } - return mapping - } - function require() { - return parse - } - var exports = {}; - importScripts("UglifyJS/parse-js.js"); - var parse = exports; - var exports = {}; - importScripts("UglifyJS/process.js"); - var process = exports; -} catch (e) {} - -function formatted2() { - var variable2 = 0; -} - -Location mapping with formatted source: -1:0 -> 0:22 -> 1:0 -6:0 -> 4:24 -> 6:0 -11:3 -> 9:4 -> 11:3 -11:29 -> 10:32 -> 11:29 -11:150 -> 14:20 -> 11:150 -11:227 -> 20:30 -> 11:227 -12:0 -> 22:30 -> 12:0 -12:157 -> 30:51 -> 12:157 -12:170 -> 31:22 -> 12:170 -13:0 -> 37:21 -> 13:0 -14:71 -> 50:23 -> 14:71 -14:97 -> 53:18 -> 14:97 -14:168 -> 56:18 -> 14:168 -14:237 -> 59:12 -> 14:237 -17:0 -> 61:22 -> 17:0 -Location mapping without formatted source: -1:0 -> 1:0 -> 1:0 -6:0 -> 6:0 -> 6:0 -11:3 -> 11:3 -> 11:3 -11:29 -> 11:29 -> 11:29 -11:150 -> 11:150 -> 11:150 -11:227 -> 11:227 -> 11:227 -12:0 -> 12:0 -> 12:0 -12:157 -> 12:157 -> 12:157 -12:170 -> 12:170 -> 12:170 -13:0 -> 13:0 -> 13:0 -14:71 -> 14:71 -> 14:71 -14:97 -> 14:97 -> 14:97 -14:168 -> 14:168 -> 14:168 -14:237 -> 14:237 -> 14:237 -17:0 -> 17:0 -> 17:0 -
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js.js b/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js.js deleted file mode 100644 index fd7d547..0000000 --- a/third_party/blink/web_tests/http/tests/devtools/sources/formatter-js.js +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function() { - TestRunner.addResult(`Tests how SourceFormatter handles JS sources\n`); - await TestRunner.loadLegacyModule('sources'); await TestRunner.loadTestModule('sources_test_runner'); - await TestRunner.showPanel('sources'); - await TestRunner.addScriptTag('debugger/resources/obfuscated.js'); - - var uiSourceCode = await TestRunner.waitForUISourceCode('obfuscated.js'); - var formatData = await Formatter.SourceFormatter.instance().format(uiSourceCode); - var targetContent = (await formatData.formattedSourceCode.requestContent()).content; - - TestRunner.addResult(`Formatted:\n${targetContent}`); - - var originalContent = (await uiSourceCode.requestContent()).content; - var text = new TextUtils.Text(originalContent); - var positions = []; - for (var offset = originalContent.indexOf('{'); offset >= 0; offset = originalContent.indexOf('{', offset + 1)) - positions.push(text.positionFromOffset(offset)); - var script = (await Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, 0, 0))[0].script(); - - TestRunner.addResult('Location mapping with formatted source:'); - await dumpLocations(positions); - - await Formatter.SourceFormatter.instance().discardFormattedUISourceCode(formatData.formattedSourceCode); - - TestRunner.addResult('Location mapping without formatted source:'); - await dumpLocations(positions); - - TestRunner.completeTest(); - - async function dumpLocations(positions) { - for (var position of positions) { - var rawLocation = TestRunner.debuggerModel.createRawLocation(script, position.lineNumber, position.columnNumber); - var uiLocation = await Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(rawLocation); - var reverseRawLocation = (await Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations( - uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber))[0]; - TestRunner.addResult( - `${rawLocation.lineNumber}:${rawLocation.columnNumber} -> ${uiLocation.lineNumber}:${ - uiLocation.columnNumber}` + - ` -> ${reverseRawLocation.lineNumber}:${reverseRawLocation.columnNumber}`); - } - } -})();
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations-expected.txt b/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations-expected.txt index adf4c76..2ab3570 100644 --- a/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations-expected.txt +++ b/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations-expected.txt
@@ -32,50 +32,3 @@ uiLocation 15:0 resolves to: 15:0 (script) uiLocation 16:0 resolves to: 16:0 (script) - -Formatting source now... - - -Formatted Content: -<!DOCTYPE html> -<html> - <head> - <meta charset="utf-8"> - <title>Website</title> - </head> - <body> - <style> - body { - --var-1: one; - } - </style> - Hello World - <script> - function firstFunction() {} - </script> - <style> - body { - --var-2: two; - } - </style> - <script> - function secondFunction() {} - </script> - </body> -</html> - -Scanning 27 lines for css locations. Note that location line/column numbers are zero-based. -uiLocation 8:0 resolves to: 8:0 (css) -uiLocation 9:0 resolves to: 9:0 (css) -uiLocation 10:0 resolves to: 10:0 (css) -uiLocation 11:0 resolves to: 11:0 (css) -uiLocation 17:0 resolves to: 17:11 (css) -uiLocation 18:0 resolves to: 17:17 (css) -uiLocation 19:0 resolves to: 17:30 (css) -uiLocation 20:0 resolves to: 17:32 (css) -Scanning 27 lines for script locations. Note that location line/column numbers are zero-based. -uiLocation 14:0 resolves to: 14:0 (script) -uiLocation 15:0 resolves to: 16:0 (script) -uiLocation 22:0 resolves to: 17:48 (script) -uiLocation 23:0 resolves to: 17:77 (script) -
diff --git a/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations.js b/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations.js index 9b870adf..785ce0f 100644 --- a/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations.js +++ b/third_party/blink/web_tests/http/tests/devtools/sources/inline-styles-scripts-locations.js
@@ -16,17 +16,6 @@ await dumpLocations("css", sourceText.lineCount(), source); await dumpLocations("script", sourceText.lineCount(), source); - TestRunner.addResult("\n\nFormatting source now...\n\n"); - - const formatData = await Formatter.SourceFormatter.instance().format(source); - const formattedSource = formatData.formattedSourceCode; - var formattedContent = (await formatData.formattedSourceCode.requestContent()).content; - TestRunner.addResult(`Formatted Content:\n${formattedContent}`); - const formattedSourceText = new TextUtils.Text(formattedContent); - await dumpLocations("css", formattedSourceText.lineCount(), formattedSource); - await dumpLocations("script", formattedSourceText.lineCount(), formattedSource); - - async function dumpLocations(type, lineCount, source) { TestRunner.addResult(`Scanning ${lineCount} lines for ${type} locations. Note that location line/column numbers are zero-based.`); for (let line = 0; line < lineCount; ++line) {
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-auto-attach.js b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-auto-attach.js index 004d0ee3..7bbca8fb 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-auto-attach.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-auto-attach.js
@@ -15,7 +15,9 @@ testRunner.log('detached OOPIF'); attachedToTargetPromise = dp.Target.onceAttachedToTarget(); - await session.evaluate('window.history.back()'); + // Intentionally ignore evaluation errors - since we are navigating, we might + // get the "Inspected target navigated or closed" error response. + await dp.Runtime.evaluate({expression: 'window.history.back()'}); targetInfo = (await attachedToTargetPromise).params.targetInfo; testRunner.log('OOPIF attached after BFCache navigation: ' + targetInfo.url);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-request-basic.js b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-request-basic.js index 69c1d2e8..372f50f 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-request-basic.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/bfcache/bfcache-request-basic.js
@@ -22,11 +22,13 @@ testRunner.fail(`request for ${request.params.documentURL} will be sent`); }); dp.Network.onceResponseReceived().then(response => { - testRunner.fail(`response for ${request.params.documentURL} was received`); + testRunner.fail(`response for ${response.params.response.url} was received`); }); // Navigate back - should use back-forward cache. - session.evaluate('window.history.back()'); + // Intentionally ignore evaluation errors - since we are navigating, we might + // get the "Inspected target navigated or closed" error response. + await dp.Runtime.evaluate({expression: 'window.history.back()'}); const frameNavigated = await dp.Page.onceFrameNavigated(); testRunner.log(frameNavigated.params.type); testRunner.completeTest();
diff --git a/third_party/blink/web_tests/platform/linux/editing/caret/caret-color-expected.txt b/third_party/blink/web_tests/platform/linux/editing/caret/caret-color-expected.txt index 207f1ce..faceb1e 100644 --- a/third_party/blink/web_tests/platform/linux/editing/caret/caret-color-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/caret/caret-color-expected.txt
@@ -1,16 +1,16 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 735x39 text run at (0,0) width 735: "This tests to make sure that the caret is visible in the black background by getting the caret color from the color of the" text run at (0,20) width 621: "element(span) containing the text, not the parent element(div) that has the contentEditable attribute." - LayoutBlockFlow {DIV} at (0,56) size 784x56 [border: (2px solid #FF0000)] + LayoutNGBlockFlow {DIV} at (0,56) size 784x56 [border: (2px solid #FF0000)] LayoutInline {SPAN} at (14,14) size 189x27 [color=#FFFFFF] [bgcolor=#000000] LayoutText {#text} at (14,14) size 189x27 text run at (14,14) width 189: "Where is my caret?"
diff --git a/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.txt b/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.txt index 081268e..66566f72 100644 --- a/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/execCommand/findString-2-expected.txt
@@ -1,16 +1,16 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 765x39 text run at (0,0) width 765: "This tests to see if Find will get stuck when searching for a word that is currently selected, and was selected with a double" text run at (0,20) width 34: "click." - LayoutBlockFlow {DIV} at (0,56) size 784x20 + LayoutNGBlockFlow {DIV} at (0,56) size 784x20 LayoutText {#text} at (0,0) size 25x19 text run at (0,0) width 25: "foo " LayoutInline {SPAN} at (25,0) size 20x19
diff --git a/third_party/blink/web_tests/platform/linux/editing/inserting/4278698-expected.txt b/third_party/blink/web_tests/platform/linux/editing/inserting/4278698-expected.txt index dfb3dc5..f58bd95c 100644 --- a/third_party/blink/web_tests/platform/linux/editing/inserting/4278698-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/inserting/4278698-expected.txt
@@ -3,22 +3,22 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 767x39 text run at (0,0) width 767: "This tests to see if inserting a space inside normal whitespace inside of a whitespace:pre element will collapse other spaces" text run at (0,20) width 92: "surrounding it." - LayoutBlockFlow {P} at (0,56) size 784x20 + LayoutNGBlockFlow {P} at (0,56) size 784x20 LayoutText {#text} at (0,0) size 444x19 text run at (0,0) width 444: "If successful, you should see 'a' followed by 10 spaces followed by 'b'." - LayoutBlockFlow {DIV} at (0,102) size 784x24 [border: (2px solid #FFAAAA)] - LayoutBlockFlow {PRE} at (2,2) size 780x20 [border: (2px solid #AAAAFF)] + LayoutNGBlockFlow {DIV} at (0,102) size 784x24 [border: (2px solid #FFAAAA)] + LayoutNGBlockFlow {PRE} at (2,2) size 780x20 [border: (2px solid #AAAAFF)] LayoutText {#text} at (2,2) size 96x16 text run at (2,2) width 96: "a b" -layer at (8,100) size 784x2 clip at (0,0) size 0x0 - LayoutBlockFlow {HR} at (0,92) size 784x2 [border: (1px inset #EEEEEE)] +layer at (8,100) + LayoutNGBlockFlow {HR} at (0,92) size 784x2 [border: (1px inset #EEEEEE)] caret: position 3 of child 0 {#text} of child 1 {PRE} of child 7 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/linux/editing/pasteboard/7955-expected.txt b/third_party/blink/web_tests/platform/linux/editing/pasteboard/7955-expected.txt index 0562bab..ecf09d9 100644 --- a/third_party/blink/web_tests/platform/linux/editing/pasteboard/7955-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/pasteboard/7955-expected.txt
@@ -1,12 +1,12 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x40 - LayoutBlockFlow {DIV} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x40 + LayoutNGBlockFlow {DIV} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 21x19 text run at (0,0) width 21: "foo" - LayoutBlockFlow (anonymous) at (0,20) size 784x20 + LayoutNGBlockFlow (anonymous) at (0,20) size 784x20 LayoutText {#text} at (0,0) size 20x19 text run at (0,0) width 20: "bar"
diff --git a/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-image-expected.txt b/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-image-expected.txt index 23315f6e..3c7bf88 100644 --- a/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-image-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x20 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,246) size 784x131 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 76x103 LayoutText {#text} at (0,0) size 0x0 -layer at (8,100) size 304x154 clip at (10,102) size 300x150 +layer at (8,100) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-oriented-image-expected.txt b/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-oriented-image-expected.txt index 454295c..3e172eeb 100644 --- a/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-oriented-image-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/pasteboard/copy-standalone-oriented-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x20 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,246) size 784x128 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 50x100 LayoutText {#text} at (0,0) size 0x0 -layer at (8,100) size 304x154 clip at (10,102) size 300x150 +layer at (8,100) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 50x100
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.txt index 2bbac854..2436d6a 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/4402375-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x40 @@ -21,7 +21,7 @@ LayoutImage (floating) {IMG} at (708,0) size 76x103 LayoutText {#text} at (0,0) size 178x19 text run at (0,0) width 178: "This text should be selected." -layer at (8,64) size 784x2 clip at (0,0) size 0x0 +layer at (8,64) LayoutNGBlockFlow {HR} at (0,56) size 784x2 [border: (1px inset #EEEEEE)] selection start: position 0 of child 1 {#text} of child 6 {DIV} of body selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.txt index 4067a3e8..63f07d5 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/5195166-2-expected.txt
@@ -3,17 +3,17 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 653x19 text run at (0,0) width 653: "This tests for a bug where selection change notifications would post the wrong proposed selected range." - LayoutBlockFlow {DIV} at (0,36) size 784x20 + LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutText {#text} at (0,0) size 355x19 text run at (0,0) width 355: "There should be five characters selected in this sentence." - LayoutBlockFlow {UL} at (0,72) size 784x0 + LayoutNGBlockFlow {UL} at (0,72) size 784x0 selection start: position 0 of child 0 {#text} of child 2 {DIV} of body selection end: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/caret-and-focus-ring-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/caret-and-focus-ring-expected.txt index 493f8e4e..4cdc7322 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/caret-and-focus-ring-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/caret-and-focus-ring-expected.txt
@@ -1,14 +1,14 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 772x39 text run at (0,0) width 772: "This tests that the caret and the focus halo are not displayed when the WebView is not focused (using the pixel output from" text run at (0,20) width 123: "DumpRenderTree)." - LayoutBlockFlow {DIV} at (0,56) size 784x20 + LayoutNGBlockFlow {DIV} at (0,56) size 784x20 LayoutText {#text} at (0,0) size 65x19 text run at (0,0) width 65: "This is an " LayoutInline {SPAN} at (65,0) size 49x19
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/clear-selection-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/clear-selection-expected.txt index 1180746..1644330d 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/clear-selection-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/clear-selection-expected.txt
@@ -1,11 +1,11 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 753x39 text run at (0,0) width 753: "This tests that window.getSelection().clear() clears the selection correctly. If this test is successful, this text should not be" text run at (0,20) width 54: "selected."
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/contenteditable-click-inside-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/contenteditable-click-inside-expected.txt index 1bdbc2a..7d0b790 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/contenteditable-click-inside-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/contenteditable-click-inside-expected.txt
@@ -1,12 +1,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] - LayoutBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] - LayoutBlockFlow {P} at (0,91) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] + LayoutNGBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] + LayoutNGBlockFlow {P} at (0,91) size 784x40 LayoutText {#text} at (0,0) size 780x39 text run at (0,0) width 780: "This test clicks inside an editable div element, and must result in the element receiving focus. If the test succeeds the element" text run at (0,20) width 158: "should have a focus ring."
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.txt index 7e3d68e..8d8c5cae 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/display-table-text-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGTable {DIV} at (0,0) size 348x20
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/drag-to-contenteditable-iframe-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/drag-to-contenteditable-iframe-expected.txt index c2c8dbd..0b63d8a 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/drag-to-contenteditable-iframe-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/drag-to-contenteditable-iframe-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (0,0) size 800x584 LayoutNGBlockFlow (anonymous) at (0,0) size 800x213 @@ -18,11 +18,11 @@ text run at (0,0) width 7: "\x{2022} " LayoutText {#text} at (0,0) size 288x19 text run at (0,0) width 288: "Abe should be outside the frame and inside it." -layer at (0,0) size 208x208 clip at (4,4) size 200x200 +layer at (0,0) LayoutIFrame {IFRAME} at (0,0) size 208x208 [border: (4px solid #000000)] - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGView at (0,0) size 200x200 - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 200x200 LayoutNGBlockFlow {BODY} at (8,8) size 184x184 [bgcolor=#FFFFE0] LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/editable-links-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/editable-links-expected.txt index 31bfcbe..15913dd 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/editable-links-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/editable-links-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 65x19 text run at (0,0) width 65: "This is an " LayoutInline {A} at (65,0) size 77x19 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.txt index c5752c8..a7ca5d0 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-1-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 185x19 text run at (0,0) width 185: "Only 'bar' should be selected." - LayoutBlockFlow {DIV} at (0,36) size 52x42 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (0,36) size 52x42 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 47x39 text run at (1,1) width 45: "foo bar" text run at (1,21) width 47: "baz foo"
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.txt index 0b75b02f..acdbd284 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/line-wrap-2-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 229x19 text run at (0,0) width 229: "Only 'baz' should be selected below." - LayoutBlockFlow {DIV} at (50,36) size 52x42 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (50,36) size 52x42 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 45x19 text run at (1,1) width 45: "foo bar" LayoutInline {A} at (1,21) size 22x19 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/move-by-sentence-001-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/move-by-sentence-001-expected.txt index 373f863..fa667e9a 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/move-by-sentence-001-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/move-by-sentence-001-expected.txt
@@ -15,12 +15,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] LayoutText {#text} at (14,14) size 14x27 text run at (14,14) width 14: "\x{2022} " LayoutInline {B} at (28,14) size 240x26
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.txt index de3cbc6d..0b40b6e 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/select-missing-image-expected.txt
@@ -1,15 +1,15 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x128 [border: (2px solid #FF0000)] LayoutText {#text} at (0,0) size 0x0 -layer at (22,22) size 550x100 +layer at (22,22) LayoutNGBlockFlow {IMG} at (14,14) size 550x100 -layer at (22,22) size 550x100 clip at (23,23) size 548x98 +layer at (22,22) LayoutNGBlockFlow {SPAN} at (0,0) size 550x100 [border: (1px solid #C0C0C0)] LayoutImage (floating) {IMG} at (2,2) size 16x16 LayoutInline {SPAN} at (18,2) size 480x27
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/selectNode-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/selectNode-expected.txt index ca55cae4..8b139d0 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/selectNode-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/selectNode-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x20
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/selectNodeContents-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/selectNodeContents-expected.txt index 0768f678..6b8beb25 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/selectNodeContents-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/selectNodeContents-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x20
diff --git a/third_party/blink/web_tests/platform/linux/editing/selection/selection-background-expected.txt b/third_party/blink/web_tests/platform/linux/editing/selection/selection-background-expected.txt index 62a3ea0..8746fe0 100644 --- a/third_party/blink/web_tests/platform/linux/editing/selection/selection-background-expected.txt +++ b/third_party/blink/web_tests/platform/linux/editing/selection/selection-background-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 764x19 text run at (0,0) width 764: "This tests that the selection tint is grey when the WebView is not focused (using the pixel output from DumpRenderTree)." - LayoutBlockFlow {DIV} at (0,36) size 784x20 + LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutText {#text} at (0,0) size 178x19 text run at (0,0) width 178: "This text should be selected." selection start: position 0 of child 0 {#text} of child 3 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-update-text-popup-expected.txt b/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-update-text-popup-expected.txt index b192828..7c95090 100644 --- a/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-update-text-popup-expected.txt +++ b/third_party/blink/web_tests/platform/linux/fast/forms/select/menulist-update-text-popup-expected.txt
@@ -4,11 +4,11 @@ A B C -layer at (0,0) size 31x20 +layer at (0,0) LayoutNGBlockFlow (positioned) {DIV} at (8,50) size 31x20 LayoutNGFlexibleBox {SELECT} at (0,0) size 31x20 [bgcolor=#EFEFEF] [border: (1px solid #767676)] LayoutText {#text} at (0,0) size 0x0 -layer at (5,1) size 9x18 +layer at (5,1) LayoutNGBlockFlow {DIV} at (5,1) size 9x18 LayoutText {#text} at (0,1) size 9x16 text run at (0,1) width 9: "C"
diff --git a/third_party/blink/web_tests/platform/linux/printing/forced-break-tree-dump-only-expected.txt b/third_party/blink/web_tests/platform/linux/printing/forced-break-tree-dump-only-expected.txt index ed99701..c40ffea 100644 --- a/third_party/blink/web_tests/platform/linux/printing/forced-break-tree-dump-only-expected.txt +++ b/third_party/blink/web_tests/platform/linux/printing/forced-break-tree-dump-only-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 scrollHeight 1598 +layer at (0,0) scrollHeight 1598 LayoutNGView at (0,0) size 1066x799 -layer at (0,0) size 1066x827 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1066x827 LayoutNGBlockFlow {BODY} at (8,16) size 1050x803 LayoutNGBlockFlow {P} at (0,0) size 1050x40
diff --git a/third_party/blink/web_tests/platform/mac/editing/caret/caret-color-expected.txt b/third_party/blink/web_tests/platform/mac/editing/caret/caret-color-expected.txt index 9b567e2..aa0c986ec 100644 --- a/third_party/blink/web_tests/platform/mac/editing/caret/caret-color-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/caret/caret-color-expected.txt
@@ -1,16 +1,16 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 754x36 text run at (0,0) width 754: "This tests to make sure that the caret is visible in the black background by getting the caret color from the color of the" text run at (0,18) width 638: "element(span) containing the text, not the parent element(div) that has the contentEditable attribute." - LayoutBlockFlow {DIV} at (0,52) size 784x56 [border: (2px solid #FF0000)] + LayoutNGBlockFlow {DIV} at (0,52) size 784x56 [border: (2px solid #FF0000)] LayoutInline {SPAN} at (14,14) size 186x28 [color=#FFFFFF] [bgcolor=#000000] LayoutText {#text} at (14,14) size 186x28 text run at (14,14) width 186: "Where is my caret?"
diff --git a/third_party/blink/web_tests/platform/mac/editing/execCommand/findString-2-expected.txt b/third_party/blink/web_tests/platform/mac/editing/execCommand/findString-2-expected.txt index 923b4df..6184c43 100644 --- a/third_party/blink/web_tests/platform/mac/editing/execCommand/findString-2-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/execCommand/findString-2-expected.txt
@@ -1,16 +1,16 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 781x36 text run at (0,0) width 781: "This tests to see if Find will get stuck when searching for a word that is currently selected, and was selected with a double" text run at (0,18) width 36: "click." - LayoutBlockFlow {DIV} at (0,52) size 784x18 + LayoutNGBlockFlow {DIV} at (0,52) size 784x18 LayoutText {#text} at (0,0) size 26x18 text run at (0,0) width 26: "foo " LayoutInline {SPAN} at (25,0) size 21x18
diff --git a/third_party/blink/web_tests/platform/mac/editing/inserting/4278698-expected.txt b/third_party/blink/web_tests/platform/mac/editing/inserting/4278698-expected.txt index 5d08fa3..19458f3 100644 --- a/third_party/blink/web_tests/platform/mac/editing/inserting/4278698-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/inserting/4278698-expected.txt
@@ -3,22 +3,22 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 741x36 text run at (0,0) width 741: "This tests to see if inserting a space inside normal whitespace inside of a whitespace:pre element will collapse other" text run at (0,18) width 140: "spaces surrounding it." - LayoutBlockFlow {P} at (0,52) size 784x18 + LayoutNGBlockFlow {P} at (0,52) size 784x18 LayoutText {#text} at (0,0) size 450x18 text run at (0,0) width 450: "If successful, you should see 'a' followed by 10 spaces followed by 'b'." - LayoutBlockFlow {DIV} at (0,96) size 784x23 [border: (2px solid #FFAAAA)] - LayoutBlockFlow {PRE} at (2,2) size 780x19 [border: (2px solid #AAAAFF)] + LayoutNGBlockFlow {DIV} at (0,96) size 784x23 [border: (2px solid #FFAAAA)] + LayoutNGBlockFlow {PRE} at (2,2) size 780x19 [border: (2px solid #AAAAFF)] LayoutText {#text} at (2,2) size 94x15 text run at (2,2) width 94: "a b" -layer at (8,94) size 784x2 clip at (0,0) size 0x0 - LayoutBlockFlow {HR} at (0,86) size 784x2 [border: (1px inset #EEEEEE)] +layer at (8,94) + LayoutNGBlockFlow {HR} at (0,86) size 784x2 [border: (1px inset #EEEEEE)] caret: position 3 of child 0 {#text} of child 1 {PRE} of child 7 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/inserting/insert-space-in-empty-doc-expected.txt b/third_party/blink/web_tests/platform/mac/editing/inserting/insert-space-in-empty-doc-expected.txt index 21474ec..3cd890c8 100644 --- a/third_party/blink/web_tests/platform/mac/editing/inserting/insert-space-in-empty-doc-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/inserting/insert-space-in-empty-doc-expected.txt
@@ -7,12 +7,12 @@ EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] LayoutText {#text} at (14,14) size 38x28 text run at (14,14) width 38: " foo" caret: position 4 of child 0 {#text} of child 1 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/pasteboard/7955-expected.txt b/third_party/blink/web_tests/platform/mac/editing/pasteboard/7955-expected.txt index 7fc3991c..c42f9297 100644 --- a/third_party/blink/web_tests/platform/mac/editing/pasteboard/7955-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/pasteboard/7955-expected.txt
@@ -1,12 +1,12 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x36 - LayoutBlockFlow {DIV} at (0,0) size 784x18 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x36 + LayoutNGBlockFlow {DIV} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 22x18 text run at (0,0) width 22: "foo" - LayoutBlockFlow (anonymous) at (0,18) size 784x18 + LayoutNGBlockFlow (anonymous) at (0,18) size 784x18 LayoutText {#text} at (0,0) size 21x18 text run at (0,0) width 21: "bar"
diff --git a/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-image-expected.txt b/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-image-expected.txt index 927f7745..de4874a6 100644 --- a/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-image-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x18 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,240) size 784x131 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 76x103 LayoutText {#text} at (0,0) size 0x0 -layer at (8,94) size 304x154 clip at (10,96) size 300x150 +layer at (8,94) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-oriented-image-expected.txt b/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-oriented-image-expected.txt index 09ca434..2c87d2cb 100644 --- a/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-oriented-image-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/pasteboard/copy-standalone-oriented-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x18 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,240) size 784x128 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 50x100 LayoutText {#text} at (0,0) size 0x0 -layer at (8,94) size 304x154 clip at (10,96) size 300x150 +layer at (8,94) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 50x100
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt index 114f1b6b..935fc9c 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/4402375-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x36 @@ -21,7 +21,7 @@ LayoutImage (floating) {IMG} at (708,0) size 76x103 LayoutText {#text} at (0,0) size 182x18 text run at (0,0) width 182: "This text should be selected." -layer at (8,60) size 784x2 clip at (0,0) size 0x0 +layer at (8,60) LayoutNGBlockFlow {HR} at (0,52) size 784x2 [border: (1px inset #EEEEEE)] selection start: position 0 of child 1 {#text} of child 6 {DIV} of body selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/5195166-2-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/5195166-2-expected.txt index 269b4f1..5ca281b 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/5195166-2-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/5195166-2-expected.txt
@@ -3,17 +3,17 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {P} at (0,0) size 784x18 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {P} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 664x18 text run at (0,0) width 664: "This tests for a bug where selection change notifications would post the wrong proposed selected range." - LayoutBlockFlow {DIV} at (0,34) size 784x18 + LayoutNGBlockFlow {DIV} at (0,34) size 784x18 LayoutText {#text} at (0,0) size 363x18 text run at (0,0) width 363: "There should be five characters selected in this sentence." - LayoutBlockFlow {UL} at (0,68) size 784x0 + LayoutNGBlockFlow {UL} at (0,68) size 784x0 selection start: position 0 of child 0 {#text} of child 2 {DIV} of body selection end: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/caret-and-focus-ring-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/caret-and-focus-ring-expected.txt index fb10239c..2de50ce 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/caret-and-focus-ring-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/caret-and-focus-ring-expected.txt
@@ -1,14 +1,14 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 752x36 text run at (0,0) width 752: "This tests that the caret and the focus halo are not displayed when the WebView is not focused (using the pixel output" text run at (0,18) width 160: "from DumpRenderTree)." - LayoutBlockFlow {DIV} at (0,52) size 784x18 + LayoutNGBlockFlow {DIV} at (0,52) size 784x18 LayoutText {#text} at (0,0) size 67x18 text run at (0,0) width 67: "This is an " LayoutInline {SPAN} at (66,0) size 51x18
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/clear-selection-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/clear-selection-expected.txt index df235308..87f0589 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/clear-selection-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/clear-selection-expected.txt
@@ -1,11 +1,11 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x36 LayoutText {#text} at (0,0) size 775x36 text run at (0,0) width 775: "This tests that window.getSelection().clear() clears the selection correctly. If this test is successful, this text should not be" text run at (0,18) width 56: "selected."
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/contenteditable-click-inside-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/contenteditable-click-inside-expected.txt index 204a974..ecffdec 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/contenteditable-click-inside-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/contenteditable-click-inside-expected.txt
@@ -1,12 +1,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] - LayoutBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] - LayoutBlockFlow {P} at (0,91) size 784x36 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] + LayoutNGBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] + LayoutNGBlockFlow {P} at (0,91) size 784x36 LayoutText {#text} at (0,0) size 747x36 text run at (0,0) width 747: "This test clicks inside an editable div element, and must result in the element receiving focus. If the test succeeds the" text run at (0,18) width 216: "element should have a focus ring."
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/display-table-text-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/display-table-text-expected.txt index 8c862cd..ba5c470 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/display-table-text-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/display-table-text-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGTable {DIV} at (0,0) size 354.59x18
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/drag-to-contenteditable-iframe-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/drag-to-contenteditable-iframe-expected.txt index 1ac5b1c..c7941f8e 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/drag-to-contenteditable-iframe-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/drag-to-contenteditable-iframe-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (0,0) size 800x584 LayoutNGBlockFlow (anonymous) at (0,0) size 800x212 @@ -18,11 +18,11 @@ text run at (0,0) width 7: "\x{2022} " LayoutText {#text} at (0,0) size 294x18 text run at (0,0) width 294: "Abe should be outside the frame and inside it." -layer at (0,0) size 208x208 clip at (4,4) size 200x200 +layer at (0,0) LayoutIFrame {IFRAME} at (0,0) size 208x208 [border: (4px solid #000000)] - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGView at (0,0) size 200x200 - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 200x200 LayoutNGBlockFlow {BODY} at (8,8) size 184x184 [bgcolor=#FFFFE0] LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/editable-links-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/editable-links-expected.txt index 4786a31..546c496 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/editable-links-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/editable-links-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 67x18 text run at (0,0) width 67: "This is an " LayoutInline {A} at (66,0) size 80x18 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-1-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-1-expected.txt index b6e47c4..3cca6556 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-1-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-1-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x18 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 188x18 text run at (0,0) width 188: "Only 'bar' should be selected." - LayoutBlockFlow {DIV} at (0,34) size 52x38 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (0,34) size 52x38 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 48x36 text run at (1,1) width 46: "foo bar" text run at (1,19) width 48: "baz foo"
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-2-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-2-expected.txt index bd064f4..207ddddc 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-2-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/line-wrap-2-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x18 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x18 LayoutText {#text} at (0,0) size 232x18 text run at (0,0) width 232: "Only 'baz' should be selected below." - LayoutBlockFlow {DIV} at (50,34) size 52x38 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (50,34) size 52x38 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 46x18 text run at (1,1) width 46: "foo bar" LayoutInline {A} at (1,19) size 23x18 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/move-by-sentence-001-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/move-by-sentence-001-expected.txt index 31a1bfcf..f1807273 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/move-by-sentence-001-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/move-by-sentence-001-expected.txt
@@ -15,12 +15,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] LayoutText {#text} at (14,14) size 15x28 text run at (14,14) width 15: "\x{2022} " LayoutInline {B} at (28,14) size 241x28
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/select-missing-image-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/select-missing-image-expected.txt index 15eeb67..af1f0f9 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/select-missing-image-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/select-missing-image-expected.txt
@@ -1,15 +1,15 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x128 [border: (2px solid #FF0000)] LayoutText {#text} at (0,0) size 0x0 -layer at (22,22) size 550x100 +layer at (22,22) LayoutNGBlockFlow {IMG} at (14,14) size 550x100 -layer at (22,22) size 550x100 clip at (23,23) size 548x98 +layer at (22,22) LayoutNGBlockFlow {SPAN} at (0,0) size 550x100 [border: (1px solid #C0C0C0)] LayoutImage (floating) {IMG} at (2,2) size 16x16 LayoutInline {SPAN} at (18,2) size 475x28
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/selectNode-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/selectNode-expected.txt index 9ed99fb..e71f552 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/selectNode-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/selectNode-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x18
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/selectNodeContents-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/selectNodeContents-expected.txt index 2c9aa9a1..2049ec8 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/selectNodeContents-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/selectNodeContents-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x18
diff --git a/third_party/blink/web_tests/platform/mac/editing/selection/selection-background-expected.txt b/third_party/blink/web_tests/platform/mac/editing/selection/selection-background-expected.txt index 2cb5797..0b2cc5b 100644 --- a/third_party/blink/web_tests/platform/mac/editing/selection/selection-background-expected.txt +++ b/third_party/blink/web_tests/platform/mac/editing/selection/selection-background-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x18
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-update-text-popup-expected.txt b/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-update-text-popup-expected.txt index 3750646..a6c9aed 100644 --- a/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-update-text-popup-expected.txt +++ b/third_party/blink/web_tests/platform/mac/fast/forms/select/menulist-update-text-popup-expected.txt
@@ -4,12 +4,12 @@ A B C -layer at (0,0) size 32x19 +layer at (0,0) LayoutNGBlockFlow (positioned) {DIV} at (8,50) size 32x19 - LayoutFlexibleBox {SELECT} at (0,0) size 32x19 [bgcolor=#FFFFFF] [border: (1px solid #767676)] + LayoutNGFlexibleBox {SELECT} at (0,0) size 32x19 [bgcolor=#FFFFFF] [border: (1px solid #767676)] LayoutText {#text} at (0,0) size 0x0 -layer at (5,1) size 10x17 - LayoutBlockFlow {DIV} at (5,1) size 10x17 +layer at (5,1) + LayoutNGBlockFlow {DIV} at (5,1) size 10x17 LayoutText {#text} at (0,1) size 10x15 text run at (0,1) width 10: "C"
diff --git a/third_party/blink/web_tests/platform/mac/printing/forced-break-tree-dump-only-expected.txt b/third_party/blink/web_tests/platform/mac/printing/forced-break-tree-dump-only-expected.txt index 3873e6ad..0fbc50d 100644 --- a/third_party/blink/web_tests/platform/mac/printing/forced-break-tree-dump-only-expected.txt +++ b/third_party/blink/web_tests/platform/mac/printing/forced-break-tree-dump-only-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 scrollHeight 1598 +layer at (0,0) scrollHeight 1598 LayoutNGView at (0,0) size 1066x799 -layer at (0,0) size 1066x825 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1066x825 LayoutNGBlockFlow {BODY} at (8,16) size 1050x801 LayoutNGBlockFlow {P} at (0,0) size 1050x36
diff --git a/third_party/blink/web_tests/platform/win/editing/caret/caret-color-expected.txt b/third_party/blink/web_tests/platform/win/editing/caret/caret-color-expected.txt index 515b914..a620478 100644 --- a/third_party/blink/web_tests/platform/win/editing/caret/caret-color-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/caret/caret-color-expected.txt
@@ -1,16 +1,16 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 703x39 text run at (0,0) width 703: "This tests to make sure that the caret is visible in the black background by getting the caret color from the color of the" text run at (0,20) width 591: "element(span) containing the text, not the parent element(div) that has the contentEditable attribute." - LayoutBlockFlow {DIV} at (0,56) size 784x56 [border: (2px solid #FF0000)] + LayoutNGBlockFlow {DIV} at (0,56) size 784x56 [border: (2px solid #FF0000)] LayoutInline {SPAN} at (14,14) size 186x27 [color=#FFFFFF] [bgcolor=#000000] LayoutText {#text} at (14,14) size 186x27 text run at (14,14) width 186: "Where is my caret?"
diff --git a/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.txt b/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.txt index bb22956d..e9469fe 100644 --- a/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/execCommand/findString-2-expected.txt
@@ -1,15 +1,15 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 764x19 text run at (0,0) width 764: "This tests to see if Find will get stuck when searching for a word that is currently selected, and was selected with a double click." - LayoutBlockFlow {DIV} at (0,36) size 784x20 + LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutText {#text} at (0,0) size 24x19 text run at (0,0) width 24: "foo " LayoutInline {SPAN} at (24,0) size 20x19
diff --git a/third_party/blink/web_tests/platform/win/editing/inserting/4278698-expected.txt b/third_party/blink/web_tests/platform/win/editing/inserting/4278698-expected.txt index 808a5c4..b59b78e 100644 --- a/third_party/blink/web_tests/platform/win/editing/inserting/4278698-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/inserting/4278698-expected.txt
@@ -3,22 +3,22 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 730x39 text run at (0,0) width 730: "This tests to see if inserting a space inside normal whitespace inside of a whitespace:pre element will collapse other spaces" text run at (0,20) width 85: "surrounding it." - LayoutBlockFlow {P} at (0,56) size 784x20 + LayoutNGBlockFlow {P} at (0,56) size 784x20 LayoutText {#text} at (0,0) size 424x19 text run at (0,0) width 424: "If successful, you should see 'a' followed by 10 spaces followed by 'b'." - LayoutBlockFlow {DIV} at (0,102) size 784x24 [border: (2px solid #FFAAAA)] - LayoutBlockFlow {PRE} at (2,2) size 780x20 [border: (2px solid #AAAAFF)] + LayoutNGBlockFlow {DIV} at (0,102) size 784x24 [border: (2px solid #FFAAAA)] + LayoutNGBlockFlow {PRE} at (2,2) size 780x20 [border: (2px solid #AAAAFF)] LayoutText {#text} at (2,2) size 96x16 text run at (2,2) width 96: "a b" -layer at (8,100) size 784x2 clip at (0,0) size 0x0 - LayoutBlockFlow {HR} at (0,92) size 784x2 [border: (1px inset #EEEEEE)] +layer at (8,100) + LayoutNGBlockFlow {HR} at (0,92) size 784x2 [border: (1px inset #EEEEEE)] caret: position 3 of child 0 {#text} of child 1 {PRE} of child 7 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/win/editing/inserting/insert-space-in-empty-doc-expected.txt b/third_party/blink/web_tests/platform/win/editing/inserting/insert-space-in-empty-doc-expected.txt index e1c8871..2274a3c 100644 --- a/third_party/blink/web_tests/platform/win/editing/inserting/insert-space-in-empty-doc-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/inserting/insert-space-in-empty-doc-expected.txt
@@ -7,12 +7,12 @@ EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] LayoutText {#text} at (14,14) size 38x27 text run at (14,14) width 38: " foo" caret: position 4 of child 0 {#text} of child 1 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/win/editing/pasteboard/7955-expected.txt b/third_party/blink/web_tests/platform/win/editing/pasteboard/7955-expected.txt index 8fb4c25a..50835c126 100644 --- a/third_party/blink/web_tests/platform/win/editing/pasteboard/7955-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/pasteboard/7955-expected.txt
@@ -1,12 +1,12 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x40 - LayoutBlockFlow {DIV} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x40 + LayoutNGBlockFlow {DIV} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 20x19 text run at (0,0) width 20: "foo" - LayoutBlockFlow (anonymous) at (0,20) size 784x20 + LayoutNGBlockFlow (anonymous) at (0,20) size 784x20 LayoutText {#text} at (0,0) size 20x19 text run at (0,0) width 20: "bar"
diff --git a/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-image-expected.txt b/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-image-expected.txt index f556d00..833179e 100644 --- a/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-image-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x20 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,246) size 784x131 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 76x103 LayoutText {#text} at (0,0) size 0x0 -layer at (8,100) size 304x154 clip at (10,102) size 300x150 +layer at (8,100) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-oriented-image-expected.txt b/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-oriented-image-expected.txt index d57bebe3..0a16ad2 100644 --- a/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-oriented-image-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/pasteboard/copy-standalone-oriented-image-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x20 @@ -18,11 +18,11 @@ LayoutNGBlockFlow {DIV} at (0,246) size 784x128 [border: (2px solid #FF0000)] LayoutImage {IMG} at (14,14) size 50x100 LayoutText {#text} at (0,0) size 0x0 -layer at (8,100) size 304x154 clip at (10,102) size 300x150 +layer at (8,100) LayoutIFrame {IFRAME} at (0,0) size 304x154 [border: (2px solid #0000FF)] - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGView at (0,0) size 300x150 - layer at (0,0) size 300x150 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 300x150 LayoutNGBlockFlow {BODY} at (0,0) size 300x150 LayoutImage {IMG} at (0,0) size 50x100
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.txt index a061f2d..d6485ec 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/4402375-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {P} at (0,0) size 784x40 @@ -21,7 +21,7 @@ LayoutImage (floating) {IMG} at (708,0) size 76x103 LayoutText {#text} at (0,0) size 170x19 text run at (0,0) width 170: "This text should be selected." -layer at (8,64) size 784x2 clip at (0,0) size 0x0 +layer at (8,64) LayoutNGBlockFlow {HR} at (0,56) size 784x2 [border: (1px inset #EEEEEE)] selection start: position 0 of child 1 {#text} of child 6 {DIV} of body selection end: position 29 of child 1 {#text} of child 6 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.txt index e3891e1..4138f83c 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/5195166-2-expected.txt
@@ -3,17 +3,17 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 623x19 text run at (0,0) width 623: "This tests for a bug where selection change notifications would post the wrong proposed selected range." - LayoutBlockFlow {DIV} at (0,36) size 784x20 + LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutText {#text} at (0,0) size 339x19 text run at (0,0) width 339: "There should be five characters selected in this sentence." - LayoutBlockFlow {UL} at (0,72) size 784x0 + LayoutNGBlockFlow {UL} at (0,72) size 784x0 selection start: position 0 of child 0 {#text} of child 2 {DIV} of body selection end: position 2 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/caret-and-focus-ring-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/caret-and-focus-ring-expected.txt index 713c397..a97935e 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/caret-and-focus-ring-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/caret-and-focus-ring-expected.txt
@@ -1,14 +1,14 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x40 LayoutText {#text} at (0,0) size 734x39 text run at (0,0) width 734: "This tests that the caret and the focus halo are not displayed when the WebView is not focused (using the pixel output from" text run at (0,20) width 117: "DumpRenderTree)." - LayoutBlockFlow {DIV} at (0,56) size 784x20 + LayoutNGBlockFlow {DIV} at (0,56) size 784x20 LayoutText {#text} at (0,0) size 60x19 text run at (0,0) width 60: "This is an " LayoutInline {SPAN} at (60,0) size 47x19
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/clear-selection-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/clear-selection-expected.txt index f2b02b36..ae3361b 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/clear-selection-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/clear-selection-expected.txt
@@ -1,10 +1,10 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 775x19 text run at (0,0) width 775: "This tests that window.getSelection().clear() clears the selection correctly. If this test is successful, this text should not be selected."
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/contenteditable-click-inside-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/contenteditable-click-inside-expected.txt index c5c46c1..0faac87 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/contenteditable-click-inside-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/contenteditable-click-inside-expected.txt
@@ -1,12 +1,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x576 - LayoutBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] - LayoutBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] - LayoutBlockFlow {P} at (0,91) size 784x40 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x576 + LayoutNGBlockFlow {DIV} at (0,0) size 425x75 [bgcolor=#FFFF00] + LayoutNGBlockFlow {DIV} at (25,25) size 100x20 [bgcolor=#FFFFFF] + LayoutNGBlockFlow {P} at (0,91) size 784x40 LayoutText {#text} at (0,0) size 782x39 text run at (0,0) width 782: "This test clicks inside an editable div element, and must result in the element receiving focus. If the test succeeds the element should" text run at (0,20) width 105: "have a focus ring."
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.txt index c0c76fd..3f7c93e 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/display-table-text-expected.txt
@@ -1,7 +1,7 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGTable {DIV} at (0,0) size 331x20
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/drag-to-contenteditable-iframe-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/drag-to-contenteditable-iframe-expected.txt index 8f52bec3..5e2bd15 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/drag-to-contenteditable-iframe-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/drag-to-contenteditable-iframe-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (0,0) size 800x584 LayoutNGBlockFlow (anonymous) at (0,0) size 800x213 @@ -18,11 +18,11 @@ text run at (0,0) width 7: "\x{2022} " LayoutText {#text} at (0,0) size 274x19 text run at (0,0) width 274: "Abe should be outside the frame and inside it." -layer at (0,0) size 208x208 clip at (4,4) size 200x200 +layer at (0,0) LayoutIFrame {IFRAME} at (0,0) size 208x208 [border: (4px solid #000000)] - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGView at (0,0) size 200x200 - layer at (0,0) size 200x200 + layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 200x200 LayoutNGBlockFlow {BODY} at (8,8) size 184x184 [bgcolor=#FFFFE0] LayoutImage {IMG} at (0,0) size 76x103
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/editable-links-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/editable-links-expected.txt index 04fac5a5..4f385bb 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/editable-links-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/editable-links-expected.txt
@@ -1,9 +1,9 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutText {#text} at (0,0) size 60x19 text run at (0,0) width 60: "This is an " LayoutInline {A} at (60,0) size 72x19 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.txt index a2d4175..288f8d3 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-1-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 178x19 text run at (0,0) width 178: "Only 'bar' should be selected." - LayoutBlockFlow {DIV} at (0,36) size 52x42 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (0,36) size 52x42 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 45x39 text run at (1,1) width 44: "foo bar" text run at (1,21) width 45: "baz foo"
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.txt index 2eb8672..c8b95940 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/line-wrap-2-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 219x19 text run at (0,0) width 219: "Only 'baz' should be selected below." - LayoutBlockFlow {DIV} at (50,36) size 52x42 [border: (1px solid #000000)] + LayoutNGBlockFlow {DIV} at (50,36) size 52x42 [border: (1px solid #000000)] LayoutText {#text} at (1,1) size 44x19 text run at (1,1) width 44: "foo bar" LayoutInline {A} at (1,21) size 21x19 [color=#0000EE]
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/move-by-sentence-001-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/move-by-sentence-001-expected.txt index 7a1278b..71f89143 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/move-by-sentence-001-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/move-by-sentence-001-expected.txt
@@ -15,12 +15,12 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {DIV} at (0,0) size 784x56 [border: (2px solid #FF0000)] LayoutText {#text} at (14,14) size 14x27 text run at (14,14) width 14: "\x{2022} " LayoutInline {B} at (28,14) size 238x26
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.txt index a4d19bd6..17d68c1 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/select-missing-image-expected.txt
@@ -1,15 +1,15 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x584 LayoutNGBlockFlow {DIV} at (0,0) size 784x128 [border: (2px solid #FF0000)] LayoutText {#text} at (0,0) size 0x0 -layer at (22,22) size 550x100 +layer at (22,22) LayoutNGBlockFlow {IMG} at (14,14) size 550x100 -layer at (22,22) size 550x100 clip at (23,23) size 548x98 +layer at (22,22) LayoutNGBlockFlow {SPAN} at (0,0) size 550x100 [border: (1px solid #C0C0C0)] LayoutImage (floating) {IMG} at (2,2) size 16x16 LayoutInline {SPAN} at (18,2) size 467x27
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/selectNode-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/selectNode-expected.txt index ee49ce9d..3a2090a 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/selectNode-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/selectNode-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x20
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/selectNodeContents-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/selectNodeContents-expected.txt index 678eeae..f2fc1b5 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/selectNodeContents-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/selectNodeContents-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 800x600 LayoutNGBlockFlow {BODY} at (8,8) size 784x576 LayoutNGBlockFlow {P} at (0,0) size 784x20
diff --git a/third_party/blink/web_tests/platform/win/editing/selection/selection-background-expected.txt b/third_party/blink/web_tests/platform/win/editing/selection/selection-background-expected.txt index b5672372..fdd42d4 100644 --- a/third_party/blink/web_tests/platform/win/editing/selection/selection-background-expected.txt +++ b/third_party/blink/web_tests/platform/win/editing/selection/selection-background-expected.txt
@@ -1,13 +1,13 @@ EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification -layer at (0,0) size 800x600 - LayoutView at (0,0) size 800x600 -layer at (0,0) size 800x600 - LayoutBlockFlow {HTML} at (0,0) size 800x600 - LayoutBlockFlow {BODY} at (8,8) size 784x584 - LayoutBlockFlow {P} at (0,0) size 784x20 +layer at (0,0) + LayoutNGView at (0,0) size 800x600 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 800x600 + LayoutNGBlockFlow {BODY} at (8,8) size 784x584 + LayoutNGBlockFlow {P} at (0,0) size 784x20 LayoutText {#text} at (0,0) size 722x19 text run at (0,0) width 722: "This tests that the selection tint is grey when the WebView is not focused (using the pixel output from DumpRenderTree)." - LayoutBlockFlow {DIV} at (0,36) size 784x20 + LayoutNGBlockFlow {DIV} at (0,36) size 784x20 LayoutText {#text} at (0,0) size 170x19 text run at (0,0) width 170: "This text should be selected." selection start: position 0 of child 0 {#text} of child 3 {DIV} of body
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-update-text-popup-expected.txt b/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-update-text-popup-expected.txt index 8a9ea9a8..c771116c 100644 --- a/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-update-text-popup-expected.txt +++ b/third_party/blink/web_tests/platform/win/fast/forms/select/menulist-update-text-popup-expected.txt
@@ -4,12 +4,12 @@ A B C -layer at (0,0) size 33x20 +layer at (0,0) LayoutNGBlockFlow (positioned) {DIV} at (8,50) size 33x20 - LayoutFlexibleBox {SELECT} at (0,0) size 33x20 [bgcolor=#FFFFFF] [border: (1px solid #767676)] + LayoutNGFlexibleBox {SELECT} at (0,0) size 33x20 [bgcolor=#FFFFFF] [border: (1px solid #767676)] LayoutText {#text} at (0,0) size 0x0 -layer at (5,1) size 9x18 - LayoutBlockFlow {DIV} at (5,1) size 9x18 +layer at (5,1) + LayoutNGBlockFlow {DIV} at (5,1) size 9x18 LayoutText {#text} at (0,1) size 9x16 text run at (0,1) width 9: "C"
diff --git a/third_party/blink/web_tests/platform/win/printing/forced-break-tree-dump-only-expected.txt b/third_party/blink/web_tests/platform/win/printing/forced-break-tree-dump-only-expected.txt index 6ed8a10..3efa111 100644 --- a/third_party/blink/web_tests/platform/win/printing/forced-break-tree-dump-only-expected.txt +++ b/third_party/blink/web_tests/platform/win/printing/forced-break-tree-dump-only-expected.txt
@@ -1,6 +1,6 @@ -layer at (0,0) size 800x600 scrollHeight 1598 +layer at (0,0) scrollHeight 1598 LayoutNGView at (0,0) size 1066x799 -layer at (0,0) size 1066x827 +layer at (0,0) LayoutNGBlockFlow {HTML} at (0,0) size 1066x827 LayoutNGBlockFlow {BODY} at (8,16) size 1050x803 LayoutNGBlockFlow {P} at (0,0) size 1050x40
diff --git a/third_party/blink/web_tests/platform/win10/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png b/third_party/blink/web_tests/platform/win10/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png new file mode 100644 index 0000000..fe16af7 --- /dev/null +++ b/third_party/blink/web_tests/platform/win10/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/plugins/page-scale-does-not-affect-plugin-height-expected.txt b/third_party/blink/web_tests/plugins/page-scale-does-not-affect-plugin-height-expected.txt index a3a6c078..a41d4f7 100644 --- a/third_party/blink/web_tests/plugins/page-scale-does-not-affect-plugin-height-expected.txt +++ b/third_party/blink/web_tests/plugins/page-scale-does-not-affect-plugin-height-expected.txt
@@ -3,4 +3,4 @@ EXPECTED: layer at (0,0) size 800x600 LayoutEmbeddedObject {EMBED} at (0,0) size 800x600 ACTUAL: -layer at (0,0) size 800x600 LayoutEmbeddedObject {EMBED} at (0,0) size 800x600 +layer at (0,0) LayoutEmbeddedObject {EMBED} at (0,0) size 800x600
diff --git a/third_party/blink/web_tests/printing/iframe-svg-in-object-print-expected.txt b/third_party/blink/web_tests/printing/iframe-svg-in-object-print-expected.txt index d46c6d989..e280c36d 100644 --- a/third_party/blink/web_tests/printing/iframe-svg-in-object-print-expected.txt +++ b/third_party/blink/web_tests/printing/iframe-svg-in-object-print-expected.txt
@@ -1,21 +1,21 @@ -layer at (0,0) size 800x600 - LayoutView at (0,0) size 1066x799 -layer at (0,0) size 1066x799 - LayoutBlockFlow {HTML} at (0,0) size 1066x799 - LayoutBlockFlow {BODY} at (8,8) size 1050x783 +layer at (0,0) + LayoutNGView at (0,0) size 1066x799 +layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 1066x799 + LayoutNGBlockFlow {BODY} at (8,8) size 1050x783 LayoutText {#text} at (0,0) size 0x0 -layer at (8,8) size 204x204 clip at (10,10) size 200x200 +layer at (8,8) LayoutIFrame {IFRAME} at (0,0) size 204x204 [border: (2px inset #EEEEEE)] - layer at (0,0) size 200x200 - LayoutView at (0,0) size 200x200 - layer at (0,0) size 100x100 - LayoutBlockFlow {HTML} at (0,0) size 100x100 - LayoutBlockFlow {BODY} at (8,8) size 100x100 + layer at (0,0) + LayoutNGView at (0,0) size 200x200 + layer at (0,0) + LayoutNGBlockFlow {HTML} at (0,0) size 100x100 + LayoutNGBlockFlow {BODY} at (8,8) size 100x100 LayoutText {#text} at (0,0) size 0x0 - layer at (8,8) size 100x100 + layer at (8,8) LayoutEmbeddedObject {OBJECT} at (0,0) size 100x100 - layer at (0,0) size 100x100 - LayoutView at (0,0) size 100x100 - layer at (0,0) size 100x100 + layer at (0,0) + LayoutNGView at (0,0) size 100x100 + layer at (0,0) LayoutSVGRoot {svg} at (0,0) size 100x100 LayoutSVGEllipse {circle} at (25,25) size 50x50 [fill={[type=SOLID] [color=#0000FF]}] [cx=50.00] [cy=50.00] [r=25.00]
diff --git a/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png b/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png new file mode 100644 index 0000000..28b0daa6 --- /dev/null +++ b/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb.html b/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb.html new file mode 100644 index 0000000..363db4f --- /dev/null +++ b/third_party/blink/web_tests/virtual/fluent-non-overlay-scrollbar/hover-over-scrollbar-thumb.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- Tests that the thumb's color changes when hovered over. --> +<script src='../../resources/gesture-util.js'></script> +<script src='../../resources/testharness.js'></script> +<script src='../../resources/scrollbar-util.js'></script> +<script src='../../resources/blink-coordinates-util.js'></script> + +<style> + body, + html { + width: 2000px; + height: 2000px; + margin: 0; + background-color: green; + } +</style> + +<script> + window.onload = async () => { + if (!internals) + return; + + testRunner.waitUntilDone(); + + const { x, y } = verticalThumb(document.documentElement); + await mouseMoveTo(x, y); + await waitForCompositorCommit(); + testRunner.notifyDone(); + } +</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt b/third_party/blink/web_tests/virtual/third-party-storage-partitioning/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt similarity index 100% rename from third_party/blink/web_tests/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt rename to third_party/blink/web_tests/virtual/third-party-storage-partitioning/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/helpers.js b/third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/helpers.js index 69f368ff..7ae49f3 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/helpers.js +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/helpers.js
@@ -7,11 +7,6 @@ const attribution_reporting_promise_test = (f, name) => promise_test(async t => { t.add_cleanup(() => internals.resetAttributionReporting()); - t.add_cleanup(() => resetAttributionReports(eventLevelReportsUrl)); - t.add_cleanup(() => resetAttributionReports(aggregatableReportsUrl)); - t.add_cleanup(() => resetAttributionReports(eventLevelDebugReportsUrl)); - t.add_cleanup(() => resetAttributionReports(aggregatableDebugReportsUrl)); - t.add_cleanup(() => resetAttributionReports(verboseDebugReportsUrl)); return f(t); }, name); @@ -28,20 +23,6 @@ const attributionDebugCookie = 'ar_debug=1;Secure;HttpOnly;SameSite=None;Path=/'; -/** - * Method to clear the stash. Takes the URL as parameter. This could be for - * event-level or aggregatable reports. - */ -const resetAttributionReports = url => { - // The view of the stash is path-specific (https://web-platform-tests.org/tools/wptserve/docs/stash.html), - // therefore the origin doesn't need to be specified. - url = `${url}?clear_stash=true`; - const options = { - method: 'POST', - }; - return fetch(url, options); -}; - const pipeHeaderPattern = /[,)]/g; // , and ) in pipe values must be escaped with \
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium index ab65625..1e4dce2 100644 --- a/third_party/libvpx/README.chromium +++ b/third_party/libvpx/README.chromium
@@ -1,8 +1,8 @@ Name: libvpx URL: https://chromium.googlesource.com/webm/libvpx Version: 0 -Date: Wednesday March 29 2023 -Revision: e47676c11cec52d242831414243ecd7a0e387dfb +Date: Tuesday April 11 2023 +Revision: cd2ec5c3dfe53e8ea389dbc32bd99a3201f7e7ec CPEPrefix: cpe:/a:webmproject:libvpx:1.13.0 License: BSD License File: source/libvpx/LICENSE
diff --git a/third_party/libvpx/source/config/ios/arm-neon/vp9_rtcd.h b/third_party/libvpx/source/config/ios/arm-neon/vp9_rtcd.h index e5d29ee..8b1eaf7 100644 --- a/third_party/libvpx/source/config/ios/arm-neon/vp9_rtcd.h +++ b/third_party/libvpx/source/config/ios/arm-neon/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/ios/arm64/vp9_rtcd.h b/third_party/libvpx/source/config/ios/arm64/vp9_rtcd.h index e5d29ee..8b1eaf7 100644 --- a/third_party/libvpx/source/config/ios/arm64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/ios/arm64/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h index f2fb000c..ea010dbe 100644 --- a/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h
@@ -85,6 +85,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -94,6 +95,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -104,6 +106,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm-neon-highbd/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm-neon-highbd/vp9_rtcd.h index f2405c3..acfadf8 100644 --- a/third_party/libvpx/source/config/linux/arm-neon-highbd/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm-neon-highbd/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h index e5d29ee..8b1eaf7 100644 --- a/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h index 69b95ff..3417d00 100644 --- a/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm64-highbd/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm64-highbd/vp9_rtcd.h index f2405c3..acfadf8 100644 --- a/third_party/libvpx/source/config/linux/arm64-highbd/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm64-highbd/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h b/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h index e5d29ee..8b1eaf7 100644 --- a/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h b/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h index 73dc436..02526ef 100644 --- a/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h b/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h index 81e659c..f42c6864 100644 --- a/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h
@@ -7627,7 +7627,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7639,7 +7648,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7651,7 +7669,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8141,6 +8168,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libvpx/source/config/linux/loongarch/vp9_rtcd.h b/third_party/libvpx/source/config/linux/loongarch/vp9_rtcd.h index 8713e79a..f9d9a9a 100644 --- a/third_party/libvpx/source/config/linux/loongarch/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/loongarch/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h b/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h index 73ead391..97754ac 100644 --- a/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h b/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h index 73ead391..97754ac 100644 --- a/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/ppc64/vp9_rtcd.h b/third_party/libvpx/source/config/linux/ppc64/vp9_rtcd.h index f67bdd7..1eb3bdd 100644 --- a/third_party/libvpx/source/config/linux/ppc64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/ppc64/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h b/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h index 2fcb283..907cab1 100644 --- a/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h
@@ -7704,7 +7704,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7716,7 +7725,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7728,7 +7746,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8221,6 +8248,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h b/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h +++ b/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h index 81e659c..f42c6864 100644 --- a/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h
@@ -7627,7 +7627,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7639,7 +7648,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7651,7 +7669,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8141,6 +8168,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h b/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h index 2fcb283..907cab1 100644 --- a/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h
@@ -7704,7 +7704,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7716,7 +7725,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7728,7 +7746,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8221,6 +8248,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libvpx/source/config/nacl/vp9_rtcd.h b/third_party/libvpx/source/config/nacl/vp9_rtcd.h index 73dc436..02526ef 100644 --- a/third_party/libvpx/source/config/nacl/vp9_rtcd.h +++ b/third_party/libvpx/source/config/nacl/vp9_rtcd.h
@@ -56,6 +56,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h index 0131159..5be23646 100644 --- a/third_party/libvpx/source/config/vpx_version.h +++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,8 +2,8 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 13 #define VERSION_PATCH 0 -#define VERSION_EXTRA "195-ge47676c11" +#define VERSION_EXTRA "223-gcd2ec5c3d" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.13.0-195-ge47676c11" -#define VERSION_STRING " v1.13.0-195-ge47676c11" +#define VERSION_STRING_NOSP "v1.13.0-223-gcd2ec5c3d" +#define VERSION_STRING " v1.13.0-223-gcd2ec5c3d"
diff --git a/third_party/libvpx/source/config/win/arm64/vp9_rtcd.h b/third_party/libvpx/source/config/win/arm64/vp9_rtcd.h index f2405c3..acfadf8 100644 --- a/third_party/libvpx/source/config/win/arm64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/win/arm64/vp9_rtcd.h
@@ -72,6 +72,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -81,6 +82,7 @@ int vp9_diamond_search_sad_neon(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h b/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h +++ b/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h index 81e659c..f42c6864 100644 --- a/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h
@@ -7627,7 +7627,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7639,7 +7648,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7651,7 +7669,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8141,6 +8168,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libvpx/source/config/win/x64/vp9_rtcd.h b/third_party/libvpx/source/config/win/x64/vp9_rtcd.h index 8dd07057..e9e663f 100644 --- a/third_party/libvpx/source/config/win/x64/vp9_rtcd.h +++ b/third_party/libvpx/source/config/win/x64/vp9_rtcd.h
@@ -84,6 +84,7 @@ int vp9_diamond_search_sad_c(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -93,6 +94,7 @@ int vp9_diamond_search_sad_avx(const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit, @@ -103,6 +105,7 @@ const struct macroblock* x, const struct search_site_config* cfg, struct mv* ref_mv, + uint32_t start_mv_sad, struct mv* best_mv, int search_param, int sad_per_bit,
diff --git a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h index 2fcb283..907cab1 100644 --- a/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h +++ b/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h
@@ -7704,7 +7704,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x16 vpx_variance8x16_sse2 +unsigned int vpx_variance8x16_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x16)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x4_c(const uint8_t* src_ptr, int src_stride, @@ -7716,7 +7725,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x4 vpx_variance8x4_sse2 +unsigned int vpx_variance8x4_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x4)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); unsigned int vpx_variance8x8_c(const uint8_t* src_ptr, int src_stride, @@ -7728,7 +7746,16 @@ const uint8_t* ref_ptr, int ref_stride, unsigned int* sse); -#define vpx_variance8x8 vpx_variance8x8_sse2 +unsigned int vpx_variance8x8_avx2(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); +RTCD_EXTERN unsigned int (*vpx_variance8x8)(const uint8_t* src_ptr, + int src_stride, + const uint8_t* ref_ptr, + int ref_stride, + unsigned int* sse); void vpx_ve_predictor_4x4_c(uint8_t* dst, ptrdiff_t stride, @@ -8221,6 +8248,15 @@ vpx_variance64x64 = vpx_variance64x64_sse2; if (flags & HAS_AVX2) vpx_variance64x64 = vpx_variance64x64_avx2; + vpx_variance8x16 = vpx_variance8x16_sse2; + if (flags & HAS_AVX2) + vpx_variance8x16 = vpx_variance8x16_avx2; + vpx_variance8x4 = vpx_variance8x4_sse2; + if (flags & HAS_AVX2) + vpx_variance8x4 = vpx_variance8x4_avx2; + vpx_variance8x8 = vpx_variance8x8_sse2; + if (flags & HAS_AVX2) + vpx_variance8x8 = vpx_variance8x8_avx2; } #endif
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium index 866d5419..793933489 100644 --- a/third_party/libxml/README.chromium +++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@ Name: libxml URL: http://xmlsoft.org -Version: 1061537efdf3874c91fd50d18f98c4b8a3518e52 +Version: 921796b06bde4927ddf142797848065bf427cc6a CPEPrefix: cpe:/a:xmlsoft:libxml2:2.11.0 License: MIT License File: src/Copyright
diff --git a/third_party/libxml/src/SAX2.c b/third_party/libxml/src/SAX2.c index b3dd89b1..4b09fa6e 100644 --- a/third_party/libxml/src/SAX2.c +++ b/third_party/libxml/src/SAX2.c
@@ -1632,12 +1632,15 @@ ctxt->validate = 0; } - - /* - * Split the full name into a namespace prefix and the tag name - */ - name = xmlSplitQName(ctxt, fullname, &prefix); - + if (ctxt->html) { + prefix = NULL; + name = xmlStrdup(fullname); + } else { + /* + * Split the full name into a namespace prefix and the tag name + */ + name = xmlSplitQName(ctxt, fullname, &prefix); + } /* * Note : the namespace resolution is deferred until the end of the
diff --git a/third_party/libxml/src/dict.c b/third_party/libxml/src/dict.c index 86c3f6d..d7fd1a0 100644 --- a/third_party/libxml/src/dict.c +++ b/third_party/libxml/src/dict.c
@@ -433,7 +433,8 @@ xmlDictComputeFastKey(const xmlChar *name, int namelen, int seed) { unsigned long value = seed; - if (name == NULL) return(0); + if ((name == NULL) || (namelen <= 0)) + return(value); value += *name; value <<= 5; if (namelen > 10) {
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c index 8dc6005..084de4a0 100644 --- a/third_party/libxml/src/parserInternals.c +++ b/third_party/libxml/src/parserInternals.c
@@ -321,6 +321,9 @@ if (buf == NULL) return(0); + /* Don't grow push parser buffer. */ + if (ctxt->progressive) + return(0); /* Don't grow memory buffers. */ if ((buf->encoder == NULL) && (buf->readcallback == NULL)) return(0); @@ -1234,9 +1237,11 @@ nbchars = xmlCharEncInput(in, 0); xmlBufResetInput(in->buffer, input); if (nbchars < 0) { + /* TODO: This could be an out of memory or an encoding error. */ xmlErrInternal(ctxt, "switching encoding: encoder error\n", NULL); + xmlHaltParser(ctxt); return (-1); } consumed = use - xmlBufUse(in->raw);
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c index 773f125e..479fa62 100644 --- a/third_party/libxml/src/valid.c +++ b/third_party/libxml/src/valid.c
@@ -5999,11 +5999,12 @@ if (elemDecl->etype == XML_ELEMENT_TYPE_ELEMENT) { if (state->exec != NULL) { ret = xmlRegExecPushString(state->exec, NULL, NULL); - if (ret == 0) { + if (ret <= 0) { xmlErrValidNode(ctxt, state->node, XML_DTD_CONTENT_MODEL, - "Element %s content does not follow the DTD, Expecting more child\n", + "Element %s content does not follow the DTD, Expecting more children\n", state->node->name, NULL,NULL); + ret = 0; } else { /* * previous validation errors should not generate
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index b958688..762386b 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: bda3a779bdd567e5b889ceebffa86cdd8faec725 +Version: 28f7498580d586ccd0855deaf45057f0498cf5a3 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/r8/dump_inputs.py b/third_party/r8/dump_inputs.py index a283249..354a9b0 100755 --- a/third_party/r8/dump_inputs.py +++ b/third_party/r8/dump_inputs.py
@@ -38,6 +38,8 @@ command += ' --dump-inputs' print('Running:', command) + # Ninja commands are meant to be run from within the build directory. + os.chdir(build_dir) sys.exit(os.system(command))
diff --git a/tools/android/build_speed/benchmark.py b/tools/android/build_speed/benchmark.py index 9dc5aae..95d0c26 100755 --- a/tools/android/build_speed/benchmark.py +++ b/tools/android/build_speed/benchmark.py
@@ -128,15 +128,16 @@ _BENCHMARKS = [ Benchmark( name='chrome_java_nosig', - from_string='sInstance = instance;', - to_string='sInstance = instance;String test = "Test";', + from_string='sInstanceForTesting = instance;', + to_string='sInstanceForTesting = instance;String test = "Test";', change_file= 'chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java', ), Benchmark( name='chrome_java_sig', - from_string='AppHooksImpl sInstance;', - to_string='AppHooksImpl sInstance;public void NewInterfaceMethod(){}', + from_string='AppHooksImpl sInstanceForTesting;', + to_string= + 'AppHooksImpl sInstanceForTesting;public void NewInterfaceMethod(){}', change_file= 'chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java', ),
diff --git a/tools/binary_size/libsupersize/apkanalyzer.py b/tools/binary_size/libsupersize/apkanalyzer.py index 7071952d..1c187ce2 100644 --- a/tools/binary_size/libsupersize/apkanalyzer.py +++ b/tools/binary_size/libsupersize/apkanalyzer.py
@@ -78,7 +78,7 @@ return parallel.CallOnThread(subprocess.run, args, env=env, - encoding='utf8', + encoding='utf-8', capture_output=True, check=True) @@ -432,7 +432,7 @@ def _StringSymbolsFromDexFile(apk_path, dexfile, source_map, class_deobfuscation_map): if not dexfile: - return [], 0 + return [] logging.info('Extractng string symbols from %s', apk_path) # Code strings: Strings accessed via class -> method -> code -> string. @@ -440,19 +440,17 @@ fresh_string_idx_set = set(range(len(dexfile.string_data_item_list))) lambda_normalizer = LambdaNormalizer() object_path = str(apk_path) - dex_string_data_size = 0 dex_string_symbols = [] string_iter = _GenDexStringsUsedByClasses(dexfile, class_deobfuscation_map) for string_idx, size, decoded_string, string_user_class_names in string_iter: fresh_string_idx_set.remove(string_idx) - dex_string_data_size += size num_aliases = len(string_user_class_names) aliases = [] for class_name in string_user_class_names: outer_class, _ = lambda_normalizer.ExtractOuterClassAndDesugarLambda( class_name) full_name = string_extract.GetNameOfStringLiteralBytes( - decoded_string.encode('utf-8')) + decoded_string.encode('utf-8', errors='surrogatepass')) source_path = (source_map.get(outer_class, '') or _MakeFakeSourcePath(class_name)) sym = models.Symbol(models.SECTION_DEX, @@ -483,35 +481,30 @@ fresh_string_idx_set -= string_idx_set logging.info('Counted %d %s strings among %d found', len(string_idx_set), name, old_count) - total_size = 0 if string_idx_set: # Each string has +4 for pointer. size = sum(dexfile.string_data_item_list[string_idx].byte_size for string_idx in string_idx_set) + 4 * len(string_idx_set) - total_size += size sym = models.Symbol(models.SECTION_DEX, size, full_name=f'** .dex ({name} strings)') dex_string_symbols.append(sym) - return total_size # Type strings. type_string_idx_set = {i.descriptor_idx for i in dexfile.type_id_item_list} - dex_string_data_size += _AddAggregateStringSymbol('type', type_string_idx_set) + _AddAggregateStringSymbol('type', type_string_idx_set) # Method and field strings. method_string_idx_set = {i.name_idx for i in dexfile.method_id_item_list} field_string_idx_set = {i.name_idx for i in dexfile.field_id_item_list} - dex_string_data_size += _AddAggregateStringSymbol( - 'method and field', method_string_idx_set | field_string_idx_set) + _AddAggregateStringSymbol('method and field', + method_string_idx_set | field_string_idx_set) # Prototype strings. proto_string_idx_set = {i.shorty_idx for i in dexfile.proto_id_item_list} - dex_string_data_size += _AddAggregateStringSymbol('prototype', - proto_string_idx_set) + _AddAggregateStringSymbol('prototype', proto_string_idx_set) - return dex_string_symbols, dex_string_data_size - + return dex_string_symbols def _ParseMainDexfileInApk(apk_path): with zipfile.ZipFile(apk_path) as src_zip: @@ -531,7 +524,8 @@ def CreateDexSymbols(apk_path, apk_analyzer_async_result, dex_total_size, - class_deobfuscation_map, size_info_prefix): + class_deobfuscation_map, size_info_prefix, + track_string_literals): """Creates DEX symbols given apk_analyzer output. Args: @@ -540,6 +534,7 @@ dex_total_size: Sum of the sizes of all .dex files in the apk. class_deobfuscation_map: Map from obfuscated names to class names. size_info_prefix: Path such as: out/Release/size-info/BaseName. + track_string_literals: Create symbols for string literals. Returns: A tuple of (section_ranges, raw_symbols, metrics_by_file), where @@ -570,20 +565,25 @@ dex_method_symbols, dex_other_symbols = _SymbolsFromNodes(nodes, source_map) dex_path, dexfile = _ParseMainDexfileInApk(apk_path) - # TODO(huangs): Handle the case where an APK contains multiple DEX files. - dex_string_symbols, dex_string_data_size = _StringSymbolsFromDexFile( - apk_path, dexfile, source_map, class_deobfuscation_map) - if dex_string_symbols: - logging.info('Converting excessive DEX string aliases into shared-path ' - 'symbols') - archive_util.CompactLargeAliasesIntoSharedSymbols( - dex_string_symbols, _DEX_STRING_MAX_SAME_NAME_ALIAS_COUNT) + + if track_string_literals: + # TODO(huangs): Handle the case where an APK contains multiple DEX files. + dex_string_symbols = _StringSymbolsFromDexFile(apk_path, dexfile, + source_map, + class_deobfuscation_map) + if dex_string_symbols: + logging.info('Converting excessive DEX string aliases into shared-path ' + 'symbols') + archive_util.CompactLargeAliasesIntoSharedSymbols( + dex_string_symbols, _DEX_STRING_MAX_SAME_NAME_ALIAS_COUNT) + else: + dex_string_symbols = [] dex_method_size = round(sum(s.pss for s in dex_method_symbols)) dex_other_size = round(sum(s.pss for s in dex_other_symbols)) + dex_other_size += round(sum(s.pss for s in dex_string_symbols)) - unattributed_dex = (dex_total_size - dex_method_size - dex_other_size - - dex_string_data_size) + unattributed_dex = dex_total_size - dex_method_size - dex_other_size # Compare against -5 instead of 0 to guard against round-off errors. assert unattributed_dex >= -5, ( 'sum(dex_symbols.size) > filesize(classes.dex). {} vs {}'.format(
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index 95c00dc..b526a4ff 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -87,6 +87,8 @@ size_info_prefix: str = None # Whether to break down classes.dex. analyze_dex: bool = True + # Whether to create symbols for each string literal. + track_string_literals: bool = True # Dict of apk_path -> source_path, provided by json config. path_defaults: dict = None # Component to use for symbols when not specified by DIR_METADATA, provided by @@ -379,7 +381,8 @@ apkanalyzer.CreateDexSymbols(apk_spec.apk_path, apk_analyzer_results[container_name], dex_total_size, class_deobfuscation_map, - apk_spec.size_info_prefix)) + apk_spec.size_info_prefix, + apk_spec.track_string_literals)) add_syms(section_ranges, dex_symbols) metrics_by_file.update(dex_metrics_by_file) if pak_spec: @@ -487,12 +490,6 @@ help='Regular expression for which containers to create') group = parser.add_argument_group(title='Analysis Options for Native Code') - group.add_argument('--no-string-literals', - dest='track_string_literals', - default=True, - action='store_false', - help='Disable breaking down "** merge strings" into more ' - 'granular symbols.') group.add_argument('--no-map-file', dest='ignore_linker_map', action='store_true', @@ -528,6 +525,10 @@ help='Custom path to the root source directory.') group.add_argument('--output-directory', help='Path to the root build directory.') + group.add_argument('--no-string-literals', + action='store_true', + help=('Do not create symbols for string literals ' + '(applies to DEX and Native).')) if is_top_args: group.add_argument('--json-config', help='Path to a supersize.json.') group.add_argument('--no-output-directory', @@ -865,6 +866,8 @@ 'size-info', os.path.basename(apk_prefix)) apk_spec.analyze_dex = analyze_dex + apk_spec.track_string_literals = not (top_args.no_string_literals + or sub_args.no_string_literals) apk_spec.default_component = json_config.DefaultComponentForSplit( split_name) apk_spec.path_defaults = json_config.ApkPathDefaults() @@ -877,7 +880,7 @@ apk_pak_paths = [ f.filename for f in apk_infolist if f.filename.endswith('.pak') ] - if apk_pak_paths or sub_args.pak_files: + if not top_args.no_output_directory and (apk_pak_paths or sub_args.pak_files): pak_spec = PakSpec(pak_paths=sub_args.pak_files, pak_info_path=sub_args.pak_info_file, apk_pak_paths=apk_pak_paths) @@ -899,8 +902,8 @@ map_path=sub_args.map_file or aux_map_file, abi_filters=abi_filters, auto_abi_filters=auto_abi_filters, - track_string_literals=(top_args.track_string_literals - and sub_args.track_string_literals), + track_string_literals=not (top_args.no_string_literals + or sub_args.no_string_literals), ignore_linker_map=(top_args.ignore_linker_map or sub_args.ignore_linker_map), json_config=json_config, @@ -1156,7 +1159,7 @@ if top_args.check_data_quality: logging.info('Checking data quality') - data_quality.CheckDataQuality(size_info, top_args.track_string_literals) + data_quality.CheckDataQuality(size_info, not top_args.no_string_literals) duration = (time.time() - start_time) / 60 if duration > 10: raise data_quality.QualityCheckError(
diff --git a/tools/binary_size/libsupersize/dex_disassembly.py b/tools/binary_size/libsupersize/dex_disassembly.py index 35ec72d..a4021497 100755 --- a/tools/binary_size/libsupersize/dex_disassembly.py +++ b/tools/binary_size/libsupersize/dex_disassembly.py
@@ -53,7 +53,7 @@ 'com.android.tools.r8.Disassemble', '--pg-map', mapping, tmp_file.name ] try: - r8_output = subprocess.check_output(cmd, encoding='utf8') + r8_output = subprocess.check_output(cmd, encoding='utf-8') except subprocess.CalledProcessError: logging.debug('Running R8 failed on APK: %s', apk_path)
diff --git a/tools/binary_size/libsupersize/dex_parser.py b/tools/binary_size/libsupersize/dex_parser.py index a7dc9f8..fe18282a 100755 --- a/tools/binary_size/libsupersize/dex_parser.py +++ b/tools/binary_size/libsupersize/dex_parser.py
@@ -570,7 +570,7 @@ if bytecode[0] in (0x1a, 0x1b): # 1a 21c const-string vAA, string@BBBB # 1b 31c const-string/jumbo vAA, string@BBBBBBBB - fmt = '<H' if bytecode[0] == 0x1a else '<Q' + fmt = '<H' if bytecode[0] == 0x1a else '<L' yield struct.unpack_from(fmt, bytecode, 2)[0] @staticmethod @@ -631,7 +631,8 @@ for (i, string_data_item) in enumerate(self._dexfile.string_data_item_list): # Some strings are likely to be non-ascii (vs. methods/classes). s = string_data_item.data - rep_str = repr(s) if s.isprintable() else s.encode('utf-8') + rep_str = (repr(s) if s.isprintable() else s.encode( + 'utf-8', errors='surrogatepass')) print('string(%08X): %s' % (i, rep_str))
diff --git a/tools/binary_size/libsupersize/file_format.py b/tools/binary_size/libsupersize/file_format.py index 044ae7ac..92b8039 100644 --- a/tools/binary_size/libsupersize/file_format.py +++ b/tools/binary_size/libsupersize/file_format.py
@@ -359,7 +359,7 @@ w.WriteNumberList(x[0] for x in symbols_with_disassembly) for _, disassembly in symbols_with_disassembly: - disassembly_bytes = disassembly.encode('utf-8') + disassembly_bytes = disassembly.encode('utf-8', errors='surrogatepass') w.WriteBytes(b'%d\n' % len(disassembly_bytes)) w.WriteBytes(disassembly_bytes)
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 4903479..399d0ed9 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -725,6 +725,7 @@ 'build1': 'gpu_tests_release_bot_reclient', 'build2': 'gpu_tests_release_bot_remote_links_small_reclient', }, + 'Linux Builder (canonical wd) (reclient compare)': 'gpu_tests_debug_bot_reclient', 'Linux Builder reclient staging': 'gpu_tests_release_bot_reclient', 'Linux Builder reclient staging untrusted': 'gpu_tests_release_bot_reclient', 'Linux Builder reclient test': 'gpu_tests_release_bot_reclient',
diff --git a/tools/mb/mb_config_expectations/chromium.reclient.fyi.json b/tools/mb/mb_config_expectations/chromium.reclient.fyi.json index 265a1a3..5f18e7a 100644 --- a/tools/mb/mb_config_expectations/chromium.reclient.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.reclient.fyi.json
@@ -47,6 +47,16 @@ } } }, + "Linux Builder (canonical wd) (reclient compare)": { + "gn_args": { + "ffmpeg_branding": "Chrome", + "is_component_build": true, + "is_debug": true, + "proprietary_codecs": true, + "symbol_level": 1, + "use_remoteexec": true + } + }, "Linux Builder reclient staging": { "gn_args": { "dcheck_always_on": false,
diff --git a/tools/memory/partition_allocator/pa_buckets_inspect.cc b/tools/memory/partition_allocator/pa_buckets_inspect.cc index a8f631b..4ecb28b 100644 --- a/tools/memory/partition_allocator/pa_buckets_inspect.cc +++ b/tools/memory/partition_allocator/pa_buckets_inspect.cc
@@ -60,9 +60,10 @@ size_t total_memory = 0; for (const auto& pair : live_allocs) { total_memory += pair.second; - // We use the "denser" (i.e. default) bucket distribution here so we can see - // how allocations currently happen in chrome. - const auto index = BucketIndexLookup::GetIndexForDenserBuckets(pair.second); + // We use the "default" bucket distribution here so we can see how + // allocations currently happen in chrome. + const auto index = + BucketIndexLookup::GetIndexForDefaultBuckets(pair.second); alloc_size[index] += pair.second; alloc_nums[index]++; }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index e8136ff..22af686c 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -30407,6 +30407,41 @@ </description> </action> +<action name="SidePanel.Companion.Pinned.BySidePanelHeaderButton"> + <owner>corising@chromium.org</owner> + <owner>chrome-desktop-ui-sea@google.com</owner> + <description> + Recorded when the companion side panel entry is pinned via the pin button in + the side panel header. + </description> +</action> + +<action name="SidePanel.Companion.Shown"> + <owner>corising@chromium.org</owner> + <owner>chrome-desktop-ui-sea@google.com</owner> + <description> + Recorded when the companion side panel entry is shown. + </description> +</action> + +<action name="SidePanel.Companion.Unpinned.ByPinnedButtonContextMenu"> + <owner>corising@chromium.org</owner> + <owner>chrome-desktop-ui-sea@google.com</owner> + <description> + Recorded when the companion side panel entry is unpinned via the context + menu from the pinned companion button. + </description> +</action> + +<action name="SidePanel.Companion.Unpinned.BySidePanelHeaderButton"> + <owner>corising@chromium.org</owner> + <owner>chrome-desktop-ui-sea@google.com</owner> + <description> + Recorded when the companion side panel entry is unpinned via the pin button + in the side panel header. + </description> +</action> + <action name="SidePanel.Feed.Shown"> <owner>jianli@chromium.org</owner> <owner>chrome-desktop-ui-sea@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 12658c4..d9510696 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -25947,6 +25947,7 @@ <int value="5" label="Password check - Automated password change"/> <int value="6" label="Incognito reauthentication flow"/> <int value="7" label="Passwords in settings"/> + <int value="8" label="Local card autofill reauthentication flow"/> </enum> <enum name="DeviceEnumerationResult"> @@ -42069,6 +42070,7 @@ <int value="4539" label="GamepadTouchPosition"/> <int value="4540" label="GamepadTouchSurfaceDimension"/> <int value="4541" label="SandboxViaFencedFrame"/> + <int value="4542" label="VisibilityStateObserver"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -59178,7 +59180,6 @@ <int value="-1503745396" label="UnifiedPasswordManagerReenrollment:disabled"/> <int value="-1500811568" label="MuteNotificationSnoozeAction:disabled"/> <int value="-1499989506" label="FedCmWithoutThirdPartyCookies:disabled"/> - <int value="-1498981749" label="AccessibilityFormControlsAXMode:disabled"/> <int value="-1498681588" label="AndroidWebContentsDarkMode:enabled"/> <int value="-1498582719" label="ColorProviderRedirectionForThemeProvider:enabled"/> @@ -59644,6 +59645,7 @@ <int value="-1268836676" label="disable-out-of-process-pdf"/> <int value="-1268452697" label="CastStreamingAv1:disabled"/> <int value="-1267958145" label="disable-pdf-material-ui"/> + <int value="-1266934701" label="AccessibilityAXModes:enabled"/> <int value="-1265627803" label="WebAppEnableManifestId:enabled"/> <int value="-1262730949" label="EnableDspHotword:enabled"/> <int value="-1262303946" label="SubresourceRedirectPreviews:disabled"/> @@ -60967,6 +60969,7 @@ <int value="-555341956" label="AutofillSaveAndFillVPA:enabled"/> <int value="-552425893" label="ProjectorAnnotator:disabled"/> <int value="-552407626" label="ContextualSearchNewSettings:disabled"/> + <int value="-551664909" label="DrawEdgeToEdge:enabled"/> <int value="-551434067" label="QuickActionSearchWidgetAndroidDinoVariant:enabled"/> <int value="-551334994" label="NotificationPermissionVariant:enabled"/> @@ -61845,6 +61848,7 @@ <int value="-64839201" label="SyncUSSAutofillWalletData:disabled"/> <int value="-64824628" label="VizHitTestSurfaceLayer:disabled"/> <int value="-64747770" label="IncognitoDownloadsWarning:disabled"/> + <int value="-64293934" label="AccessibilityAXModes:disabled"/> <int value="-63207112" label="NtpSingleRowShortcuts:disabled"/> <int value="-59530055" label="ChromeVoxArcSupport:enabled"/> <int value="-59401847" label="ContentSuggestionsLargeThumbnail:disabled"/> @@ -62527,7 +62531,6 @@ <int value="307543404" label="disable-team-drives"/> <int value="307670929" label="enable-ambient-authentication-in-guest-session"/> - <int value="308972768" label="AccessibilityFormControlsAXMode:enabled"/> <int value="309795366" label="ScrollUnification:disabled"/> <int value="309861115" label="AutofillEnableNewCardArtAndNetworkImages:enabled"/> @@ -64165,6 +64168,7 @@ <int value="1214219155" label="gamepad-polling-interval"/> <int value="1214246730" label="TerminalAlternativeRenderer:enabled"/> <int value="1214455758" label="VideoRotateToFullscreen:disabled"/> + <int value="1215512170" label="DrawEdgeToEdge:disabled"/> <int value="1215531732" label="OmniboxUIExperiments:disabled"/> <int value="1215768255" label="AutofillCreditCardLocalCardMigration:enabled"/> <int value="1216286283" label="tint-composited-content"/> @@ -69858,6 +69862,7 @@ <int value="4" label="Tab switcher button"/> <int value="5" label="Home button"/> <int value="6" label="Profile button"/> + <int value="7" label="Logo with doodle"/> </enum> <enum name="MojoInterfaceName"> @@ -74190,6 +74195,8 @@ <int value="167" label="WebAppSettings App Launch"/> <int value="168" label="EOL Incentive"/> <int value="169" label="Hotspot"/> + <int value="170" label="Geolocation Switch"/> + <int value="171" label="Multi Capture On Login"/> </enum> <enum name="NotificationDatabaseStatus"> @@ -78450,6 +78457,13 @@ <int value="5" label="Discarded"/> </enum> +<enum name="PageTransitionForVisitedLinks"> + <int value="0" label="Other"/> + <int value="1" label="Link"/> + <int value="2" label="Typed"/> + <int value="3" label="ManualSubframe"/> +</enum> + <enum name="PageUsed"> <int value="0" label="Discarded"/> <int value="1" label="Used"/> @@ -83016,6 +83030,23 @@ label="Prefetch request was redirected to Signed Exchange handler"/> </enum> +<enum name="PrefetchRedirectNetworkContextTransition"> + <int value="0" label="Stayed in Default network context"/> + <int value="1" label="Switched from Default to Isolated network context"/> + <int value="2" label="Switched from Isolated to Default network context"/> + <int value="3" label="Stayed in Isolated network context"/> +</enum> + +<enum name="PrefetchRedirectResult"> + <int value="0" label="Success, Redirect followed"/> + <int value="1" label="Failed, Null prefetch"/> + <int value="2" label="Failed, Redirects disabled"/> + <int value="3" label="Failed, Invalid HTTP method"/> + <int value="4" label="Failed, Invalid HTTP response code"/> + <int value="5" label="Failed, Invalid change in network context"/> + <int value="6" label="Failed, Redirect was ineligible"/> +</enum> + <enum name="PrefetchReuseState"> <int value="0" label="0"> Reused fresh cache: outside time window and already reused @@ -86184,6 +86215,7 @@ <int value="29" label="kLacrosMainProfile"/> <int value="30" label="kProfileCreationSamlFlow"/> <int value="31" label="kDriveFsNativeMessageHostLacros"/> + <int value="32" label="kProfileDeletionProcess"/> </enum> <enum name="ProfileMenuActionableItem"> @@ -95910,6 +95942,14 @@ <int value="3" label="Navigation API intercept"/> </enum> +<enum name="SingleWebFeedEntryPoint"> + <int value="0" label="Menu"/> + <int value="1" label="Attribtuion"/> + <int value="2" label="Recommendation"/> + <int value="3" label="Group Header"/> + <int value="4" label="Other"/> +</enum> + <enum name="SiteEngagementLevel"> <int value="0" label="None"/> <int value="1" label="Minimal"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml index bca3027..46aa5736 100644 --- a/tools/metrics/histograms/metadata/accessibility/histograms.xml +++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -211,9 +211,10 @@ <owner>chrome-a11y-core@google.com</owner> <summary> Tracks the number of AccessibilityEvents dropped when the OnDemand - accessibility services feature is enabled, and the ComputeAXMode feature is - enabled, and the number of events dropped is 100%. Tracks for when the - AXMode is set to {AXMode}. Recorded a the end of a session. + accessibility services feature is enabled, and the AccessibilityAXModes + feature is enabled, and the number of events dropped is 100%. Tracks for + when the AXMode is set to {AXMode}. Recorded at the end of a session. + Updated in M114 to add FormControls variant. </summary> <token key="AXMode"> <variant name="Basic" @@ -221,6 +222,9 @@ <variant name="Complete" summary="kAXModeComplete - Includes NativeAPIs, WebContents, InlineTextBoxes, ScreenReader, and HTML"/> + <variant name="FormControls" + summary="kAXModeFormControls - Includes only NativeAPIs, WebContents, + HTML, and ExperimentalFormControls"/> </token> </histogram> @@ -242,9 +246,9 @@ <owner>chrome-a11y-core@google.com</owner> <summary> Tracks the percentage of AccessibilityEvents dropped when the OnDemand - accessibility services feature is enabled, and the ComputeAXMode feature is - enabled. Tracks for when the AXMode is set to {AXMode}. Recorded at the end - of a session. + accessibility services feature is enabled, and the AccessibilityAXModes + feature is enabled. Tracks for when the AXMode is set to {AXMode}. Recorded + at the end of a session. Updated in M114 to add FormControls variant. </summary> <token key="AXMode"> <variant name="Basic" @@ -252,6 +256,9 @@ <variant name="Complete" summary="kAXModeComplete - Includes NativeAPIs, WebContents, InlineTextBoxes, ScreenReader, and HTML"/> + <variant name="FormControls" + summary="kAXModeFormControls - Includes only NativeAPIs, WebContents, + HTML, and ExperimentalFormControls"/> </token> </histogram>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 249ccc0d..1a15faf1 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -4681,19 +4681,6 @@ </summary> </histogram> -<histogram name="Android.WebView.SafeMode.ActionsCount" - units="SafeMode actions" expires_after="2023-04-28"> - <owner>ntfschr@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - Records the number of SafeMode actions WebView received from the - SafeModeService. This is only recorded once during startup if SafeMode is - enabled (see "Android.WebView.SafeMode.SafeModeEnabled"), - otherwise this is not recorded at all (because there were no SafeMode - actions to execute). This is recorded before executing any SafeMode actions. - </summary> -</histogram> - <histogram name="Android.WebView.SafeMode.CheckStateBlockingTime" units="ms" expires_after="2023-04-28"> <owner>ntfschr@chromium.org</owner> @@ -4706,7 +4693,7 @@ </histogram> <histogram name="Android.WebView.SafeMode.ExecutionResult" - enum="AndroidWebViewSafeModeResult" expires_after="2023-04-28"> + enum="AndroidWebViewSafeModeResult" expires_after="2024-01-28"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary> @@ -4721,7 +4708,7 @@ </histogram> <histogram name="Android.WebView.SafeMode.QueryAndExecuteBlockingTime" - units="ms" expires_after="2023-04-28"> + units="ms" expires_after="2024-01-28"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary> @@ -4734,7 +4721,7 @@ </histogram> <histogram name="Android.WebView.SafeMode.SafeModeEnabled" - enum="BooleanEnabled" expires_after="2023-08-20"> + enum="BooleanEnabled" expires_after="2024-01-28"> <owner>ntfschr@chromium.org</owner> <owner>src/android_webview/OWNERS</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 2c4d8e2..a6052a2 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1651,6 +1651,16 @@ </summary> </histogram> +<histogram + name="Autofill.FastCheckout.CapabilitiesFetcher.HttpResponseAndNetErrorCode" + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-08-15"> + <owner>vizcay@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + The http response code or net error code returned on a query. + </summary> +</histogram> + <histogram name="Autofill.FastCheckout.CapabilitiesFetcher.ParsingResult" enum="FastCheckoutCapabilitiesParsingResult" expires_after="2023-08-15"> <owner>bwolfgang@google.com</owner> @@ -1661,6 +1671,16 @@ </summary> </histogram> +<histogram name="Autofill.FastCheckout.CapabilitiesFetcher.ResponseTime" + units="ms" expires_after="2023-08-15"> + <owner>vizcay@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + Response time for fetching FastCheckout capabilities. The time is recorded + for both successful and failed fetches. + </summary> +</histogram> + <histogram name="Autofill.FastCheckout.RunOutcome" enum="FastCheckoutRunOutcome" expires_after="2023-08-15"> <owner>bwolfgang@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml index c540442..0301ce8 100644 --- a/tools/metrics/histograms/metadata/browser/histograms.xml +++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -26,6 +26,7 @@ <variant name="AboutThisSite"/> <variant name="Assistant"/> <variant name="Bookmarks"/> + <variant name="Companion"/> <variant name="CustomizeChrome"/> <variant name="Extension"/> <variant name="Feed"/>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml index 4a438259..528e1c4 100644 --- a/tools/metrics/histograms/metadata/content/histograms.xml +++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -1916,6 +1916,15 @@ </token> </histogram> +<histogram name="ContentSuggestions.SingleWebFeed.EntryPoint" + enum="SingleWebFeedEntryPoint" expires_after="2023-07-23"> + <owner>jeffreyochen@chromium.org</owner> + <owner>creator@chromium.org</owner> + <summary> + Android: reports the entry point used to launch the single web feed view. + </summary> +</histogram> + <histogram name="ContentSuggestions.{FeedType}.CardIndexOnSwitch" units="index" expires_after="2023-04-21"> <owner>adamta@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/gcm/histograms.xml b/tools/metrics/histograms/metadata/gcm/histograms.xml index 83bfaef..4f495f10 100644 --- a/tools/metrics/histograms/metadata/gcm/histograms.xml +++ b/tools/metrics/histograms/metadata/gcm/histograms.xml
@@ -49,15 +49,6 @@ </summary> </histogram> -<histogram name="GCM.Crypto.CreateKeySuccessRate" enum="BooleanSuccess" - expires_after="M88"> - <owner>peter@chromium.org</owner> - <owner>zea@chromium.org</owner> - <summary> - Success rate of writing new keying material to the GCM key store. - </summary> -</histogram> - <histogram name="GCM.Crypto.DecryptMessageResult" enum="GCMDecryptionResult" expires_after="never"> <!-- expires-never: Used to monitor push encryption and debug issues. --> @@ -70,46 +61,6 @@ </summary> </histogram> -<histogram name="GCM.Crypto.GCMDatabaseUpgradeResult" enum="Boolean" - expires_after="2021-07-21"> - <owner>nator@chromium.org</owner> - <owner>peter@chromium.org</owner> - <owner>rayankans@chromium.org</owner> - <summary> - Result of upgrading GCM Key Store Database from deprecated format to current - format. We upgrade the GCM Key store when it first initialized, if it - contains any EncryptionData object with a KeyPair in it, and then record - whether the upgrade was successful in this metric. - </summary> -</histogram> - -<histogram name="GCM.Crypto.GetKeySuccessRate" enum="BooleanSuccess" - expires_after="M88"> - <owner>peter@chromium.org</owner> - <owner>zea@chromium.org</owner> - <summary> - Success rate of reading keying material from the GCM key store. - </summary> -</histogram> - -<histogram name="GCM.Crypto.InitKeyStoreSuccessRate" enum="BooleanSuccess" - expires_after="M94"> - <owner>peter@chromium.org</owner> - <owner>zea@chromium.org</owner> - <summary> - Success rate of initializing the LevelDB back-end of the GCM key store. - </summary> -</histogram> - -<histogram name="GCM.Crypto.LoadKeyStoreSuccessRate" enum="BooleanSuccess" - expires_after="M94"> - <owner>peter@chromium.org</owner> - <owner>zea@chromium.org</owner> - <summary> - Success rate of loading existing keying material in the GCM key store. - </summary> -</histogram> - <histogram name="GCM.Crypto.RemoveKeySuccessRate" enum="BooleanSuccess" expires_after="M94"> <owner>peter@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml index a778251..869f2a43 100644 --- a/tools/metrics/histograms/metadata/history/histograms.xml +++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -2554,6 +2554,29 @@ </summary> </histogram> +<histogram name="History.VisitedLinks.VisitLoggedFromMainFrame" units="boolean" + expires_after="2024-04-11"> + <owner>kyraseevers@chromium.org</owner> + <owner>brgoldstein@google.com</owner> + <summary> + For each visit being logged in the VisitedLinks hashtable by the + HistoryService, record whether its ui::PageTransition type came from the + main frame. + </summary> +</histogram> + +<histogram name="History.VisitedLinks.VisitLoggedFromTransition" + enum="PageTransitionForVisitedLinks" expires_after="2024-04-11"> + <owner>kyraseevers@chromium.org</owner> + <owner>brgoldstein@google.com</owner> + <summary> + For each visit being logged in the VisitedLinks hashtable by the + HistoryService, record its PageTransitionForVisitedLinks type. This enum + represents our ui::PageTransition types of interest (link vs. typed vs. + subframe) and a catch-all other bucket. + </summary> +</histogram> + <histogram name="History.VisitTableCount" units="visits" expires_after="2023-08-20"> <owner>mpearson@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml index e330c13f..21111fd 100644 --- a/tools/metrics/histograms/metadata/memory/histograms.xml +++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -767,6 +767,34 @@ </summary> </histogram> +<histogram name="Memory.Experimental.MacAvailableMemoryPercentFreePageCache" + units="%" expires_after="2023-09-22"> + <owner>anthonyvd@chromium.org</owner> + <owner>catan-team@chromium.org</owner> + <summary> + The percentage of physical memory on the system considered + "available" by base::SysInfo::AmountOfAvailablePhysicalMemory() + and base::SysInfo::AmountOfPhysicalMemory(). The amount of + "file-backed" memory is subtracted from the amount of available + memory to attempt to estimate the available memory, counting the Page Cache + as available. + + Recorded every 2 minutes on MacOS. + </summary> +</histogram> + +<histogram name="Memory.Experimental.MacFileBackedMemoryMB" units="MB" + expires_after="2023-09-22"> + <owner>anthonyvd@chromium.org</owner> + <owner>catan-team@chromium.org</owner> + <summary> + The amount of memory reported as "file-backed" or associated to + "external_pages" by vm_stat. + + Recorded every 2 minutes on MacOS. + </summary> +</histogram> + <histogram base="true" name="Memory.Experimental.NetworkService2" units="MiB" expires_after="2024-01-10"> <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index 869b5d63..04e0900 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -3679,7 +3679,8 @@ <histogram name="Network.Wifi.Synced.Connection.FailureReason" enum="ConnectionFailureReason" expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the failure reason for all connection attempts, manual or automatic, to Wi-Fi networks which were added from Chrome Sync. @@ -3689,7 +3690,8 @@ <histogram name="Network.Wifi.Synced.Connection.Result" enum="BooleanSuccess" expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the result of all connection attempts, manual or automatic, to Wi-Fi networks which were added from Chrome Sync. @@ -3712,7 +3714,8 @@ <histogram name="Network.Wifi.Synced.ManualConnection.FailureReason" enum="ConnectionFailureReason" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the failure reason for manual connection attempts to Wi-Fi networks which were added from Chrome Sync. @@ -3722,7 +3725,8 @@ <histogram name="Network.Wifi.Synced.ManualConnection.Result" enum="BooleanSuccess" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the result of manual connection attempts to Wi-Fi networks which were added from Chrome Sync. @@ -3732,7 +3736,8 @@ <histogram name="Network.Wifi.Synced.TotalCount" units="units" expires_after="2023-08-20"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the total number of Wi-Fi networks which are stored in Chrome Sync for the active user. @@ -3742,7 +3747,8 @@ <histogram name="Network.Wifi.Synced.UpdateOperation.FailureReason" enum="ConnectionFailureReason" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the failure reason for update attempts to synced Wi-Fi networks. This includes create/modify/remove operations. Each retry is @@ -3754,6 +3760,7 @@ name="Network.Wifi.Synced.UpdateOperation.GenerateLocalNetworkConfig.Result" enum="BooleanSuccess" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> + <owner>crisrael@google.com</owner> <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the success or failure to generate a local @@ -3764,7 +3771,8 @@ <histogram name="Network.Wifi.Synced.UpdateOperation.Result" enum="BooleanSuccess" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric that tracks the result of update attempts to synced Wi-Fi networks. This includes create/modify/remove operations. failures are only @@ -3775,7 +3783,8 @@ <histogram name="Network.Wifi.Synced.ZeroNetworksEligibleForSync.Reason" enum="NetworkEligibilityStatus" expires_after="2023-06-18"> <owner>jonmann@chromium.org</owner> - <owner>better-together-dev@google.com</owner> + <owner>crisrael@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> <summary> ChromeOS metric logged for users who have the feature enabled but have zero networks eligible for sync. Tracks the reasons why none of the networks are
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml index 824c6f3..6e37f5e 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -1082,8 +1082,9 @@ consistent with MobileOmniboxUse. For tab switcher button: is recorded every time when user clicks on the tab switcher button. For home button: is recorded when user clicks on the home button. For profile button: is - recorded when user clicks on the profile button. The histogram is logged on - New tab page and is Android-only. + recorded when user clicks on the profile button. For doodle logo: is + recorded every time when user clicks on the doodle and navigates to another + website. The histogram is logged on New tab page and is Android-only. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 01e6ef3..da31f28 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -548,6 +548,17 @@ </token> </histogram> +<histogram name="PasswordManager.AccountStorageOptInSwitchFlipped" + enum="Boolean" expires_after="2023-10-06"> + <owner>victorvianna@google.com</owner> + <owner>src/components/password_manager/OWNERS</owner> + <summary> + Records the new state (enabled/disabled) of the account storage opt-in + switch in password settings. Recorded when the switch is flipped by the + user, only on iOS. + </summary> +</histogram> + <histogram name="PasswordManager.AccountStorageUserStateDuration{UserSyncingType}" units="ms" expires_after="2023-08-12">
diff --git a/tools/metrics/histograms/metadata/prefetch/histograms.xml b/tools/metrics/histograms/metadata/prefetch/histograms.xml index 16936187..3cefa25 100644 --- a/tools/metrics/histograms/metadata/prefetch/histograms.xml +++ b/tools/metrics/histograms/metadata/prefetch/histograms.xml
@@ -147,6 +147,17 @@ </summary> </histogram> +<histogram name="PrefetchProxy.AfterClick.RedirectChainSize" units="count" + expires_after="2023-09-10"> + <owner>curranmax@chromium.org</owner> + <owner>ryansturm@chromium.org</owner> + <owner>spelchat@chromium.org</owner> + <summary> + The redirect chain size of a served prefetch. This histogram is recorded + only for prefetches that are served for a navigation. + </summary> +</histogram> + <histogram name="PrefetchProxy.AfterClick.WasBlockedUntilHeadWhenServing.{SpeculationEagerness}" enum="Boolean" expires_after="2023-09-10"> @@ -166,6 +177,19 @@ <token key="SpeculationEagerness" variants="SpeculationEagerness"/> </histogram> +<histogram name="PrefetchProxy.AfterClick.WasFullRedirectChainServed" + enum="Boolean" expires_after="2023-09-10"> + <owner>curranmax@chromium.org</owner> + <owner>ryansturm@chromium.org</owner> + <owner>spelchat@chromium.org</owner> + <summary> + Whether the full redirect chain of a prefetch is served (true), or just part + of the redirect was served (false). This histogram is only recorded when: 1) + the prefetch had at least one redirect (i.e. the redirect chain is at least + 2), and 2) at least part of prefetch redirect chain is served. + </summary> +</histogram> + <histogram name="PrefetchProxy.CanaryChecker.CacheEntryAge.{PrefetchProxyCanaryCheckerClient}" units="hours" expires_after="2024-04-25"> @@ -455,6 +479,17 @@ </summary> </histogram> +<histogram name="PrefetchProxy.Prefetch.RedirectChainSize" units="count" + expires_after="2023-09-10"> + <owner>curranmax@chromium.org</owner> + <owner>ryansturm@chromium.org</owner> + <owner>spelchat@chromium.org</owner> + <summary> + The redirect chain size of a prefetch. This histogram is recorded once for + each prefetch. + </summary> +</histogram> + <histogram name="PrefetchProxy.Prefetch.StreamingURLLoaderFinalStatus" enum="PrefetchStreamingURLLoaderStatus" expires_after="2023-09-24"> <owner>curranmax@chromium.org</owner> @@ -494,6 +529,30 @@ </summary> </histogram> +<histogram name="PrefetchProxy.Redirect.NetworkContextStateTransition" + enum="PrefetchRedirectNetworkContextTransition" expires_after="2023-09-10"> + <owner>curranmax@chromium.org</owner> + <owner>ryansturm@chromium.org</owner> + <owner>spelchat@chromium.org</owner> + <summary> + The network context transition required to handle a redirect while + prefetching. Prefetches require an isolated network context if user data + cannot be included in the prefetch. Otherwise the prefetch is made in the + default network context. This histogram is recorded for every redirect. + </summary> +</histogram> + +<histogram name="PrefetchProxy.Redirect.Result" enum="PrefetchRedirectResult" + expires_after="2023-09-10"> + <owner>curranmax@chromium.org</owner> + <owner>ryansturm@chromium.org</owner> + <owner>spelchat@chromium.org</owner> + <summary> + The result of receiving a redirect while prefetching. This histogram is + recorded for every redirect. + </summary> +</histogram> + <histogram name="PrefetchProxy.SpareRenderer.CountStartedOnSRP" units="count" expires_after="2024-04-25"> <owner>curranmax@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index d840d97..d14ea260 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -1046,6 +1046,19 @@ </summary> </histogram> +<histogram name="SafeBrowsing.HPRT.CacheHitAllPrefixesIfNoQueryParams" + enum="BooleanCacheHit" expires_after="2023-07-11"> + <owner>thefrog@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + Records whether all hash prefixes would be found in the hash-prefix + real-time lookups local cache if the URL were to have its query parameters + removed. It indicates that as a result of the cache, there would be no need + to send a request to Safe Browsing servers. This is logged each time a + lookup occurs, after the cache is searched. + </summary> +</histogram> + <histogram name="SafeBrowsing.HPRT.FoundUnmatchedFullHashes" enum="BooleanFound" expires_after="2023-09-24"> <owner>thefrog@chromium.org</owner> @@ -2290,6 +2303,20 @@ </summary> </histogram> +<histogram name="SafeBrowsing.V4GetHash.Network.HttpResponseCode.{NetError}" + enum="HttpResponseCode" expires_after="2023-07-12"> + <owner>thefrog@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + HTTP response code from the SafeBrowsing Pver4 service when the net error is + {NetError}. Logged after a GetHash request with that net error finishes. + </summary> + <token key="NetError"> + <variant name="InternetDisconnected" summary="ERR_INTERNET_DISCONNECTED"/> + <variant name="NetworkChanged" summary="ERR_NETWORK_CHANGED"/> + </token> +</histogram> + <histogram name="SafeBrowsing.V4GetHash.Network.Result" enum="CombinedHttpResponseAndNetErrorCode" expires_after="2023-10-01"> <owner>vakh@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml index 7c7e8924..53c97b6 100644 --- a/tools/metrics/histograms/metadata/settings/histograms.xml +++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -117,6 +117,15 @@ <histogram name="Settings.GivenShowHomeButton_HomePageIsNewTabPage" enum="Boolean" expires_after="2023-09-03"> + <obsolete> + Logged on profile open, including for profiles that do not use this setting + (such as "system" profiles) and for profiles that do not allow the + profile-owner to configure this setting (such as "guest" + profiles). When logged in such cases, reported the default value. Replaced + in M-114 with the histogram + Settings.GivenShowHomeButton_HomePageIsNewTabPage2, which is similar only + emitted for regular profiles. + </obsolete> <owner>mpearson@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -125,6 +134,21 @@ </summary> </histogram> +<histogram name="Settings.GivenShowHomeButton_HomePageIsNewTabPage2" + enum="Boolean" expires_after="2024-04-30"> + <owner>mpearson@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <summary> + Whether or not the home page user preference is set to the default NTP value + when a regular profile is loaded. This is only logged if the home button is + shown. + + To be explicit: not logged when an Incognito profile is opened because that + inherits the settings from its parent profile. As such, it's not necessary + to log the Incognito profile's settings. + </summary> +</histogram> + <histogram name="Settings.HashesDictionaryTrusted" enum="BooleanValid" expires_after="M77"> <owner>csharp@chromium.org</owner> @@ -148,6 +172,14 @@ <histogram name="Settings.HomePageEngineType" enum="OmniboxSearchEngineType" expires_after="2023-08-27"> + <obsolete> + Logged on profile open, including for profiles that do not use this setting + (such as "system" profiles) and for profiles that do not allow the + profile-owner to configure this setting (such as "guest" + profiles). When logged in such cases, reported the default value. Replaced + in M-114 with the histogram Settings.HomePageEngineType2, which is similar + only emitted for regular profiles. + </obsolete> <owner>mpearson@chromium.org</owner> <owner>csharp@chromium.org</owner> <summary> @@ -159,6 +191,23 @@ </summary> </histogram> +<histogram name="Settings.HomePageEngineType2" enum="OmniboxSearchEngineType" + expires_after="2024-04-30"> + <owner>mpearson@chromium.org</owner> + <owner>csharp@chromium.org</owner> + <summary> + Tries to pretend the home page URL is a search URL, and records the search + engine type of that URL by comparing the TLD+1 of the home page URL with + those of the different known search engines. Recorded when a regular profile + is opened, if a home page URL has been set. Note that at least one profile + is opened on startup. + + To be explicit: not logged when an Incognito profile is opened because that + inherits the settings from its parent profile. As such, it's not necessary + to log the Incognito profile's settings. + </summary> +</histogram> + <histogram name="Settings.OpenSettingsFromMenu.PerProfileType" enum="BrowserProfileType" expires_after="2023-10-08"> <owner>roagarwal@chromium.org</owner> @@ -654,6 +703,14 @@ <histogram name="Settings.ShowHomeButton" enum="BooleanEnabled" expires_after="2023-09-10"> + <obsolete> + Logged on profile open, including for profiles that do not use this setting + (such as "system" profiles) and for profiles that do not allow the + profile-owner to configure this setting (such as "guest" + profiles). When logged in such cases, reported the default value. Replaced + in M-114 with the histogram Settings.ShowHomeButton2, which is similar only + emitted for regular profiles. + </obsolete> <owner>mpearson@chromium.org</owner> <owner>twellington@chromium.org</owner> <summary> @@ -662,6 +719,20 @@ </summary> </histogram> +<histogram name="Settings.ShowHomeButton2" enum="BooleanEnabled" + expires_after="2024-04-30"> + <owner>mpearson@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <summary> + Whether or not the home button is enabled in user preferences when a regular + profile is loaded. + + To be explicit: not logged when an Incognito profile is opened because that + inherits the settings from its parent profile. As such, it's not necessary + to log the Incognito profile's settings. + </summary> +</histogram> + <histogram name="Settings.StartSetAsDefault" enum="BooleanHit" expires_after="2023-10-08"> <owner>pmonette@chromium.org</owner> @@ -674,6 +745,14 @@ <histogram name="Settings.StartupPageEngineTypes" enum="OmniboxSearchEngineType" expires_after="2023-08-08"> + <obsolete> + Logged on profile open, including for profiles that do not use this setting + (such as "system" profiles) and for profiles that do not allow the + profile-owner to configure this setting (such as "guest" + profiles). When logged in such cases, reported the default value. Replaced + in M-114 with the histogram Settings.StartupPageEngineTypes2, which is + similar only emitted for regular profiles. + </obsolete> <owner>mpearson@chromium.org</owner> <owner>csharp@chromium.org</owner> <summary> @@ -685,14 +764,53 @@ </summary> </histogram> +<histogram name="Settings.StartupPageEngineTypes2" + enum="OmniboxSearchEngineType" expires_after="2024-04-30"> + <owner>mpearson@chromium.org</owner> + <owner>csharp@chromium.org</owner> + <summary> + Tries to pretend the startup page URLs are search URLs, and records the + search engine types of those URLs by comparing the TLD+1s of the URLs with + those of the different known search engines. Recorded when a regular profile + is opened, if startup page URLs have been set. Note that at least one + profile is opened on startup. + + To be explicit: not logged when an Incognito profile is opened because that + inherits the settings from its parent profile. As such, it's not necessary + to log the Incognito profile's settings. + </summary> +</histogram> + <histogram name="Settings.StartupPageLoadSettings" enum="SessionStartupPref" expires_after="2023-08-27"> + <obsolete> + Logged on profile open, including for profiles that do not use this setting + (such as "system" profiles) and for profiles that do not allow the + profile-owner to configure this setting (such as "guest" + profiles). When logged in such cases, reported the default value. Replaced + in M-114 with the histogram Settings.StartupPageLoadSettings2, which is + similar only emitted for regular profiles. + </obsolete> <owner>mpearson@chromium.org</owner> <owner>tiborg@chromium.org</owner> <owner>chrome-desktop-ntp@google.com</owner> <summary>The startup page settings when a profile is loaded.</summary> </histogram> +<histogram name="Settings.StartupPageLoadSettings2" enum="SessionStartupPref" + expires_after="2024-04-30"> + <owner>mpearson@chromium.org</owner> + <owner>tiborg@chromium.org</owner> + <owner>chrome-desktop-ntp@google.com</owner> + <summary> + The startup page settings when a regular profile is loaded. + + To be explicit: not logged when an Incognito profile is opened because that + inherits the settings from its parent profile. As such, it's not necessary + to log the Incognito profile's settings. + </summary> +</histogram> + <histogram name="Settings.TimeToFirstSearch" units="ms" expires_after="M85"> <owner>dschuyler@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml index e1b1206..dd44eb8 100644 --- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml +++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -302,6 +302,24 @@ </summary> </histogram> +<histogram name="WebRTC.Audio.AudioMixer.NewHighestSourceCount" units="sources" + expires_after="2024-04-01"> + <owner>fhernqvist@google.com</owner> + <owner>olka@chromium.org</owner> + <owner>webrtc-audio-uma@google.com</owner> + <summary> + Logs the AudioMixer source count whenever the mixer gets a new highest + source count. This allows us to differentiate the histogram to get the + number of mixers that have had a specific number of maximum sources. For + example, the number of AudioMixers that have had a maximum of 5 sources is + NewHighestSourceCount[5] - NewHighestSourceCount[6]. + + Note that this is not the same as logging the source count whenever a source + is added; logging only happens when the source count exceeds the previously + highest source count. + </summary> +</histogram> + <histogram name="WebRTC.Audio.AverageExcessBufferDelayMs" units="ms" expires_after="2023-10-01"> <owner>hlundin@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 0e2336d..fa3bf73d 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@ "full_remote_path": "perfetto-luci-artifacts/adbbb6c78e3a86c5e87b0338d9e42eb6b4ddbf4d/linux-arm64/trace_processor_shell" }, "win": { - "hash": "0953c9bd6ceac772eb54b9cc34f645249cf457ec", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/1c39715690d4aad7ecb36569c121c8f0b40fb18c/trace_processor_shell.exe" + "hash": "82a32facded20e5c34bf09833eed3c66fc0bcbbc", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/9aa87085b27f3c7ac30d803071baa96655bc957e/trace_processor_shell.exe" }, "linux_arm": { "hash": "1d229abc94dea54ab4bb4327e78e18f942d08bf9", "full_remote_path": "perfetto-luci-artifacts/adbbb6c78e3a86c5e87b0338d9e42eb6b4ddbf4d/linux-arm/trace_processor_shell" }, "mac": { - "hash": "79520d7a405bc77d9e9320c8522eb0b4d2ecef5b", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/55985e77ff4f3e023d321c7f7236e8cfe098e545/trace_processor_shell" + "hash": "6edc909e16765b71ac1cee1879f128cefd462588", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/75c6500b8dabe5344ac0255cb3d33182b4fd161f/trace_processor_shell" }, "mac_arm64": { "hash": "7a4026b8718994145a52586fdec6e9447573345a", "full_remote_path": "perfetto-luci-artifacts/adbbb6c78e3a86c5e87b0338d9e42eb6b4ddbf4d/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "53030fbc3d6d2485ec35eb072492d32edf0cde5a", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/55985e77ff4f3e023d321c7f7236e8cfe098e545/trace_processor_shell" + "hash": "dfe4c313e49ac49d4d631f444f2a95d9dd27055f", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/75c6500b8dabe5344ac0255cb3d33182b4fd161f/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/traffic_annotation/safe_list.txt b/tools/traffic_annotation/safe_list.txt index fabc70f..b293f64 100644 --- a/tools/traffic_annotation/safe_list.txt +++ b/tools/traffic_annotation/safe_list.txt
@@ -182,7 +182,6 @@ missing_new_fields,chromeos/ash/components/login/auth/recovery/cryptohome_recovery_service_client.cc missing_new_fields,chromeos/ash/components/timezone/timezone_request.cc missing_new_fields,chromeos/components/quick_answers/result_loader.cc -missing_new_fields,chromeos/components/quick_answers/utils/spell_check_language.cc missing_new_fields,components/assist_ranker/ranker_url_fetcher.cc missing_new_fields,components/autofill/core/browser/autofill_download_manager.cc missing_new_fields,components/autofill/core/browser/payments/payments_client.cc
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml index 8c766788e..92feeba6 100644 --- a/tools/traffic_annotation/summary/annotations.xml +++ b/tools/traffic_annotation/summary/annotations.xml
@@ -45,7 +45,7 @@ <item id="chrome_cleanup_report" added_in_milestone="70" content_hash_code="07c84618" os_list="windows" file_path="chrome/chrome_cleaner/logging/cleaner_logging_service.cc" /> <item id="chrome_feedback_report_app" added_in_milestone="62" content_hash_code="04bf864a" os_list="linux,windows,chromeos,android" file_path="components/feedback/feedback_uploader.cc" /> <item id="chrome_variations_service" added_in_milestone="62" content_hash_code="00f59481" os_list="linux,windows,chromeos,android" file_path="components/variations/service/variations_service.cc" /> - <item id="client_download_request" added_in_milestone="62" content_hash_code="0661a769" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc" /> + <item id="client_download_request" added_in_milestone="62" content_hash_code="01da15dc" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/check_client_download_request_base.cc" /> <item id="content_hash_verification_job" added_in_milestone="62" content_hash_code="079fc9db" os_list="linux,windows,chromeos" file_path="extensions/browser/content_hash_fetcher.cc" /> <item id="conversion_measurement_report" added_in_milestone="84" content_hash_code="06a4170c" os_list="linux,windows,android,chromeos" file_path="content/browser/attribution_reporting/attribution_report_network_sender.cc" /> <item id="credenential_avatar" added_in_milestone="62" content_hash_code="06bcc86b" os_list="linux,windows,chromeos,android" file_path="chrome/browser/ui/passwords/account_avatar_fetcher.cc" /> @@ -65,7 +65,7 @@ <item id="dns_over_https" added_in_milestone="66" content_hash_code="02b087b6" os_list="linux,windows,chromeos,android" file_path="net/dns/dns_transaction.cc" /> <item id="dns_transaction" added_in_milestone="65" content_hash_code="07e14f9f" os_list="linux,windows,chromeos,android" file_path="net/dns/dns_transaction.cc" /> <item id="dom_distiller" added_in_milestone="62" content_hash_code="0653c7f2" os_list="linux,windows,chromeos,android" file_path="components/dom_distiller/core/distiller_url_fetcher.cc" /> - <item id="domain_reliability_report_upload" added_in_milestone="62" content_hash_code="005de12f" os_list="linux,windows,chromeos,android" file_path="components/domain_reliability/uploader.cc" /> + <item id="domain_reliability_report_upload" added_in_milestone="62" content_hash_code="06d185bd" os_list="linux,windows,chromeos,android" file_path="components/domain_reliability/uploader.cc" /> <item id="domain_security_policy" added_in_milestone="62" content_hash_code="01d7c177" os_list="linux,windows,chromeos,android" file_path="services/network/network_context.cc" /> <item id="download_internals_webui_source" added_in_milestone="66" content_hash_code="07b659d0" os_list="linux,windows,chromeos,android" file_path="chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc" /> <item id="download_manager_resume" added_in_milestone="62" content_hash_code="0275159a" os_list="linux,windows,chromeos,android" file_path="components/download/internal/common/download_item_impl.cc" /> @@ -167,7 +167,7 @@ <item id="photos_service" added_in_milestone="94" content_hash_code="0573af72" os_list="linux,windows,chromeos" file_path="chrome/browser/new_tab_page/modules/photos/photos_service.cc" /> <item id="popular_sites_fetch" added_in_milestone="62" content_hash_code="00697083" os_list="linux,windows,chromeos,android" file_path="components/ntp_tiles/popular_sites_impl.cc" /> <item id="port_forwarding_controller_socket" added_in_milestone="65" content_hash_code="074810e4" os_list="linux,windows,chromeos" file_path="chrome/browser/devtools/device/port_forwarding_controller.cc" /> - <item id="ppapi_download_request" added_in_milestone="62" content_hash_code="04e5f4df" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc" /> + <item id="ppapi_download_request" added_in_milestone="62" content_hash_code="055489f6" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/ppapi_download_request.cc" /> <item id="predictive_prefetch" added_in_milestone="85" content_hash_code="00ebd1fd" os_list="linux,windows,chromeos,android" file_path="chrome/browser/predictors/prefetch_manager.cc" /> <item id="profile_avatar" added_in_milestone="62" content_hash_code="06c4a5fd" os_list="linux,windows,chromeos,android" file_path="chrome/browser/profiles/profile_avatar_downloader.cc" /> <item id="profile_resetter_upload" added_in_milestone="62" content_hash_code="07b56813" os_list="linux,windows,chromeos" file_path="chrome/browser/profile_resetter/reset_report_uploader.cc" /> @@ -200,7 +200,7 @@ <item id="safe_browsing_binary_upload_connector" added_in_milestone="87" content_hash_code="031b9017" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc" /> <item id="safe_browsing_cache_collector" added_in_milestone="62" content_hash_code="03b69135" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/content/browser/threat_details_cache.cc" /> <item id="safe_browsing_certificate_error_reporting" added_in_milestone="62" content_hash_code="018e6226" os_list="linux,windows,chromeos,android" file_path="chrome/browser/ssl/certificate_error_reporter.cc" /> - <item id="safe_browsing_client_side_phishing_detector" added_in_milestone="62" content_hash_code="037ce165" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/content/browser/client_side_detection_service.cc" /> + <item id="safe_browsing_client_side_phishing_detector" added_in_milestone="62" content_hash_code="018611e2" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/content/browser/client_side_detection_service.cc" /> <item id="safe_browsing_extended_reporting" added_in_milestone="62" content_hash_code="04d6ea29" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/core/browser/ping_manager.cc" /> <item id="safe_browsing_feedback" added_in_milestone="62" content_hash_code="019dc52e" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/download_protection/download_feedback.cc" /> <item id="safe_browsing_incident" added_in_milestone="62" content_hash_code="006f7d23" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/incident_reporting/incident_report_uploader_impl.cc" /> @@ -220,7 +220,7 @@ <item id="services_http_server_error_response" added_in_milestone="68" content_hash_code="079dad59" os_list="linux,windows,chromeos,android" file_path="services/network/public/cpp/server/http_server.cc" /> <item id="shared_storage_worklet_module_script_downloader" added_in_milestone="95" content_hash_code="072bbf71" os_list="linux,windows,chromeos,android" file_path="third_party/blink/common/shared_storage/module_script_downloader.cc" /> <item id="sigined_exchange_cert_fetcher" added_in_milestone="66" content_hash_code="007c2dac" os_list="linux,windows,chromeos,android" file_path="content/browser/web_package/signed_exchange_cert_fetcher.cc" /> - <item id="signed_in_profile_avatar" added_in_milestone="62" content_hash_code="04934c15" os_list="linux,windows,chromeos,android" file_path="chrome/browser/profiles/profile_downloader.cc" /> + <item id="signed_in_profile_avatar" added_in_milestone="62" content_hash_code="071dd1bf" os_list="linux,windows,chromeos,android" file_path="chrome/browser/profiles/profile_downloader.cc" /> <item id="socket_bio_adapter" added_in_milestone="66" content_hash_code="014a4058" os_list="linux,windows,chromeos,android" file_path="net/socket/socket_bio_adapter.cc" /> <item id="spdy_push_stream" added_in_milestone="67" content_hash_code="042048b5" os_list="linux,windows,chromeos,android" file_path="net/spdy/spdy_session.cc" /> <item id="spdy_session_control" added_in_milestone="66" content_hash_code="01c6f3f0" os_list="linux,windows,chromeos,android" file_path="net/spdy/spdy_session.cc" /> @@ -257,7 +257,7 @@ <item id="web_history_service" added_in_milestone="65" type="completing" content_hash_code="00f6470d" os_list="linux,windows,chromeos,android" semantics_fields="1,5" policy_fields="-1,3" file_path="components/history/core/browser/web_history_service.cc" /> <item id="web_push_message" added_in_milestone="77" content_hash_code="068f740a" os_list="linux,windows,chromeos,android" file_path="chrome/browser/sharing/web_push/web_push_sender.cc" /> <item id="webrtc_event_log_uploader" added_in_milestone="67" content_hash_code="00a7ed3d" os_list="linux,windows,chromeos,android" file_path="chrome/browser/media/webrtc/webrtc_event_log_uploader.cc" /> - <item id="webrtc_log_upload" added_in_milestone="62" content_hash_code="0158bc9c" os_list="linux,windows,chromeos,android" file_path="chrome/browser/media/webrtc/webrtc_log_uploader.cc" /> + <item id="webrtc_log_upload" added_in_milestone="62" content_hash_code="03c174f6" os_list="linux,windows,chromeos,android" file_path="chrome/browser/media/webrtc/webrtc_log_uploader.cc" /> <item id="webrtc_peer_connection" added_in_milestone="66" content_hash_code="039bf82b" os_list="linux,windows,chromeos,android" file_path="third_party/blink/renderer/modules/peerconnection/peer_connection_dependency_factory.cc" /> <item id="websocket_basic_stream" added_in_milestone="66" content_hash_code="040f7353" os_list="linux,windows,chromeos,android" file_path="net/websockets/websocket_basic_stream.cc" /> <item id="websocket_stream" added_in_milestone="62" content_hash_code="006ea358" os_list="linux,windows,chromeos,android" file_path="content/browser/websockets/websocket_connector_impl.cc" /> @@ -335,7 +335,7 @@ <item id="printing_oauth2_first_token_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="00850a77" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/authorization_server_session.cc" /> <item id="printing_oauth2_next_token_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="002fbbfd" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/authorization_server_session.cc" /> <item id="help_content_provider" added_in_milestone="102" content_hash_code="0839311f" os_list="chromeos" file_path="ash/webui/os_feedback_ui/backend/help_content_provider.cc" /> - <item id="quick_answers_spellchecker" added_in_milestone="102" content_hash_code="06e81b7f" os_list="chromeos" file_path="chromeos/components/quick_answers/utils/spell_check_language.cc" /> + <item id="quick_answers_spellchecker" added_in_milestone="102" content_hash_code="00e3ffb1" os_list="chromeos" file_path="chromeos/components/quick_answers/utils/spell_check_language.cc" /> <item id="printing_oauth2_token_exchange_request" added_in_milestone="102" type="partial" second_id="printing_oauth2_http_exchange" content_hash_code="059df373" os_list="chromeos" semantics_fields="2,4" file_path="chrome/browser/ash/printing/oauth2/ipp_endpoint_token_fetcher.cc" /> <item id="fedcm_account_profile_image_fetcher" added_in_milestone="102" content_hash_code="07d6a3e2" os_list="linux,windows,chromeos" file_path="chrome/browser/ui/views/webid/account_selection_bubble_view.cc" /> <item id="device_activity_client_health_check" added_in_milestone="102" content_hash_code="0506113c" os_list="chromeos" file_path="chromeos/ash/components/device_activity/device_activity_client.cc" /> @@ -415,7 +415,7 @@ <item id="safe_browsing_ohttp_key_fetch" added_in_milestone="113" content_hash_code="0309cb19" os_list="linux,windows,android,chromeos" file_path="components/safe_browsing/core/browser/hashprefix_realtime/ohttp_key_service.cc" /> <item id="glanceables_tasks_integration" added_in_milestone="113" content_hash_code="06e038c9" os_list="chromeos" file_path="chrome/browser/ui/ash/glanceables/glanceables_tasks_client_impl.cc" /> <item id="bookmarks_image_fetcher" added_in_milestone="114" content_hash_code="01dd68ad" os_list="chromeos,linux,windows" file_path="chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc" /> - <item id="screensaver_image_downloader" added_in_milestone="114" content_hash_code="020b8756" os_list="chromeos" file_path="chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc" /> + <item id="screensaver_image_downloader" added_in_milestone="114" content_hash_code="05ebc454" os_list="chromeos" file_path="chrome/browser/ash/policy/handlers/screensaver_image_downloader.cc" /> <item id="back_navigation_cache_query" added_in_milestone="114" content_hash_code="052f4fec" os_list="linux,windows,android,chromeos" file_path="content/browser/preloading/prerender/prerender_host_registry.cc" /> <item id="cws_info_service" added_in_milestone="114" content_hash_code="02e1a061" os_list="linux,windows,chromeos" file_path="chrome/browser/extensions/cws_info_service.cc" /> </annotations>
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc index 1ac0419..23d7833 100644 --- a/ui/accessibility/accessibility_features.cc +++ b/ui/accessibility/accessibility_features.cc
@@ -204,7 +204,7 @@ BASE_FEATURE(kAccessibilityDeprecateChromeVoxTabs, "AccessibilityDeprecateChromeVoxTabs", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); bool IsAccessibilityDeprecateChromeVoxTabsEnabled() { return base::FeatureList::IsEnabled( @@ -247,21 +247,12 @@ } #if BUILDFLAG(IS_ANDROID) -BASE_FEATURE(kComputeAXMode, - "ComputeAXMode", +BASE_FEATURE(kAccessibilityAXModes, + "AccessibilityAXModes", base::FEATURE_DISABLED_BY_DEFAULT); -bool IsComputeAXModeEnabled() { - return base::FeatureList::IsEnabled(::features::kComputeAXMode); -} - -BASE_FEATURE(kAccessibilityFormControlsMode, - "AccessibilityFormControlsAXMode", - base::FEATURE_DISABLED_BY_DEFAULT); - -bool IsAccessibilityFormControlsAXModeEnabled() { - return base::FeatureList::IsEnabled( - ::features::kAccessibilityFormControlsMode); +bool IsAccessibilityAXModesEnabled() { + return base::FeatureList::IsEnabled(::features::kAccessibilityAXModes); } #endif // BUILDFLAG(IS_ANDROID)
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h index 293bb52..1e724758 100644 --- a/ui/accessibility/accessibility_features.h +++ b/ui/accessibility/accessibility_features.h
@@ -193,19 +193,12 @@ AX_BASE_EXPORT bool IsAblateSendPendingAccessibilityEventsEnabled(); #if BUILDFLAG(IS_ANDROID) -// Compute the AXMode based on AccessibilityServiceInfo. If disabled, -// the AXMode is either entirely on or entirely off. -AX_BASE_EXPORT BASE_DECLARE_FEATURE(kComputeAXMode); +// Enable AXModes based on running services. If disabled, then AXModes +// will not be available to be set. +AX_BASE_EXPORT BASE_DECLARE_FEATURE(kAccessibilityAXModes); -// Returns true if the IChromeAccessible COM API is enabled. -AX_BASE_EXPORT bool IsComputeAXModeEnabled(); - -// Enable form controls AXMode based on running services. If disabled, -// then form controls AXMode will not be available to be set. -AX_BASE_EXPORT BASE_DECLARE_FEATURE(kAccessibilityFormControlsMode); - -// Returns true if the form controls AXMode is enabled. -AX_BASE_EXPORT bool IsAccessibilityFormControlsAXModeEnabled(); +// Returns true if AXMode is enabled. +AX_BASE_EXPORT bool IsAccessibilityAXModesEnabled(); #endif // BUILDFLAG(IS_ANDROID)
diff --git a/ui/accessibility/android/java/src/org/chromium/ui/accessibility/AccessibilityState.java b/ui/accessibility/android/java/src/org/chromium/ui/accessibility/AccessibilityState.java index 45d99af..a9ef1c83 100644 --- a/ui/accessibility/android/java/src/org/chromium/ui/accessibility/AccessibilityState.java +++ b/ui/accessibility/android/java/src/org/chromium/ui/accessibility/AccessibilityState.java
@@ -229,13 +229,14 @@ } @VisibleForTesting - public static void setFeedbackTypeMaskForTesting(int value) { + public static void setAccessibilityEnabledForTesting(boolean enabled) { if (!sInitialized) updateAccessibilityServices(); - sFeedbackTypeMask = value; + State newState = new State(sState.isScreenReaderEnabled, sState.isTouchExplorationEnabled, + enabled, sState.isAccessibilityToolPresent, sState.isSpokenFeedbackServicePresent, + sState.isTextShowPasswordEnabled, sState.isOnlyPasswordManagersEnabled); - // Inform all listeners of this change. - updateAndNotifyStateChange(sState); + updateAndNotifyStateChange(newState); } @VisibleForTesting @@ -244,35 +245,33 @@ // Explicitly set mask so events can be (ir)relevant to currently enabled service. sEventTypeMask = mask; - // Explicitly set accessibility enabled - State newState = new State(sState.isScreenReaderEnabled, sState.isTouchExplorationEnabled, - true, sState.isAccessibilityToolPresent, sState.isSpokenFeedbackServicePresent, - sState.isTextShowPasswordEnabled, sState.isOnlyPasswordManagersEnabled); + } + + @VisibleForTesting + public static void setScreenReaderEnabledForTesting(boolean enabled) { + if (!sInitialized) updateAccessibilityServices(); + + // Explicitly set screen reader enabled to given state since a real screen reader is not run + // during tests. + State newState = new State(enabled, sState.isTouchExplorationEnabled, + sState.isAnyAccessibilityServiceEnabled, sState.isAccessibilityToolPresent, + sState.isSpokenFeedbackServicePresent, sState.isTextShowPasswordEnabled, + sState.isOnlyPasswordManagersEnabled); // Inform all listeners of this change. updateAndNotifyStateChange(newState); } @VisibleForTesting - public static void setScreenReaderModeForTesting(boolean enabled) { + public static void setOnlyPasswordManagersEnabledForTesting(boolean enabled) { if (!sInitialized) updateAccessibilityServices(); - // Explicitly set screen reader mode since a real screen reader isn't run during tests. - // Explicitly set accessibility enabled - State newState = new State(enabled, sState.isTouchExplorationEnabled, true, - sState.isAccessibilityToolPresent, sState.isSpokenFeedbackServicePresent, - sState.isTextShowPasswordEnabled, sState.isOnlyPasswordManagersEnabled); - // Inform all listeners of this change. - updateAndNotifyStateChange(newState); - } - - @VisibleForTesting - public static void setHasSpokenFeedbackServiceForTesting(boolean present) { - if (!sInitialized) updateAccessibilityServices(); - + // Explicitly set state for only password managers enabled to given state since a real + // password manager is not run during tests. State newState = new State(sState.isScreenReaderEnabled, sState.isTouchExplorationEnabled, - sState.isAnyAccessibilityServiceEnabled, sState.isAccessibilityToolPresent, present, - sState.isTextShowPasswordEnabled, sState.isOnlyPasswordManagersEnabled); + sState.isAnyAccessibilityServiceEnabled, sState.isAccessibilityToolPresent, + sState.isSpokenFeedbackServicePresent, sState.isTextShowPasswordEnabled, enabled); + // Inform all listeners of this change. updateAndNotifyStateChange(newState); } @@ -433,7 +432,8 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { AutofillManager autofillManager = context.getSystemService(AutofillManager.class); - if (autofillManager != null && autofillManager.isEnabled()) { + if (autofillManager != null && autofillManager.isEnabled() + && autofillManager.hasEnabledAutofillServices()) { // Confirm that autofill service is the only service running that requires // accessibility. if (runningServiceNames.isEmpty()
diff --git a/ui/accessibility/ax_tree_serializer.h b/ui/accessibility/ax_tree_serializer.h index 5e4622e..a22731d 100644 --- a/ui/accessibility/ax_tree_serializer.h +++ b/ui/accessibility/ax_tree_serializer.h
@@ -381,7 +381,12 @@ auto num_children = tree_->GetChildCount(node); for (size_t i = 0; i < num_children; ++i) { AXSourceNode child = tree_->ChildAt(node, i); - CHECK(child); + if (!child) { + // TODO(crbug.com/1432184, crbug.com/1432126, crbug.com/1431535, + // crbug.com/1418319): Once the DCHECKs in BlinkAXTreeSource::ChildAt() + // are resolved, turn this into a CHECK. + continue; + } int child_id = tree_->GetId(child); ClientTreeNode* client_child = ClientTreeNodeById(child_id); if (client_child) { @@ -695,7 +700,12 @@ } for (size_t i = 0; i < num_children; ++i) { AXSourceNode child = tree_->ChildAt(node, i); - CHECK(child); + if (!child) { + // TODO(crbug.com/1432184, crbug.com/1432126, crbug.com/1431535, + // crbug.com/1418319): Once the DCHECKs in BlinkAXTreeSource::ChildAt() + // are resolved, turn this into a CHECK. + continue; + } int new_child_id = tree_->GetId(child); new_child_ids.insert(new_child_id); @@ -787,7 +797,12 @@ client_node->children.reserve(num_children); for (size_t i = 0; i < num_children; ++i) { AXSourceNode child = tree_->ChildAt(node, i); - CHECK(child); + if (!child) { + // TODO(crbug.com/1432184, crbug.com/1432126, crbug.com/1431535, + // crbug.com/1418319): Once the DCHECKs in BlinkAXTreeSource::ChildAt() + // are resolved, turn this into a CHECK. + continue; + } int child_id = tree_->GetId(child);
diff --git a/ui/accessibility/ax_tree_serializer_unittest.cc b/ui/accessibility/ax_tree_serializer_unittest.cc index a6c6585c..3955a06 100644 --- a/ui/accessibility/ax_tree_serializer_unittest.cc +++ b/ui/accessibility/ax_tree_serializer_unittest.cc
@@ -310,8 +310,17 @@ BasicAXTreeSerializer serializer(&source); AXTreeUpdate update; - EXPECT_DEATH_IF_SUPPORTED(serializer.SerializeChanges(tree.root(), &update), - ""); + // TODO(crbug.com/1432184, crbug.com/1432126, crbug.com/1431535, + // crbug.com/1418319): Once the DCHECKs in BlinkAXTreeSource::ChildAt() + // are resolved, and CHECKs for ChildAt() return values are restored in + // AXTreeSerializer, turn this into a death expectation. + // EXPECT_DEATH_IF_SUPPORTED(serializer.SerializeChanges(tree.root(), + // &update), + // ""); + ASSERT_TRUE(serializer.SerializeChanges(tree.root(), &update)); + ASSERT_EQ(2U, update.nodes.size()); + EXPECT_EQ(1, update.nodes[0].id); + EXPECT_EQ(2, update.nodes[1].id); } // Test that we can set a maximum number of nodes to serialize.
diff --git a/ui/android/java/res/values-night/colors.xml b/ui/android/java/res/values-night/colors.xml index acc15e02..800d6630 100644 --- a/ui/android/java/res/values-night/colors.xml +++ b/ui/android/java/res/values-night/colors.xml
@@ -103,5 +103,4 @@ <color name="rating_star_yellow">@color/rating_star_yellow_light</color> <color name="price_drop_annotation_bg_color">@color/price_drop_annotation_bg_color_dark</color> <color name="price_drop_annotation_text_green">@color/price_drop_annotation_text_green_dark</color> - <color name="signed_out_avatar_color">@color/signed_out_avatar_color_dark</color> </resources>
diff --git a/ui/android/java/res/values/semantic_colors_adaptive.xml b/ui/android/java/res/values/semantic_colors_adaptive.xml index 5846bfd..6dc870d 100644 --- a/ui/android/java/res/values/semantic_colors_adaptive.xml +++ b/ui/android/java/res/values/semantic_colors_adaptive.xml
@@ -119,5 +119,4 @@ <color name="rating_star_yellow">@color/rating_star_yellow_dark</color> <color name="price_drop_annotation_bg_color">@color/price_drop_annotation_bg_color_light</color> <color name="price_drop_annotation_text_green">@color/price_drop_annotation_text_green_light</color> - <color name="signed_out_avatar_color">@color/signed_out_avatar_color_light</color> </resources>
diff --git a/ui/android/java/res/values/semantic_colors_non_adaptive.xml b/ui/android/java/res/values/semantic_colors_non_adaptive.xml index 41656c1..37a6bf4f 100644 --- a/ui/android/java/res/values/semantic_colors_non_adaptive.xml +++ b/ui/android/java/res/values/semantic_colors_non_adaptive.xml
@@ -175,8 +175,4 @@ <color name="price_drop_annotation_bg_color_dark">@color/baseline_tertiary_700</color> <color name="price_drop_annotation_text_green_light">@color/baseline_tertiary_600</color> <color name="price_drop_annotation_text_green_dark">@color/baseline_tertiary_200</color> - - <!-- NTP signed-out avatar colors--> - <color name="signed_out_avatar_color_light">@color/modern_grey_900</color> - <color name="signed_out_avatar_color_dark">@color/modern_grey_100</color> </resources>
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java b/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java index b0083219..85f95716 100644 --- a/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java +++ b/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java
@@ -27,6 +27,7 @@ import org.chromium.base.CommandLine; import org.chromium.base.ThreadUtils; import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.TestThreadUtils; import org.chromium.ui.UiUtils; import java.io.File; @@ -230,8 +231,12 @@ * @throws IOException if the rendered image cannot be saved to the device. */ public void render(final View view, String id) throws IOException { + Assert.assertNotNull(view); Assert.assertTrue("Render Tests must have the RenderTest feature.", mHasRenderTestFeature); + // De-flake by flushing the tasks that are already queued on the Looper's Handler. + // TODO(https://crbug.com/1424788): Remove this and properly fix flaky tests. + TestThreadUtils.flushNonDelayedLooperTasks(); Bitmap testBitmap = ThreadUtils.runOnUiThreadBlockingNoException(new Callable<Bitmap>() { @Override public Bitmap call() {
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index fc991af..b7abc4be 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -958,6 +958,20 @@ } } +source_set("run_all_unittests") { + testonly = true + sources = [ "test/run_all_unittests.cc" ] + + deps = [ + "//base", + "//base/test:test_support", + "//skia", + "//testing/gtest", + "//ui/base", + "//ui/display", + ] +} + test("ui_base_unittests") { use_xvfb = use_xvfb_in_this_config
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc index 58c4ec7..c6d929f 100644 --- a/ui/base/ui_base_features.cc +++ b/ui/base/ui_base_features.cc
@@ -481,12 +481,10 @@ #if BUILDFLAG(IS_APPLE) // Font Smoothing was enabled by default prior to introducing this feature. -// We want to experiment with disabling it to align with CR2023 designs, -// and we also want to disable it *by default* so that any abnormalities or -// inconsistencies can be noticed as soon as possible. +// We want to experiment with disabling it to align with CR2023 designs. BASE_FEATURE(kCr2023MacFontSmoothing, "Cr2023MacFontSmoothing", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); #endif BASE_FEATURE(kUseNanosecondsForMotionEvent,
diff --git a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc index d46f935..cb1ef37d 100644 --- a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc +++ b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc
@@ -331,6 +331,8 @@ IDS_SETTINGS_APN_DESCRIPTION_WITH_LEARN_MORE_LINK}, {"apnSettingsZeroStateDescription", IDS_SETTINGS_APN_ZERO_STATE_DESCRIPTION}, + {"apnSettingsCustomApnsErrorMessage", + IDS_SETTINGS_APN_CUSTOM_APNS_ERROR_MESSAGE}, {"apnMenuDetails", IDS_SETTINGS_APN_MENU_DETAILS}, {"apnMenuDisable", IDS_SETTINGS_APN_MENU_DISABLE}, {"apnMenuEnable", IDS_SETTINGS_APN_MENU_ENABLE},
diff --git a/ui/color/color_id.h b/ui/color/color_id.h index 015a88e..08dedb24 100644 --- a/ui/color/color_id.h +++ b/ui/color/color_id.h
@@ -398,6 +398,7 @@ E_CPONLY(kColorTextfieldSelectionBackground) \ E_CPONLY(kColorTextfieldSelectionForeground) \ E_CPONLY(kColorTextfieldOutline) \ + E_CPONLY(kColorTextfieldOutlineHover) \ E_CPONLY(kColorTextfieldDisabledOutline) \ E_CPONLY(kColorTextfieldInvalidOutline) \ E_CPONLY(kColorThrobber) \
diff --git a/ui/color/material_ui_color_mixer.cc b/ui/color/material_ui_color_mixer.cc index 2049091..be6734d7 100644 --- a/ui/color/material_ui_color_mixer.cc +++ b/ui/color/material_ui_color_mixer.cc
@@ -78,6 +78,7 @@ mixer[kColorTextfieldForegroundDisabled] = {kColorSysStateDisabled}; mixer[kColorTextfieldForegroundPlaceholder] = {kColorSysOnSurfaceSubtle}; mixer[kColorTextfieldOutline] = {kColorSysNeutralOutline}; + mixer[kColorTextfieldOutlineHover] = {kColorSysStateHoverOnSubtle}; mixer[kColorTextfieldDisabledOutline] = {SK_ColorTRANSPARENT}; mixer[kColorTextfieldInvalidOutline] = { kColorTextfieldForegroundPlaceholderInvalid};
diff --git a/ui/color/ui_color_mixer.cc b/ui/color/ui_color_mixer.cc index e52dd23..d71ff66 100644 --- a/ui/color/ui_color_mixer.cc +++ b/ui/color/ui_color_mixer.cc
@@ -269,6 +269,7 @@ mixer[kColorTextfieldSelectionBackground] = {kColorTextSelectionBackground}; mixer[kColorTextfieldSelectionForeground] = {kColorTextSelectionForeground}; mixer[kColorTextfieldOutline] = {kColorFocusableBorderUnfocused}; + mixer[kColorTextfieldOutlineHover] = {kColorFocusableBorderUnfocused}; mixer[kColorTextfieldDisabledOutline] = {kColorFocusableBorderUnfocused}; mixer[kColorTextfieldInvalidOutline] = {kColorAlertHighSeverity}; mixer[kColorThrobber] =
diff --git a/ui/color/win/native_color_mixers_win.cc b/ui/color/win/native_color_mixers_win.cc index 8f396970..4579b16 100644 --- a/ui/color/win/native_color_mixers_win.cc +++ b/ui/color/win/native_color_mixers_win.cc
@@ -137,9 +137,18 @@ mixer[kColorScrollbarArrowForegroundPressed] = { dark_mode ? SkColorSetA(SK_ColorWHITE, 0xC8) : SkColorSetA(SK_ColorBLACK, 0x9B)}; - mixer[kColorScrollbarThumb] = {mixer[kColorScrollbarArrowForeground]}; - mixer[kColorScrollbarTrack] = {dark_mode ? SkColorSetRGB(0x2C, 0x2C, 0x2C) - : SkColorSetRGB(0xFC, 0xFC, 0xFC)}; + mixer[kColorScrollbarCorner] = {dark_mode + ? SkColorSetRGB(0x2C, 0x2C, 0x2C) + : SkColorSetRGB(0xFC, 0xFC, 0xFC)}; + mixer[kColorScrollbarArrowBackgroundHovered] = {kColorScrollbarCorner}; + mixer[kColorScrollbarArrowBackgroundPressed] = { + kColorScrollbarArrowBackgroundHovered}; + mixer[kColorScrollbarThumb] = {kColorScrollbarArrowForeground}; + mixer[kColorScrollbarThumbHovered] = { + kColorScrollbarArrowForegroundPressed}; + mixer[kColorScrollbarThumbInactive] = {kColorScrollbarThumb}; + mixer[kColorScrollbarThumbPressed] = {kColorScrollbarThumbHovered}; + mixer[kColorScrollbarTrack] = {kColorScrollbarCorner}; } if (key.contrast_mode == ColorProviderManager::ContrastMode::kNormal)
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn index 20e7227..1bfc640 100644 --- a/ui/display/BUILD.gn +++ b/ui/display/BUILD.gn
@@ -249,7 +249,6 @@ "//base/test:test_support", "//build:chromeos_buildflags", "//cc/base", - "//mojo/core/test:run_all_unittests", "//mojo/public/cpp/test_support:test_utils", "//testing/gmock", "//testing/gtest", @@ -280,6 +279,7 @@ "manager/display_configurator_unittest.cc", "manager/display_manager_util_unittest.cc", "manager/display_manager_utilities_unittest.cc", + "manager/display_properties_parser_unittest.cc", "manager/json_converter_unittest.cc", "manager/managed_display_info_unittest.cc", "manager/query_content_protection_task_unittest.cc", @@ -287,15 +287,24 @@ "manager/touch_transform_controller_unittest.cc", "manager/update_display_configuration_task_unittest.cc", ] + deps += [ ":display_manager_test_api", + "//ui/base:run_all_unittests", "//ui/display/manager", "//ui/ozone:ozone_switches", ] + + data_deps = [ + "//ui/base:ui_base_test_resources_pak", + "//ui/resources:ui_test_pak_data", + ] + } else { + deps += [ "//mojo/core/test:run_all_unittests" ] } } -# This target is added as a dependency of browser interactive_ui_tests. It must +# This target is added as a dependency of browser interactive_ui_tests.It must # be source_set, otherwise the linker will drop the tests as dead code. source_set("display_interactive_ui_tests") { testonly = true
diff --git a/ui/display/manager/BUILD.gn b/ui/display/manager/BUILD.gn index 257d9a2..b26d5429 100644 --- a/ui/display/manager/BUILD.gn +++ b/ui/display/manager/BUILD.gn
@@ -56,6 +56,8 @@ "display_layout_store.h", "display_manager.cc", "display_manager.h", + "display_properties_parser.cc", + "display_properties_parser.h", "json_converter.cc", "json_converter.h", "query_content_protection_task.cc",
diff --git a/ui/display/manager/display_change_observer.cc b/ui/display/manager/display_change_observer.cc index 6794c38..c381107 100644 --- a/ui/display/manager/display_change_observer.cc +++ b/ui/display/manager/display_change_observer.cc
@@ -12,8 +12,12 @@ #include <utility> #include <vector> +#include "base/check.h" #include "base/check_op.h" #include "base/command_line.h" +#include "base/json/json_reader.h" +#include "base/notreached.h" +#include "base/values.h" #include "build/chromeos_buildflags.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/user_activity/user_activity_detector.h" @@ -24,6 +28,7 @@ #include "ui/display/manager/display_layout_store.h" #include "ui/display/manager/display_manager.h" #include "ui/display/manager/display_manager_utilities.h" +#include "ui/display/manager/display_properties_parser.h" #include "ui/display/manager/touch_device_manager.h" #include "ui/display/types/display_constants.h" #include "ui/display/types/display_mode.h" @@ -38,9 +43,6 @@ namespace { -// TODO(crbug/1262970): Delete when we can read radius from command line. -const float kRoundedDisplayRadius = 16.0; - // The DPI threshold to determine the device scale factor. // DPI higher than |dpi| will use |device_scale_factor|. struct DeviceScaleFactorDPIThreshold { @@ -80,6 +82,23 @@ return display_mode_list; } +absl::optional<gfx::RoundedCornersF> ParsePanelRadiiFromCommandLine() { + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisplayProperties)) { + return absl::nullopt; + } + + absl::optional<base::Value> display_switch_value = base::JSONReader::Read( + base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + switches::kDisplayProperties)); + + if (!display_switch_value.has_value()) { + return absl::nullopt; + } + + return ParseDisplayPanelRadii(&display_switch_value.value()); +} + } // namespace // static @@ -166,7 +185,8 @@ } DisplayChangeObserver::DisplayChangeObserver(DisplayManager* display_manager) - : display_manager_(display_manager) { + : internal_panel_radii_(ParsePanelRadiiFromCommandLine()), + display_manager_(display_manager) { ui::DeviceDataManager::GetInstance()->AddObserver(this); } @@ -277,7 +297,8 @@ bool native, float device_scale_factor, float dpi, - const std::string& name) { + const std::string& name, + const gfx::RoundedCornersF& panel_radii) { const bool has_overscan = snapshot->has_overscan(); const int64_t id = snapshot->display_id(); @@ -334,12 +355,8 @@ new_info.SetManagedDisplayModes(display_modes); new_info.set_maximum_cursor_size(snapshot->maximum_cursor_size()); - // Temporary adding rounded corners to the internal display info. - if (display::features::IsRoundedDisplayEnabled() && - snapshot->type() == DISPLAY_CONNECTION_TYPE_INTERNAL) { - new_info.set_rounded_corners_radii( - gfx::RoundedCornersF(kRoundedDisplayRadius)); - } + + new_info.set_rounded_corners_radii(panel_radii); new_info.SetDRMFormatsAndModifiers(snapshot->GetDRMFormatsAndModifiers()); @@ -410,8 +427,15 @@ name = l10n_util::GetStringUTF8(IDS_DISPLAY_NAME_UNKNOWN); } + gfx::RoundedCornersF panel_radii; + + if (display::features::IsRoundedDisplayEnabled() && + snapshot->type() == display::DISPLAY_CONNECTION_TYPE_INTERNAL) { + panel_radii = internal_panel_radii_.value_or(gfx::RoundedCornersF()); + } + return CreateManagedDisplayInfo(snapshot, mode_info, native, - device_scale_factor, dpi, name); + device_scale_factor, dpi, name, panel_radii); } } // namespace display
diff --git a/ui/display/manager/display_change_observer.h b/ui/display/manager/display_change_observer.h index f16a11cb..eb51b8f 100644 --- a/ui/display/manager/display_change_observer.h +++ b/ui/display/manager/display_change_observer.h
@@ -7,11 +7,17 @@ #include <stdint.h> +#include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/display/manager/display_configurator.h" #include "ui/display/manager/display_manager_export.h" #include "ui/display/manager/managed_display_info.h" +#include "ui/display/types/display_constants.h" #include "ui/events/devices/input_device_event_observer.h" +namespace gfx { +class RoundedCornersF; +} + namespace display { class DisplayManager; @@ -67,10 +73,11 @@ bool native, float device_scale_factor, float dpi, - const std::string& name); + const std::string& name, + const gfx::RoundedCornersF& panel_radii = gfx::RoundedCornersF()); private: - friend class DisplayChangeObserverTest; + friend class DisplayChangeObserverTestBase; void UpdateInternalDisplay( const DisplayConfigurator::DisplayStateList& display_states); @@ -79,6 +86,10 @@ const DisplaySnapshot* snapshot, const DisplayMode* mode_info); + // The panel radii of the internal display that is specified via command-line + // switch `display::switches::kDisplayProperties`. + absl::optional<gfx::RoundedCornersF> internal_panel_radii_; + // |display_manager_| is not owned and must outlive DisplayChangeObserver. DisplayManager* display_manager_; };
diff --git a/ui/display/manager/display_change_observer_unittest.cc b/ui/display/manager/display_change_observer_unittest.cc index cb2dafd..85d5dfbf 100644 --- a/ui/display/manager/display_change_observer_unittest.cc +++ b/ui/display/manager/display_change_observer_unittest.cc
@@ -5,11 +5,16 @@ #include "ui/display/manager/display_change_observer.h" #include <cmath> +#include <memory> #include <set> #include <string> #include <tuple> +#include "base/command_line.h" +#include "base/strings/string_piece_forward.h" #include "base/strings/stringprintf.h" +#include "base/test/gtest_util.h" +#include "base/test/scoped_command_line.h" #include "base/test/scoped_feature_list.h" #include "build/chromeos_buildflags.h" #include "cc/base/math_util.h" @@ -29,6 +34,7 @@ #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_f.h" +#include "ui/gfx/geometry/rounded_corners_f.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/range/range_f.h" @@ -57,7 +63,28 @@ } // namespace -class DisplayChangeObserverTest : public testing::Test, +class DisplayChangeObserverTestBase : public testing::Test { + public: + DisplayChangeObserverTestBase() = default; + + DisplayChangeObserverTestBase(const DisplayChangeObserverTestBase&) = delete; + DisplayChangeObserverTestBase& operator=( + const DisplayChangeObserverTestBase&) = delete; + + ~DisplayChangeObserverTestBase() override = default; + + // Pass through method to be called by individual test cases. + ManagedDisplayInfo CreateManagedDisplayInfo(DisplayChangeObserver* observer, + const DisplaySnapshot* snapshot, + const DisplayMode* mode_info) { + return observer->CreateManagedDisplayInfoInternal(snapshot, mode_info); + } + + protected: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +class DisplayChangeObserverTest : public DisplayChangeObserverTestBase, public testing::WithParamInterface<bool> { public: DisplayChangeObserverTest() = default; @@ -68,7 +95,7 @@ ~DisplayChangeObserverTest() override = default; - // testing::Test: + // DisplayChangeObserverTestBase: void SetUp() override { if (GetParam()) { scoped_feature_list_.InitAndEnableFeature(features::kListAllDisplayModes); @@ -77,20 +104,95 @@ features::kListAllDisplayModes); } - Test::SetUp(); + DisplayChangeObserverTestBase::SetUp(); } - - // Pass through method to be called by individual test cases. - ManagedDisplayInfo CreateManagedDisplayInfo(DisplayChangeObserver* observer, - const DisplaySnapshot* snapshot, - const DisplayMode* mode_info) { - return observer->CreateManagedDisplayInfoInternal(snapshot, mode_info); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; }; +class DisplayChangeObserverPanelRadiiTest + : public DisplayChangeObserverTestBase { + public: + DisplayChangeObserverPanelRadiiTest() = default; + + DisplayChangeObserverPanelRadiiTest( + const DisplayChangeObserverPanelRadiiTest&) = delete; + DisplayChangeObserverPanelRadiiTest& operator=( + const DisplayChangeObserverPanelRadiiTest&) = delete; + + ~DisplayChangeObserverPanelRadiiTest() override = default; + + // testing::Test: + void SetUp() override { + display_manager_ = std::make_unique<DisplayManager>(/*screen=*/nullptr); + default_display_mode_ = MakeDisplayMode(1920, 1080, true, 60); + scoped_feature_list_.InitAndEnableFeature(features::kRoundedDisplay); + + ui::DeviceDataManager::CreateInstance(); + DisplayChangeObserverTestBase::SetUp(); + } + + void InitializeDisplayChangeObserver() { + display_change_observer_ = + std::make_unique<DisplayChangeObserver>(display_manager_.get()); + } + + protected: + base::test::ScopedCommandLine command_line_; + std::unique_ptr<DisplayManager> display_manager_; + std::unique_ptr<DisplayChangeObserver> display_change_observer_; + std::unique_ptr<DisplayMode> default_display_mode_; +}; + +TEST_F(DisplayChangeObserverPanelRadiiTest, RadiiSpecifiedForInternalDisplay) { + command_line_.GetProcessCommandLine()->AppendSwitchASCII( + switches::kDisplayProperties, + "[{\"connector-type\": 14, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": 15, \"top-left\": 16, \"top-right\": 16}}]"); + + InitializeDisplayChangeObserver(); + + // Radii specified for the connection protocol. + std::unique_ptr<DisplaySnapshot> display_snapshot = + FakeDisplaySnapshot::Builder() + .SetId(123) + .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60)) + .SetType( + display::DisplayConnectionType::DISPLAY_CONNECTION_TYPE_INTERNAL) + .Build(); + + const ManagedDisplayInfo display_info = CreateManagedDisplayInfo( + display_change_observer_.get(), display_snapshot.get(), + default_display_mode_.get()); + + EXPECT_EQ(display_info.rounded_corners_radii(), + gfx::RoundedCornersF(16, 16, 15, 15)); +} + +TEST_F(DisplayChangeObserverPanelRadiiTest, RadiiNotSetForExternalDisplays) { + // Specifies radii for connectors that are different from the connector of + // the display(snapshot) under test. + command_line_.GetProcessCommandLine()->AppendSwitchASCII( + switches::kDisplayProperties, + "[{\"connector-type\": 14, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": 15, \"top-left\": 16, \"top-right\": 16}}]"); + + InitializeDisplayChangeObserver(); + + // Radii is not specified for the connection protocol + // `DisplayConnectionProtocol::k9PinDin` through command line. + std::unique_ptr<DisplaySnapshot> display_snapshot = + FakeDisplaySnapshot::Builder() + .SetId(123) + .SetNativeMode(MakeDisplayMode(1920, 1080, true, 60)) + .SetType(display::DisplayConnectionType::DISPLAY_CONNECTION_TYPE_HDMI) + .Build(); + + const ManagedDisplayInfo display_info = CreateManagedDisplayInfo( + display_change_observer_.get(), display_snapshot.get(), + default_display_mode_.get()); + + EXPECT_TRUE(display_info.rounded_corners_radii().IsEmpty()); +} + TEST_P(DisplayChangeObserverTest, GetExternalManagedDisplayModeList) { std::unique_ptr<DisplaySnapshot> display_snapshot = FakeDisplaySnapshot::Builder()
diff --git a/ui/display/manager/display_properties_parser.cc b/ui/display/manager/display_properties_parser.cc new file mode 100644 index 0000000..6cade654 --- /dev/null +++ b/ui/display/manager/display_properties_parser.cc
@@ -0,0 +1,93 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/display/manager/display_properties_parser.h" + +#include "base/logging.h" +#include "base/strings/stringprintf.h" +#include "base/values.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/display/types/display_constants.h" +#include "ui/gfx/geometry/rounded_corners_f.h" + +namespace display { +namespace { + +constexpr char kDisplayRadiiKeyName[] = "rounded-corners"; +constexpr char kDisplayUpperLeftRadiusKeyName[] = "top-left"; +constexpr char kDisplayUpperRightRadiusKeyName[] = "top-right"; +constexpr char kDisplayLowerLeftRadiusKeyName[] = "bottom-left"; +constexpr char kDisplayLowerRightRadiusKeyName[] = "bottom-right"; + +absl::optional<gfx::RoundedCornersF> ParsePanelRadii( + const base::Value* json_value) { + if (!json_value || !json_value->is_dict()) { + return absl::nullopt; + } + + const auto& radii_value = json_value->GetDict(); + if (radii_value.size() != 4u) { + return absl::nullopt; + } + + gfx::RoundedCornersF panel_radii; + for (const auto value : radii_value) { + if (!value.second.is_int() || value.second.GetInt() < 0) { + return absl::nullopt; + } + + const auto& key = value.first; + const int radius = value.second.GetInt(); + + if (key == kDisplayUpperLeftRadiusKeyName) { + panel_radii.set_upper_left(radius); + } else if (key == kDisplayUpperRightRadiusKeyName) { + panel_radii.set_upper_right(radius); + } else if (key == kDisplayLowerLeftRadiusKeyName) { + panel_radii.set_lower_left(radius); + } else if (key == kDisplayLowerRightRadiusKeyName) { + panel_radii.set_lower_right(radius); + } + } + + return panel_radii; +} + +} // namespace + +absl::optional<gfx::RoundedCornersF> ParseDisplayPanelRadii( + const base::Value* json_value) { + if (!json_value->is_list()) { + return absl::nullopt; + } + const auto& display_infos = json_value->GetList(); + + if (display_infos.size() > 1) { + LOG(WARNING) << "Currently rounded-display property is only supported for " + "the internal display"; + return absl::nullopt; + } + + if (!display_infos.back().is_dict()) { + return absl::nullopt; + } + + const auto& display_info = display_infos.back().GetDict(); + + absl::optional<gfx::RoundedCornersF> panel_radii = + ParsePanelRadii(display_info.Find(kDisplayRadiiKeyName)); + + if (!panel_radii.has_value()) { + LOG(ERROR) << base::StringPrintf( + "Invalid format of `%s` specified through display-properties " + "switch", + kDisplayRadiiKeyName); + + return absl::nullopt; + } + + return panel_radii; +} + +} // namespace display
diff --git a/ui/display/manager/display_properties_parser.h b/ui/display/manager/display_properties_parser.h new file mode 100644 index 0000000..0a28ca87 --- /dev/null +++ b/ui/display/manager/display_properties_parser.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_DISPLAY_MANAGER_DISPLAY_PROPERTIES_PARSER_H_ +#define UI_DISPLAY_MANAGER_DISPLAY_PROPERTIES_PARSER_H_ + +#include "base/values.h" +#include "ui/display/manager/display_manager_export.h" +#include "ui/display/types/display_constants.h" +#include "ui/gfx/geometry/rounded_corners_f.h" + +namespace display { + +DISPLAY_MANAGER_EXPORT +absl::optional<gfx::RoundedCornersF> ParseDisplayPanelRadii( + const base::Value* json_value); + +} // namespace display + +#endif // UI_DISPLAY_MANAGER_DISPLAY_PROPERTIES_PARSER_H_
diff --git a/ui/display/manager/display_properties_parser_unittest.cc b/ui/display/manager/display_properties_parser_unittest.cc new file mode 100644 index 0000000..7e2e4a5d --- /dev/null +++ b/ui/display/manager/display_properties_parser_unittest.cc
@@ -0,0 +1,70 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/display/manager/display_properties_parser.h" + +#include "base/json/json_reader.h" +#include "base/test/gtest_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/display/types/display_constants.h" + +namespace display { +namespace { + +absl::optional<base::Value> ReadJsonString(base::StringPiece json) { + return base::JSONReader::Read(json); +} + +using DisplayPropertiesParserTest = ::testing::Test; + +TEST(DisplayPropertiesParserTest, Valid_SingleDisplay) { + auto result = ReadJsonString( + "[{\"connector-type\": 14, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": 15, \"top-left\": 16, \"top-right\": 16}}]"); + + const auto radii = ParseDisplayPanelRadii(&result.value()); + ASSERT_TRUE(radii.has_value()); + EXPECT_EQ(radii, gfx::RoundedCornersF(16, 16, 15, 15)); +} + +TEST(DisplayPropertiesParserTest, Invalid_MultipleDisplays) { + auto result = ReadJsonString( + "[{\"connector-type\": 14, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": 15, \"top-left\": 16, \"top-right\": 16}}, " + "{\"connector-type\": 19, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": 15, \"top-left\": 15, \"top-right\": 15}}]"); + + const auto radii = ParseDisplayPanelRadii(&result.value()); + ASSERT_FALSE(radii.has_value()); +} + +TEST(DisplayPropertiesParserTest, InValidRadii) { + auto result = ReadJsonString( + "[{\"connector-type\": 5, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": -15, \"top-left\": 16, \"top-right\": 16}}]"); + + const auto radii = ParseDisplayPanelRadii(&result.value()); + ASSERT_FALSE(radii.has_value()); +} + +TEST(DisplayPropertiesParserTest, InValidField_WrongKey) { + auto result = ReadJsonString( + "[{\"connector-type\": 5, \"round-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": -15, \"top-left\": 16, \"top-right\": 16}}]"); + + const auto radii = ParseDisplayPanelRadii(&result.value()); + ASSERT_FALSE(radii.has_value()); +} + +TEST(DisplayPropertiesParserTest, InValidField_MissingValuePair) { + auto result = ReadJsonString( + "[{\"connector-type\": 5, \"rounded-corners\": {\"bottom-left\": 15, " + "\"bottom-right\": -15, \"top-left\": 16}}]"); + + const auto radii = ParseDisplayPanelRadii(&result.value()); + ASSERT_FALSE(radii.has_value()); +} + +} // namespace +} // namespace display
diff --git a/ui/gfx/native_widget_types.h b/ui/gfx/native_widget_types.h index 5d0dfd9..1108473a 100644 --- a/ui/gfx/native_widget_types.h +++ b/ui/gfx/native_widget_types.h
@@ -58,7 +58,7 @@ #endif // defined(USE_AURA) #if BUILDFLAG(IS_WIN) -typedef struct HFONT__* HFONT; +using HFONT = struct HFONT__*; struct IAccessible; #elif BUILDFLAG(IS_IOS) struct CGContext; @@ -112,29 +112,29 @@ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) extern "C" { struct _AtkObject; -typedef struct _AtkObject AtkObject; +using AtkObject = struct _AtkObject; } #endif namespace gfx { #if defined(USE_AURA) -typedef ui::Cursor NativeCursor; -typedef aura::Window* NativeView; -typedef aura::Window* NativeWindow; -typedef ui::Event* NativeEvent; +using NativeCursor = ui::Cursor; +using NativeView = aura::Window*; +using NativeWindow = aura::Window*; +using NativeEvent = ui::Event*; constexpr NativeView kNullNativeView = nullptr; constexpr NativeWindow kNullNativeWindow = nullptr; #elif BUILDFLAG(IS_IOS) -typedef void* NativeCursor; -typedef UIView* NativeView; -typedef UIWindow* NativeWindow; -typedef UIEvent* NativeEvent; +using NativeCursor = void*; +using NativeView = UIView*; +using NativeWindow = UIWindow*; +using NativeEvent = UIEvent*; constexpr NativeView kNullNativeView = nullptr; constexpr NativeWindow kNullNativeWindow = nullptr; #elif BUILDFLAG(IS_MAC) -typedef NSCursor* NativeCursor; -typedef NSEvent* NativeEvent; +using NativeCursor = NSCursor*; +using NativeEvent = NSEvent*; // NativeViews and NativeWindows on macOS are not necessarily in the same // process as the NSViews and NSWindows that they represent. Require an explicit // function call (GetNativeNSView or GetNativeNSWindow) to retrieve the @@ -197,10 +197,10 @@ constexpr NativeView kNullNativeView = NativeView(nullptr); constexpr NativeWindow kNullNativeWindow = NativeWindow(nullptr); #elif BUILDFLAG(IS_ANDROID) -typedef void* NativeCursor; -typedef ui::ViewAndroid* NativeView; -typedef ui::WindowAndroid* NativeWindow; -typedef base::android::ScopedJavaGlobalRef<jobject> NativeEvent; +using NativeCursor = void*; +using NativeView = ui::ViewAndroid*; +using NativeWindow = ui::WindowAndroid*; +using NativeEvent = base::android::ScopedJavaGlobalRef<jobject>; constexpr NativeView kNullNativeView = nullptr; constexpr NativeWindow kNullNativeWindow = nullptr; #else @@ -208,24 +208,24 @@ #endif #if BUILDFLAG(IS_WIN) -typedef HFONT NativeFont; -typedef IAccessible* NativeViewAccessible; +using NativeFont = HFONT; +using NativeViewAccessible = IAccessible*; #elif BUILDFLAG(IS_IOS) -typedef UIFont* NativeFont; -typedef id NativeViewAccessible; +using NativeFont = UIFont*; +using NativeViewAccessible = id; #elif BUILDFLAG(IS_MAC) -typedef NSFont* NativeFont; -typedef id NativeViewAccessible; +using NativeFont = NSFont*; +using NativeViewAccessible = id; // TODO(crbug.com/1052397): Revisit the macro expression once build flag switch // of lacros-chrome is complete. #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) // Linux doesn't have a native font type. -typedef AtkObject* NativeViewAccessible; +using NativeViewAccessible = AtkObject*; #else // Android, Chrome OS, etc. -typedef struct _UnimplementedNativeViewAccessible - UnimplementedNativeViewAccessible; -typedef UnimplementedNativeViewAccessible* NativeViewAccessible; +using UnimplementedNativeViewAccessible = + struct _UnimplementedNativeViewAccessible; +using NativeViewAccessible = UnimplementedNativeViewAccessible*; #endif // A constant value to indicate that gfx::NativeCursor refers to no cursor. @@ -241,23 +241,23 @@ // test_shell. // // See comment at the top of the file for usage. -typedef intptr_t NativeViewId; +using NativeViewId = intptr_t; // AcceleratedWidget provides a surface to compositors to paint pixels. #if BUILDFLAG(IS_WIN) -typedef HWND AcceleratedWidget; +using AcceleratedWidget = HWND; constexpr AcceleratedWidget kNullAcceleratedWidget = nullptr; #elif BUILDFLAG(IS_IOS) -typedef UIView* AcceleratedWidget; +using AcceleratedWidget = UIView*; constexpr AcceleratedWidget kNullAcceleratedWidget = 0; #elif BUILDFLAG(IS_MAC) -typedef uint64_t AcceleratedWidget; +using AcceleratedWidget = uint64_t; constexpr AcceleratedWidget kNullAcceleratedWidget = 0; #elif BUILDFLAG(IS_ANDROID) -typedef ANativeWindow* AcceleratedWidget; +using AcceleratedWidget = ANativeWindow*; constexpr AcceleratedWidget kNullAcceleratedWidget = 0; #elif BUILDFLAG(IS_OZONE) -typedef uint32_t AcceleratedWidget; +using AcceleratedWidget = uint32_t; constexpr AcceleratedWidget kNullAcceleratedWidget = 0; #else #error unknown platform
diff --git a/ui/native_theme/native_theme_fluent.cc b/ui/native_theme/native_theme_fluent.cc index 7f68738f..c5b6d031 100644 --- a/ui/native_theme/native_theme_fluent.cc +++ b/ui/native_theme/native_theme_fluent.cc
@@ -82,7 +82,13 @@ path.addRRect(rrect); canvas->clipPath(path, true); - const SkColor thumb_color = color_provider->GetColor(kColorScrollbarThumb); + ColorId thumb_color_id = kColorScrollbarThumb; + if (state == NativeTheme::kPressed) { + thumb_color_id = kColorScrollbarThumbPressed; + } else if (state == NativeTheme::kHovered) { + thumb_color_id = kColorScrollbarThumbHovered; + } + const SkColor thumb_color = color_provider->GetColor(thumb_color_id); cc::PaintFlags flags; flags.setAntiAlias(true); flags.setColor(thumb_color);
diff --git a/ui/ozone/platform/flatland/ozone_platform_flatland.cc b/ui/ozone/platform/flatland/ozone_platform_flatland.cc index a833322..51fdcdb 100644 --- a/ui/ozone/platform/flatland/ozone_platform_flatland.cc +++ b/ui/ozone/platform/flatland/ozone_platform_flatland.cc
@@ -199,12 +199,8 @@ const PlatformRuntimeProperties& GetPlatformRuntimeProperties() override { static OzonePlatform::PlatformRuntimeProperties properties; - - // This property is set when the GetPlatformRuntimeProperties is - // called on the gpu process side. - if (has_initialized_gpu()) - properties.supports_native_pixmaps = true; - + properties.supports_native_pixmaps = true; + properties.supports_overlays = true; return properties; }
diff --git a/ui/ozone/platform/scenic/ozone_platform_scenic.cc b/ui/ozone/platform/scenic/ozone_platform_scenic.cc index cf6508c..cab86ec 100644 --- a/ui/ozone/platform/scenic/ozone_platform_scenic.cc +++ b/ui/ozone/platform/scenic/ozone_platform_scenic.cc
@@ -206,12 +206,8 @@ const PlatformRuntimeProperties& GetPlatformRuntimeProperties() override { static OzonePlatform::PlatformRuntimeProperties properties; - - // This property is set when the GetPlatformRuntimeProperties is - // called on the gpu process side. - if (has_initialized_gpu()) - properties.supports_native_pixmaps = true; - + properties.supports_native_pixmaps = true; + properties.supports_overlays = true; return properties; }
diff --git a/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc b/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc index dbec0cc..9ab12b1 100644 --- a/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc +++ b/ui/ozone/platform/wayland/host/wayland_cursor_factory.cc
@@ -6,9 +6,13 @@ #include <wayland-cursor.h> +#include <cmath> + +#include "base/numerics/safe_conversions.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "base/task/thread_pool/thread_pool_instance.h" +#include "skia/ext/image_operations.h" #include "ui/base/cursor/platform_cursor.h" #include "ui/linux/linux_ui.h" #include "ui/ozone/common/bitmap_cursor.h" @@ -20,14 +24,14 @@ namespace { -wl_cursor_theme* LoadCursorTheme(const std::string& name, - int size, - float scale, - wl_shm* shm) { - // wl_cursor_theme_load() can return nullptr. We don't check that here but - // have to be cautious when we actually load the shape. - return wl_cursor_theme_load((name.empty() ? nullptr : name.c_str()), - static_cast<int>(size * scale), shm); +// The threshold for rounding down the final scale of the cursor image +// that gets sent to the Wayland compositor. For instance, if the +// original cursor image scale is 1.2, we'll downscale it to 1.0. On +// the other hand, if it's something like 1.5 then we'll upscale it to 2.0. +const float kCursorScaleFlooringThreshold = 0.2; + +float GetRoundedScale(float scale) { + return std::ceil(scale - kCursorScaleFlooringThreshold); } } // namespace @@ -50,6 +54,56 @@ cursor_theme_observer_.Observe(linux_ui); } +scoped_refptr<PlatformCursor> WaylandCursorFactory::CreateImageCursor( + mojom::CursorType type, + const SkBitmap& bitmap, + const gfx::Point& hotspot) { + // Wayland only supports cursor images with an integer scale, so we + // must upscale cursor images with non-integer scales to integer scaled + // images so that the cursor is displayed correctly. + float rounded_scale = GetRoundedScale(scale_); + if (std::abs(rounded_scale - scale_) > + std::numeric_limits<float>::epsilon() && + !connection_->surface_submission_in_pixel_coordinates()) { + const SkBitmap scaled_bitmap = skia::ImageOperations::Resize( + bitmap, skia::ImageOperations::RESIZE_LANCZOS3, + std::round(bitmap.width() * (rounded_scale / scale_)), + std::round(bitmap.height() * (rounded_scale / scale_))); + const gfx::Point scaled_hotspot = + gfx::ScaleToRoundedPoint(hotspot, rounded_scale / scale_); + return base::MakeRefCounted<BitmapCursor>(type, scaled_bitmap, + scaled_hotspot, rounded_scale); + } else { + return BitmapCursorFactory::CreateImageCursor(type, bitmap, hotspot); + } +} + +scoped_refptr<PlatformCursor> WaylandCursorFactory::CreateAnimatedCursor( + mojom::CursorType type, + const std::vector<SkBitmap>& bitmaps, + const gfx::Point& hotspot, + base::TimeDelta frame_delay) { + float rounded_scale = GetRoundedScale(scale_); + if (std::abs(rounded_scale - scale_) > + std::numeric_limits<float>::epsilon() && + !connection_->surface_submission_in_pixel_coordinates()) { + std::vector<SkBitmap> scaled_bitmaps; + for (const auto& bitmap : bitmaps) { + scaled_bitmaps.push_back(skia::ImageOperations::Resize( + bitmap, skia::ImageOperations::RESIZE_LANCZOS3, + std::round(bitmap.width() * (rounded_scale / scale_)), + std::round(bitmap.height() * (rounded_scale / scale_)))); + } + const gfx::Point scaled_hotspot = + gfx::ScaleToRoundedPoint(hotspot, rounded_scale / scale_); + return base::MakeRefCounted<BitmapCursor>( + type, scaled_bitmaps, scaled_hotspot, frame_delay, rounded_scale); + } else { + return BitmapCursorFactory::CreateAnimatedCursor(type, bitmaps, hotspot, + frame_delay); + } +} + scoped_refptr<PlatformCursor> WaylandCursorFactory::GetDefaultCursor( mojom::CursorType type) { auto* const current_theme = GetCurrentTheme(); @@ -60,8 +114,11 @@ if (!cursor) continue; - current_theme->cache[type] = - base::MakeRefCounted<BitmapCursor>(type, cursor, scale_); + current_theme->cache[type] = base::MakeRefCounted<BitmapCursor>( + type, cursor, + connection_->surface_submission_in_pixel_coordinates() + ? scale_ + : GetRoundedScale(scale_)); break; } } @@ -77,6 +134,8 @@ } void WaylandCursorFactory::SetDeviceScaleFactor(float scale) { + BitmapCursorFactory::SetDeviceScaleFactor(scale); + if (scale_ == scale) return; @@ -97,6 +156,8 @@ void WaylandCursorFactory::OnCursorThemeNameChanged( const std::string& cursor_theme_name) { + CHECK(!cursor_theme_name.empty()); + if (name_ == cursor_theme_name) return; @@ -132,7 +193,7 @@ } WaylandCursorFactory::ThemeData* WaylandCursorFactory::GetCurrentTheme() { - auto theme_it = theme_cache_.find(static_cast<int>(size_ * scale_)); + auto theme_it = theme_cache_.find(GetCacheKey()); if (theme_it == theme_cache_.end()) return nullptr; return theme_it->second.get(); @@ -147,7 +208,7 @@ // them (which is possible if the user played with settings but didn't switch // into Chromium), we don't need to track them all. if (!unloaded_theme_ && current_theme && current_theme->cache.size() > 0) - unloaded_theme_ = std::move(theme_cache_[static_cast<int>(size_ * scale_)]); + unloaded_theme_ = std::move(theme_cache_[GetCacheKey()]); theme_cache_.clear(); @@ -158,8 +219,7 @@ if (GetCurrentTheme()) return; - theme_cache_[static_cast<int>(size_ * scale_)] = - std::make_unique<ThemeData>(); + theme_cache_[GetCacheKey()] = std::make_unique<ThemeData>(); // The task environment is normally not created in tests. As this factory is // part of the platform that is created always and early, posting a task to @@ -170,12 +230,23 @@ base::ThreadPool::PostTaskAndReplyWithResult( FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(LoadCursorTheme, name_, size_, scale_, + base::BindOnce(wl_cursor_theme_load, name_.c_str(), GetCacheKey(), connection_->buffer_factory()->shm()), base::BindOnce(&WaylandCursorFactory::OnThemeLoaded, weak_factory_.GetWeakPtr(), name_, size_)); } +int WaylandCursorFactory::GetCacheKey() const { + if (connection_->surface_submission_in_pixel_coordinates()) { + // When surface submission in pixel coordinates is enabled, true + // fractional scaled cursors can be represented without scaling, so + // load the cursor with its proper size. + return base::checked_cast<int>(size_ * scale_); + } else { + return base::checked_cast<int>(size_ * GetRoundedScale(scale_)); + } +} + void WaylandCursorFactory::OnThemeLoaded(const std::string& loaded_theme_name, int loaded_theme_size, wl_cursor_theme* loaded_theme) {
diff --git a/ui/ozone/platform/wayland/host/wayland_cursor_factory.h b/ui/ozone/platform/wayland/host/wayland_cursor_factory.h index 1f41700..6162ce1 100644 --- a/ui/ozone/platform/wayland/host/wayland_cursor_factory.h +++ b/ui/ozone/platform/wayland/host/wayland_cursor_factory.h
@@ -41,6 +41,15 @@ // CursorFactory: scoped_refptr<PlatformCursor> GetDefaultCursor( mojom::CursorType type) override; + scoped_refptr<PlatformCursor> CreateImageCursor( + mojom::CursorType type, + const SkBitmap& bitmap, + const gfx::Point& hotspot) override; + scoped_refptr<PlatformCursor> CreateAnimatedCursor( + mojom::CursorType type, + const std::vector<SkBitmap>& bitmaps, + const gfx::Point& hotspot, + base::TimeDelta frame_delay) override; void SetDeviceScaleFactor(float scale) override; protected: @@ -77,6 +86,9 @@ // Loads the theme with the current size and scale. Does nothing if data // already exists. void MaybeLoadThemeCursors(); + // Returns the cache key in theme_cache_ to be used for the current size + // and scale. + int GetCacheKey() const; void OnThemeLoaded(const std::string& loaded_theme_name, int loaded_theme_size, wl_cursor_theme* loaded_theme);
diff --git a/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc b/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc index ac77535..309cc075 100644 --- a/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc +++ b/ui/ozone/platform/wayland/host/wayland_pointer_unittest.cc
@@ -19,6 +19,7 @@ #include "ui/events/event.h" #include "ui/ozone/common/bitmap_cursor_factory.h" #include "ui/ozone/platform/wayland/host/wayland_cursor.h" +#include "ui/ozone/platform/wayland/host/wayland_cursor_factory.h" #include "ui/ozone/platform/wayland/host/wayland_seat.h" #include "ui/ozone/platform/wayland/host/wayland_window.h" #include "ui/ozone/platform/wayland/test/mock_pointer.h" @@ -30,6 +31,9 @@ #include "ui/platform_window/platform_window_init_properties.h" using ::testing::_; +using ::testing::AllOf; +using ::testing::Ge; +using ::testing::Le; using ::testing::Mock; using ::testing::Ne; using ::testing::SaveArg; @@ -479,31 +483,45 @@ // Tests that bitmap is set on pointer focus and the pointer surface respects // provided scale of the surface image. TEST_F(WaylandPointerTest, SetBitmapAndScaleOnPointerFocus) { - for (int32_t scale = 1; scale < 5; scale++) { - gfx::Size size = {10 * scale, 10 * scale}; + for (float scale : {1.0, 1.2, 1.5, 1.75, 2.0, 2.5, 3.0}) { + gfx::Size size = {static_cast<int>(10 * scale), + static_cast<int>(10 * scale)}; SkBitmap dummy_cursor; SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), SkColorType::kBGRA_8888_SkColorType, SkAlphaType::kPremul_SkAlphaType); dummy_cursor.allocPixels(info, size.width() * 4); + const gfx::Point hotspot_px = {5, 8}; + const gfx::Point hotspot_dip = + gfx::ScaleToRoundedPoint(hotspot_px, 1 / scale); + +#if BUILDFLAG(IS_CHROMEOS_LACROS) BitmapCursorFactory cursor_factory; +#else + WaylandCursorFactory cursor_factory(connection_.get()); +#endif cursor_factory.SetDeviceScaleFactor(scale); - auto cursor = cursor_factory.CreateImageCursor( - mojom::CursorType::kCustom, dummy_cursor, gfx::Point(5, 8)); + auto cursor = cursor_factory.CreateImageCursor(mojom::CursorType::kCustom, + dummy_cursor, hotspot_px); SendEnter(10, 10); // Set a cursor. wl_resource* surface_resource = nullptr; - PostToServerAndWait( - [&surface_resource](wl::TestWaylandServerThread* server) { - auto* const pointer = server->seat()->pointer(); + PostToServerAndWait([&surface_resource, + hotspot_dip](wl::TestWaylandServerThread* server) { + auto* const pointer = server->seat()->pointer(); - EXPECT_CALL(*pointer, SetCursor(Ne(nullptr), 5, 8)) - .WillOnce(SaveArg<0>(&surface_resource)); - }); + // Allow up to 1 DIP of precision loss. + EXPECT_CALL( + *pointer, + SetCursor(Ne(nullptr), + AllOf(Ge(hotspot_dip.x() - 1), Le(hotspot_dip.x() + 1)), + AllOf(Ge(hotspot_dip.y() - 1), Le(hotspot_dip.y() + 1)))) + .WillOnce(SaveArg<0>(&surface_resource)); + }); window_->SetCursor(cursor); connection_->Flush(); @@ -518,17 +536,25 @@ ASSERT_TRUE(surface_resource); - PostToServerAndWait( - [surface_resource, scale](wl::TestWaylandServerThread* server) { - auto* const pointer = server->seat()->pointer(); + PostToServerAndWait([surface_resource, scale, + hotspot_dip](wl::TestWaylandServerThread* server) { + auto* const pointer = server->seat()->pointer(); - auto* mock_pointer_surface = - wl::MockSurface::FromResource(surface_resource); - EXPECT_EQ(mock_pointer_surface->buffer_scale(), scale); + auto* mock_pointer_surface = + wl::MockSurface::FromResource(surface_resource); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + EXPECT_EQ(mock_pointer_surface->buffer_scale(), std::ceil(scale)); +#else + EXPECT_EQ(mock_pointer_surface->buffer_scale(), std::ceil(scale - 0.2f)); +#endif - // Update the focus. - EXPECT_CALL(*pointer, SetCursor(Ne(nullptr), 5, 8)); - }); + // Update the focus. + EXPECT_CALL( + *pointer, + SetCursor(Ne(nullptr), + AllOf(Ge(hotspot_dip.x() - 1), Le(hotspot_dip.x() + 1)), + AllOf(Ge(hotspot_dip.y() - 1), Le(hotspot_dip.y() + 1)))); + }); SendEnter(50, 75);
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 69a5a2e..9175f61 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -14,6 +14,7 @@ #include "base/functional/bind.h" #include "base/memory/scoped_refptr.h" #include "base/notreached.h" +#include "base/numerics/safe_conversions.h" #include "base/ranges/algorithm.h" #include "base/run_loop.h" #include "base/task/single_thread_task_runner.h" @@ -961,6 +962,11 @@ void WaylandWindow::UpdateCursorShape(scoped_refptr<BitmapCursor> cursor) { DCHECK(cursor); + CHECK(connection_->surface_submission_in_pixel_coordinates() || + cursor->type() == CursorType::kNone || + base::IsValueInRangeForNumericType<int>( + cursor->cursor_image_scale_factor())); + absl::optional<int32_t> shape = WaylandZcrCursorShapes::ShapeFromType(cursor->type()); @@ -984,8 +990,8 @@ connection_->zcr_cursor_shapes()->SetCursorShape(shape.value()); } else { // Use client-side bitmap cursors as fallback. // Translate physical pixels to DIPs. - gfx::Point hotspot_in_dips = - gfx::ScaleToRoundedPoint(cursor->hotspot(), 1.0f / ui_scale_); + gfx::Point hotspot_in_dips = gfx::ScaleToRoundedPoint( + cursor->hotspot(), 1.0f / cursor->cursor_image_scale_factor()); connection_->SetCursorBitmap( cursor->bitmaps(), hotspot_in_dips, std::ceil(cursor->cursor_image_scale_factor()));
diff --git a/ui/ozone/platform/wayland/test/wayland_test.cc b/ui/ozone/platform/wayland/test/wayland_test.cc index a74643b..a2bd1d9 100644 --- a/ui/ozone/platform/wayland/test/wayland_test.cc +++ b/ui/ozone/platform/wayland/test/wayland_test.cc
@@ -276,7 +276,11 @@ return GetParam().enable_aura_shell == wl::EnableAuraShellProtocol::kEnabled; } -WaylandTestSimple::WaylandTestSimple() : WaylandTestBase({}) {} +WaylandTestSimple::WaylandTestSimple() + : WaylandTestSimple(wl::ServerConfig{}) {} + +WaylandTestSimple::WaylandTestSimple(wl::ServerConfig config) + : WaylandTestBase(config) {} WaylandTestSimple::~WaylandTestSimple() = default;
diff --git a/ui/ozone/platform/wayland/test/wayland_test.h b/ui/ozone/platform/wayland/test/wayland_test.h index ea352b9..88b92981 100644 --- a/ui/ozone/platform/wayland/test/wayland_test.h +++ b/ui/ozone/platform/wayland/test/wayland_test.h
@@ -156,6 +156,7 @@ class WaylandTestSimple : public WaylandTestBase, public ::testing::Test { public: WaylandTestSimple(); + explicit WaylandTestSimple(wl::ServerConfig); WaylandTestSimple(const WaylandTestSimple&) = delete; WaylandTestSimple& operator=(const WaylandTestSimple&) = delete; ~WaylandTestSimple() override;
diff --git a/ui/strings/translations/ui_strings_as.xtb b/ui/strings/translations/ui_strings_as.xtb index 2827f74..6783ef82 100644 --- a/ui/strings/translations/ui_strings_as.xtb +++ b/ui/strings/translations/ui_strings_as.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{১ দিন পূর্বে}one{# দিন পূর্বে}other{# দিন পূর্বে}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{১ মিনিট পূর্বে}one{# মিনিট পূর্বে}other{# মিনিট পূর্বে}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{১মি}one{#মি}other{#মি}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{১ দিন পূৰ্বে}one{# দিন পূৰ্বে}other{# দিন পূৰ্বে}}</translation> <translation id="1181037720776840403">আঁতৰাওক</translation> <translation id="1243314992276662751">আপল’ড কৰক</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> শ্বেয়াৰ কৰিব পৰা নগ’ল</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">বাওঁফালৰ পৰা সোঁফাললৈ</translation> <translation id="1383876407941801731">Search</translation> <translation id="1398853756734560583">সৰ্বাধিক মাত্ৰালৈ বঢ়াওক</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{১ মিনিট পূৰ্বে}one{# মিনিট পূৰ্বে}other{# মিনিট পূৰ্বে}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> শ্বেয়াৰ কৰিব নোৱাৰি</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{১ মাহ পূৰ্বে}one{# মাহ পূৰ্বে}other{# মাহ পূৰ্বে}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{১ মিনিট আৰু }one{# মিনিট আৰু }other{# মিনিট আৰু }}</translation> <translation id="1643823602425662293">জাননী</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">প্ৰতিচ্ছবি</translation> <translation id="4565377596337484307">পাছৱৰ্ড লুকুৱাওক</translation> <translation id="4588090240171750605">সোঁফাললৈ স্ক্ৰ’ল কৰক</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{১ বছৰ পূৰ্বে}one{# বছৰ পূৰ্বে}other{# বছৰ পূৰ্বে}}</translation> <translation id="4724120544754982507">জাননী কেন্দ্ৰ, <ph name="UNREAD_NOTIFICATION_COUNT" /> নপঢ়া জাননীসমূহ</translation> <translation id="4729257764711776855">সংখ্যা</translation> <translation id="4746179598275229723">এক্সটেনশ্বন আনপিন কৰা আছে</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">পঠিয়াই থকা হৈছে...</translation> <translation id="8876215549894133151">ফৰ্মেট:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{১ ঘণ্টা পূৰ্বে}one{# ঘণ্টা পূৰ্বে}other{# ঘণ্টা পূৰ্বে}}</translation> <translation id="8996630695507351249">নিশ্চিত হৈ লওক যে <ph name="TARGET_DEVICE_NAME" /> ইণ্টাৰনেটৰ সৈতে সংযুক্ত হৈ আছে।</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{১ ছেকেণ্ড}one{# ছেকেণ্ড}other{# ছেকেণ্ড}}</translation> <translation id="9059834730836941392">জাননী সংকোচন কৰক</translation> <translation id="9170848237812810038">&আনডু কৰক</translation> <translation id="932327136139879170">গৃহ</translation> <translation id="944069440740578670">নপঢ়া জাননীসমূহ</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{১ ছেকেণ্ড পূৰ্বে}one{# ছেকেণ্ড পূৰ্বে}other{# ছেকেণ্ড পূৰ্বে}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_az.xtb b/ui/strings/translations/ui_strings_az.xtb index f4c1d48..43f8da8 100644 --- a/ui/strings/translations/ui_strings_az.xtb +++ b/ui/strings/translations/ui_strings_az.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 gün öncə}other{# gün öncə}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 dəqiqə əvvəl}other{# dəqiqə əvvəl}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1dəq}other{#dəq}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 gün əvvəl}other{# gün əvvəl}}</translation> <translation id="1181037720776840403">Silin</translation> <translation id="1243314992276662751">Yükləyin</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> paylaşmaq mümkün olmnadı</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Soldan sağa</translation> <translation id="1383876407941801731">Axtar</translation> <translation id="1398853756734560583">Artırın</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 dəqiqə əvvəl}other{# dəqiqə əvvəl}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> paylaşmaq mümkün deyil</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ay əvvəl}other{# ay əvvəl}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 dəqiqə və }other{# dəqiqə və }}</translation> <translation id="1643823602425662293">Bildiriş</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Şəkil</translation> <translation id="4565377596337484307">Parolu gizlədin</translation> <translation id="4588090240171750605">Sağa Sürüşdürün</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 il əvvəl}other{# il əvvəl}}</translation> <translation id="4724120544754982507">Bildiriş Mərkəzi <ph name="UNREAD_NOTIFICATION_COUNT" /> oxunmamış bildiriş</translation> <translation id="4729257764711776855">nömrə</translation> <translation id="4746179598275229723">Artırma çıxarılıb</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Göndərilir...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 saat əvvəl}other{# saat əvvəl}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> cihazının internetə qoşulduğuna əmin olun.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 san}other{# san}}</translation> <translation id="9059834730836941392">Bildirişi yığcamlaşdırın</translation> <translation id="9170848237812810038">Ləğv edin</translation> <translation id="932327136139879170">Ev</translation> <translation id="944069440740578670">Oxunmamış Bildirişlər</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 saniyə əvvəl}other{# saniyə əvvəl}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_bg.xtb b/ui/strings/translations/ui_strings_bg.xtb index c4ffadfd..31c488f 100644 --- a/ui/strings/translations/ui_strings_bg.xtb +++ b/ui/strings/translations/ui_strings_bg.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{Преди 1 ден}other{Преди # дни}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Преди 1 минута}other{Преди # минути}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 мин}other{# мин}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{Преди 1 ден}other{Преди # дни}}</translation> <translation id="1181037720776840403">Премахване</translation> <translation id="1243314992276662751">Качване</translation> <translation id="1266864766717917324">Споделянето на <ph name="CONTENT_TYPE" /> не бе възможно</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Отляво надясно</translation> <translation id="1383876407941801731">Търсене</translation> <translation id="1398853756734560583">Увеличаване</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{Преди 1 минута}other{Преди # минути}}</translation> <translation id="1450753235335490080">Споделянето на <ph name="CONTENT_TYPE" /> не е възможно</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{Преди 1 месец}other{Преди # месеца}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 минута и }other{# минути и }}</translation> <translation id="1643823602425662293">Известие</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Изображение</translation> <translation id="4565377596337484307">Скриване на паролата</translation> <translation id="4588090240171750605">Превъртане надясно</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{Преди 1 година}other{Преди # години}}</translation> <translation id="4724120544754982507">Център за известия, <ph name="UNREAD_NOTIFICATION_COUNT" /> непрочетени</translation> <translation id="4729257764711776855">номер</translation> <translation id="4746179598275229723">Разширението бе освободено</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Изпраща се...</translation> <translation id="8876215549894133151">Формат:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KБ</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{Преди 1 час}other{Преди # часа}}</translation> <translation id="8996630695507351249">Проверете дали <ph name="TARGET_DEVICE_NAME" /> има връзка с интернет.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 сек}other{# сек}}</translation> <translation id="9059834730836941392">Свиване на известието</translation> <translation id="9170848237812810038">&Отмяна</translation> <translation id="932327136139879170">Начална страница</translation> <translation id="944069440740578670">Непрочетени известия</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{Преди 1 секунда}other{Преди # секунди}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_bn.xtb b/ui/strings/translations/ui_strings_bn.xtb index 5d69cb42..60f939d7 100644 --- a/ui/strings/translations/ui_strings_bn.xtb +++ b/ui/strings/translations/ui_strings_bn.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{১ দিন পূর্বে}one{# দিন পূর্বে}other{# দিন পূর্বে}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{১ মিনিট আগে}one{# মিনিট আগে}other{# মিনিট আগে}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{১ মিনিট}one{# মিনিট}other{# মিনিট}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{১ দিন আগে}one{# দিন আগে}other{# দিন আগে}}</translation> <translation id="1181037720776840403">সরান</translation> <translation id="1243314992276662751">আপলোড</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> শেয়ার করা যায়নি</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">বাঁ থেকে ডান</translation> <translation id="1383876407941801731">Search</translation> <translation id="1398853756734560583">বড় করুন</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{১ মিনিট আগে}one{# মিনিট আগে}other{# মিনিট আগে}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> শেয়ার করা যাচ্ছে না</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{১ মাস আগে}one{# মাস আগে}other{# মাস আগে}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{১ মিনিট এবং }one{# মিনিট এবং }other{# মিনিট এবং }}</translation> <translation id="1643823602425662293">বিজ্ঞপ্তি</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">ছবি</translation> <translation id="4565377596337484307">পাসওয়ার্ড লুকান</translation> <translation id="4588090240171750605">ডান দিকে স্ক্রল করুন</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{১ বছর আগে}one{# বছর আগে}other{# বছর আগে}}</translation> <translation id="4724120544754982507">বিজ্ঞপ্তি কেন্দ্র, <ph name="UNREAD_NOTIFICATION_COUNT" />টি না পড়া বিজ্ঞপ্তি</translation> <translation id="4729257764711776855">নম্বর</translation> <translation id="4746179598275229723">এক্সটেনশন আনপিন করা হয়েছে</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">পাঠানো হচ্ছে…</translation> <translation id="8876215549894133151">ফর্ম্যাট:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> কেবি</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{১ ঘণ্টা আগে}one{# ঘণ্টা আগে}other{# ঘণ্টা আগে}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> ইন্টারনেটে কানেক্ট করা আছে কিনা দেখে নিন।</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{১ সেকেন্ড}one{# সেকেন্ড}other{# সেকেন্ড}}</translation> <translation id="9059834730836941392">বিজ্ঞপ্তি সঙ্কুচিত করুন</translation> <translation id="9170848237812810038">&পূর্বাবস্থায় ফিরুন</translation> <translation id="932327136139879170">হোম</translation> <translation id="944069440740578670">অপঠিত বিজ্ঞপ্তি</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{১ সেকেন্ড আগে}one{# সেকেন্ড আগে}other{# সেকেন্ড আগে}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_cy.xtb b/ui/strings/translations/ui_strings_cy.xtb index d42976c..671cf3c 100644 --- a/ui/strings/translations/ui_strings_cy.xtb +++ b/ui/strings/translations/ui_strings_cy.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 diwrnod yn ôl}zero{# diwrnod yn ôl}two{# ddiwrnod yn ôl}few{# diwrnod yn ôl}many{# diwrnod yn ôl}other{# diwrnod yn ôl}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 funud yn ôl}zero{# munud yn ôl}two{# funud yn ôl}few{# munud yn ôl}many{# munud yn ôl}other{# munud yn ôl}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1m}zero{#m}two{#f}few{#m}many{#m}other{#m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 Diwrnod yn Ôl}zero{# Diwrnod yn Ôl}two{# Ddiwrnod yn Ôl}few{# Diwrnod yn Ôl}many{# Diwrnod yn Ôl}other{# Diwrnod yn Ôl}}</translation> <translation id="1181037720776840403">Dileu</translation> <translation id="1243314992276662751">Uwchlwytho</translation> <translation id="1266864766717917324">Ni ellid rhannu <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">O'r Chwith i'r Dde</translation> <translation id="1383876407941801731">Chwilio</translation> <translation id="1398853756734560583">Mwyhau</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 Funud yn Ôl}zero{# Munud yn Ôl}two{# Funud yn Ôl}few{# Munud yn Ôl}many{# Munud yn Ôl}other{# Munud yn Ôl}}</translation> <translation id="1450753235335490080">Methu â rhannu <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 Mis yn Ôl}zero{# Mis yn Ôl}two{# Fis yn Ôl}few{# Mis yn Ôl}many{# Mis yn Ôl}other{# Mis yn Ôl}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 funud a }zero{# munud a }two{# funud a }few{# munud a }many{# munud a }other{# munud a }}</translation> <translation id="1643823602425662293">Hysbysiad</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Llun</translation> <translation id="4565377596337484307">Cuddio'r cyfrinair</translation> <translation id="4588090240171750605">Sgrolio i'r Dde</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 Flwyddyn yn Ôl}zero{# Mlynedd yn Ôl}two{# Flynedd yn Ôl}few{# Mlynedd yn Ôl}many{# Mlynedd yn Ôl}other{# Mlynedd yn Ôl}}</translation> <translation id="4724120544754982507">Canolfan Hysbysiadau, mae <ph name="UNREAD_NOTIFICATION_COUNT" /> hysbysiad sydd heb eu darllen</translation> <translation id="4729257764711776855">rhif</translation> <translation id="4746179598275229723">Estyniad wedi'i ddadbinio</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Wrthi'n anfon yr arian...</translation> <translation id="8876215549894133151">Fformat:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 Awr yn Ôl}zero{# Awr yn Ôl}two{# Awr yn Ôl}few{# Awr yn Ôl}many{# Awr yn Ôl}other{# Awr yn Ôl}}</translation> <translation id="8996630695507351249">Gwnewch yn siŵr bod <ph name="TARGET_DEVICE_NAME" /> wedi'i gysylltu â'r rhyngrwyd.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 eiliad}zero{# eiliad}two{# eiliad}few{# eiliad}many{# eiliad}other{# eiliad}}</translation> <translation id="9059834730836941392">Crebachu'r hysbysiad</translation> <translation id="9170848237812810038">&Dadwneud</translation> <translation id="932327136139879170">Cartref</translation> <translation id="944069440740578670">Hysbysiadau sydd heb eu darllen</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 Eiliad yn Ôl}zero{# Eiliad yn Ôl}two{# Eiliad yn Ôl}few{# Eiliad yn Ôl}many{# Eiliad yn Ôl}other{# Eiliad yn Ôl}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_de.xtb b/ui/strings/translations/ui_strings_de.xtb index f225234..dcd83d97 100644 --- a/ui/strings/translations/ui_strings_de.xtb +++ b/ui/strings/translations/ui_strings_de.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{vor 1 Tag}other{vor # Tagen}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{vor 1 Minute}other{vor # Minuten}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}other{# min}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{vor 1 Tag}other{vor # Tagen}}</translation> <translation id="1181037720776840403">Entfernen</translation> <translation id="1243314992276662751">Hochladen</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> konnte nicht geteilt werden</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Rechtsläufig</translation> <translation id="1383876407941801731">Durchsuchen</translation> <translation id="1398853756734560583">Maximieren</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{vor 1 Minute}other{vor # Minuten}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> kann nicht geteilt werden</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{vor 1 Monat}other{vor # Monaten}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 Minute und }other{# Minuten und }}</translation> <translation id="1643823602425662293">Benachrichtigung</translation> <translation id="169515659049020177">Umschalttaste</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Bild</translation> <translation id="4565377596337484307">Passwort ausblenden</translation> <translation id="4588090240171750605">Nach rechts blättern</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{vor 1 Jahr}other{vor # Jahren}}</translation> <translation id="4724120544754982507">Benachrichtigungscenter, <ph name="UNREAD_NOTIFICATION_COUNT" /> ungelesene Benachrichtigungen</translation> <translation id="4729257764711776855">Telefonnummer</translation> <translation id="4746179598275229723">Erweiterung losgelöst</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Wird gesendet...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{vor 1 Stunde}other{vor # Stunden}}</translation> <translation id="8996630695507351249">"<ph name="TARGET_DEVICE_NAME" />" muss mit dem Internet verbunden sein.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}other{# s}}</translation> <translation id="9059834730836941392">Benachrichtigung minimieren</translation> <translation id="9170848237812810038">&Rückgängig</translation> <translation id="932327136139879170">Startseite</translation> <translation id="944069440740578670">Ungelesene Benachrichtigungen</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{vor 1 Sekunde}other{vor # Sekunden}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_es.xtb b/ui/strings/translations/ui_strings_es.xtb index e253f888..83f290d 100644 --- a/ui/strings/translations/ui_strings_es.xtb +++ b/ui/strings/translations/ui_strings_es.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{Hace 1 día}other{Hace # días}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Hace 1 minuto}other{Hace # minutos}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}other{# min}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{hace 1 día}other{hace # días}}</translation> <translation id="1181037720776840403">Quitar</translation> <translation id="1243314992276662751">Subir</translation> <translation id="1266864766717917324">No se ha podido compartir: <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">De izquierda a derecha</translation> <translation id="1383876407941801731">Buscar</translation> <translation id="1398853756734560583">Maximizar</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{hace 1 minuto}other{hace # minutos}}</translation> <translation id="1450753235335490080">No se ha podido compartir: <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{hace 1 mes}other{hace # meses}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto y }other{# minutos y }}</translation> <translation id="1643823602425662293">Notificación</translation> <translation id="169515659049020177">Mayús</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Imagen</translation> <translation id="4565377596337484307">Ocultar contraseña</translation> <translation id="4588090240171750605">Desplazar a la derecha</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{hace 1 año}other{hace # años}}</translation> <translation id="4724120544754982507">Centro de notificaciones: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificaciones sin leer</translation> <translation id="4729257764711776855">número</translation> <translation id="4746179598275229723">Extensión no fijada</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Enviando...</translation> <translation id="8876215549894133151">Formato:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{hace 1 hora}other{hace # horas}}</translation> <translation id="8996630695507351249">Comprueba que <ph name="TARGET_DEVICE_NAME" /> esté conectado a Internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}other{# s}}</translation> <translation id="9059834730836941392">Ocultar notificación</translation> <translation id="9170848237812810038">&Deshacer</translation> <translation id="932327136139879170">Página principal</translation> <translation id="944069440740578670">Notificaciones no leídas</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{hace 1 segundo}other{hace # segundos}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_fa.xtb b/ui/strings/translations/ui_strings_fa.xtb index a2bd071c..084de896 100644 --- a/ui/strings/translations/ui_strings_fa.xtb +++ b/ui/strings/translations/ui_strings_fa.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{۱ روز قبل}one{# روز قبل}other{# روز قبل}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{۱ دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{۱ دقیقه}one{# دقیقه}other{# دقیقه}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{یک روز قبل}one{# روز قبل}other{# روز قبل}}</translation> <translation id="1181037720776840403">حذف</translation> <translation id="1243314992276662751">بارگذاری</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> همرسانی نشد</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">چپ به راست</translation> <translation id="1383876407941801731">جستجو</translation> <translation id="1398853756734560583">بزرگ کردن</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{یک دقیقه قبل}one{# دقیقه قبل}other{# دقیقه قبل}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> همرسانی نشد</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{یک ماه قبل}one{# ماه قبل}other{# ماه قبل}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{۱ دقیقه و }one{# دقیقه و }other{# دقیقه و }}</translation> <translation id="1643823602425662293">اعلان</translation> <translation id="169515659049020177">تبدیل</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">تصویر</translation> <translation id="4565377596337484307">عدم نمایش گذرواژه</translation> <translation id="4588090240171750605">پیمایش به راست</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{یک سال قبل}one{# سال قبل}other{# سال قبل}}</translation> <translation id="4724120544754982507">مرکز اعلان، <ph name="UNREAD_NOTIFICATION_COUNT" /> اعلان خواندهنشده</translation> <translation id="4729257764711776855">شماره</translation> <translation id="4746179598275229723">سنجاق افزونه برداشته شد</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">در حال ارسال...</translation> <translation id="8876215549894133151">قالب:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> کیلوبایت</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{یک ساعت قبل}one{# ساعت قبل}other{# ساعت قبل}}</translation> <translation id="8996630695507351249">مطمئن شوید <ph name="TARGET_DEVICE_NAME" /> به اینترنت متصل باشد.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{۱ ثانیه}one{# ثانیه}other{# ثانیه}}</translation> <translation id="9059834730836941392">کوچک کردن اعلان</translation> <translation id="9170848237812810038">&واگرد</translation> <translation id="932327136139879170">منزل</translation> <translation id="944069440740578670">اعلانهای خواندهنشده</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{یک ثانیه قبل}one{# ثانیه قبل}other{# ثانیه قبل}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_fi.xtb b/ui/strings/translations/ui_strings_fi.xtb index 4d30840..9645396 100644 --- a/ui/strings/translations/ui_strings_fi.xtb +++ b/ui/strings/translations/ui_strings_fi.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 päivä sitten}other{# päivää sitten}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuutti sitten}other{# minuuttia sitten}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}other{# min}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 päivä sitten}other{# päivää sitten}}</translation> <translation id="1181037720776840403">Poista</translation> <translation id="1243314992276662751">Lähetä</translation> <translation id="1266864766717917324">Jakaminen epäonnistui: <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Vasemmalta oikealle</translation> <translation id="1383876407941801731">Haku</translation> <translation id="1398853756734560583">Suurenna</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 minuutti sitten}other{# minuuttia sitten}}</translation> <translation id="1450753235335490080">Jakaminen ei onnistu: <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 kuukausi sitten}other{# kuukautta sitten}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuutti ja }other{# minuuttia ja }}</translation> <translation id="1643823602425662293">Ilmoitus</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Kuva</translation> <translation id="4565377596337484307">Piilota salasana</translation> <translation id="4588090240171750605">Vieritä oikealle</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 vuosi sitten}other{# vuotta sitten}}</translation> <translation id="4724120544754982507">Ilmoituskeskus, <ph name="UNREAD_NOTIFICATION_COUNT" /> lukematonta ilmoitusta</translation> <translation id="4729257764711776855">numero</translation> <translation id="4746179598275229723">Laajennus irrotettu</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Lähetetään...</translation> <translation id="8876215549894133151">Muoto:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kt</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 tunti sitten}other{# tuntia sitten}}</translation> <translation id="8996630695507351249">Varmista, että <ph name="TARGET_DEVICE_NAME" /> on yhteydessä internetiin.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}other{# s}}</translation> <translation id="9059834730836941392">Tiivistä ilmoitus</translation> <translation id="9170848237812810038">K&umoa</translation> <translation id="932327136139879170">Etusivu</translation> <translation id="944069440740578670">Lukemattomia ilmoituksia</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 sekunti sitten}other{# sekuntia sitten}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_fil.xtb b/ui/strings/translations/ui_strings_fil.xtb index 39a14c7..313bbd6 100644 --- a/ui/strings/translations/ui_strings_fil.xtb +++ b/ui/strings/translations/ui_strings_fil.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 araw ang nakalipas}one{# araw ang nakalipas}other{# na araw ang nakalipas}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuto ang nakalipas}one{# minuto ang nakalipas}other{# na minuto ang nakalipas}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 minuto}one{# minuto}other{# na minuto}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 Araw ang Nakalipas}one{# Araw ang Nakalipas}other{# na Araw ang Nakalipas}}</translation> <translation id="1181037720776840403">Alisin</translation> <translation id="1243314992276662751">I-upload</translation> <translation id="1266864766717917324">Hindi maibahagi ang <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Kaliwa papuntang Kanan</translation> <translation id="1383876407941801731">Hanapin</translation> <translation id="1398853756734560583">I-maximize</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 Minuto ang Nakalipas}one{# Minuto ang Nakalipas}other{# na Minuto ang Nakalipas}}</translation> <translation id="1450753235335490080">Hindi maibahagi ang <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 Buwan ang Nakalipas}one{# Buwan ang Nakalipas}other{# na Buwan ang Nakalipas}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto at }one{# minuto at }other{# na minuto at }}</translation> <translation id="1643823602425662293">Notification</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Larawan</translation> <translation id="4565377596337484307">Itago ang password</translation> <translation id="4588090240171750605">Mag-scroll Pakanan</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 Taon ang Nakalipas}one{# Taon ang Nakalipas}other{# na Taon ang Nakalipas}}</translation> <translation id="4724120544754982507">Notification Center, <ph name="UNREAD_NOTIFICATION_COUNT" /> (na) hindi pa nababasang notification</translation> <translation id="4729257764711776855">numero</translation> <translation id="4746179598275229723">Na-unpin ang extension</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Ipinapadala...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 Oras ang Nakalipas}one{# Oras ang Nakalipas}other{# na Oras ang Nakalipas}}</translation> <translation id="8996630695507351249">Tiyaking nakakonekta ang <ph name="TARGET_DEVICE_NAME" /> sa internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 segundo}one{# segundo}other{# na segundo}}</translation> <translation id="9059834730836941392">I-collapse ang notification</translation> <translation id="9170848237812810038">&I-undo</translation> <translation id="932327136139879170">Home</translation> <translation id="944069440740578670">Mga Hindi Pa Nababasang Notification</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 Segundo ang Nakalipas}one{# Segundo ang Nakalipas}other{# Segundo ang Nakalipas}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_gl.xtb b/ui/strings/translations/ui_strings_gl.xtb index 54ef825..dd48662 100644 --- a/ui/strings/translations/ui_strings_gl.xtb +++ b/ui/strings/translations/ui_strings_gl.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{Hai un día}other{Hai # días}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Hai un minuto}other{Hai # minutos}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{Hai 1 día}other{Hai # días}}</translation> <translation id="1181037720776840403">Eliminar</translation> <translation id="1243314992276662751">Cargar</translation> <translation id="1266864766717917324">Non se puido compartir este contido: <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">De esquerda a dereita</translation> <translation id="1383876407941801731">Buscar</translation> <translation id="1398853756734560583">Maximizar</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{Hai 1 minuto}other{Hai # minutos}}</translation> <translation id="1450753235335490080">Non se puido compartir este contido: <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{Hai 1 mes}other{Hai # meses}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{Un minuto e }other{# minutos e }}</translation> <translation id="1643823602425662293">Notificación</translation> <translation id="169515659049020177">Maiús</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Imaxe</translation> <translation id="4565377596337484307">Ocultar contrasinal</translation> <translation id="4588090240171750605">Desprazar cara á dereita</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{Hai 1 ano}other{Hai # anos}}</translation> <translation id="4724120544754982507">Centro de notificacións: <ph name="UNREAD_NOTIFICATION_COUNT" /> notificacións sen ler</translation> <translation id="4729257764711776855">número</translation> <translation id="4746179598275229723">Deixouse de fixar a extensión</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Enviando…</translation> <translation id="8876215549894133151">Formato:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{Hai 1 hora}other{Hai # horas}}</translation> <translation id="8996630695507351249">Asegúrate de que o dispositivo <ph name="TARGET_DEVICE_NAME" /> estea conectado a Internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{Un segundo}other{# segundos}}</translation> <translation id="9059834730836941392">Contraer notificación</translation> <translation id="9170848237812810038">&Desfacer</translation> <translation id="932327136139879170">Inicio</translation> <translation id="944069440740578670">Notificacións sen ler</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{Hai 1 segundo}other{Hai # segundos}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_hi.xtb b/ui/strings/translations/ui_strings_hi.xtb index ed9aa54..f61c14cc 100644 --- a/ui/strings/translations/ui_strings_hi.xtb +++ b/ui/strings/translations/ui_strings_hi.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 दिन पहले}one{# दिन पहले}other{# दिन पहले}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 मिनट पहले}one{# मिनट पहले}other{# मिनट पहले}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 मिनट}one{# मिनट}other{# मिनट}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{एक दिन पहले}one{# दिन पहले}other{# दिन पहले}}</translation> <translation id="1181037720776840403">हटाएं</translation> <translation id="1243314992276662751">अपलोड करें</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> शेयर नहीं किया जा सका</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">बाएं से दाएं</translation> <translation id="1383876407941801731">Search</translation> <translation id="1398853756734560583">बड़ा करें</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{एक मिनट पहले}one{# मिनट पहले}other{# मिनट पहले}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> शेयर नहीं किया जा सकता</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{एक महीना पहले}one{# महीना पहले}other{# महीने पहले}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 मिनट और }one{# मिनट और }other{# मिनट और }}</translation> <translation id="1643823602425662293">सूचना</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">इमेज</translation> <translation id="4565377596337484307">पासवर्ड छिपाएं</translation> <translation id="4588090240171750605">दाएं स्क्रोल करें</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 साल पहले}one{# साल पहले}other{# साल पहले}}</translation> <translation id="4724120544754982507">सूचना केंद्र, <ph name="UNREAD_NOTIFICATION_COUNT" /> नहीं पढ़ी गई सूचनाएं</translation> <translation id="4729257764711776855">नंबर</translation> <translation id="4746179598275229723">एक्सटेंशन अनपिन किया गया</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">भेजा जा रहा है...</translation> <translation id="8876215549894133151">प्रारूप:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> केबी</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{एक घंटा पहले}one{# घंटा पहले}other{# घंटे पहले}}</translation> <translation id="8996630695507351249">पक्का करें कि <ph name="TARGET_DEVICE_NAME" /> इंटरनेट से कनेक्ट है.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 सेकंड}one{# सेकंड}other{# सेकंड}}</translation> <translation id="9059834730836941392">सूचना को छोटा करें</translation> <translation id="9170848237812810038">&पूर्ववत् करें</translation> <translation id="932327136139879170">होम बटन</translation> <translation id="944069440740578670">न पढ़ी गई सूचनाएं</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{एक सेकंड पहले}one{# सेकंड पहले}other{# सेकंड पहले}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_hu.xtb b/ui/strings/translations/ui_strings_hu.xtb index 1469893..200c4b4 100644 --- a/ui/strings/translations/ui_strings_hu.xtb +++ b/ui/strings/translations/ui_strings_hu.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 napja}other{# napja}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 perce}other{# perce}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 p}other{# p}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 napja}other{# napja}}</translation> <translation id="1181037720776840403">Eltávolítás</translation> <translation id="1243314992276662751">Feltöltés</translation> <translation id="1266864766717917324">Nem sikerült a(z) <ph name="CONTENT_TYPE" /> megosztása</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Balról jobbra</translation> <translation id="1383876407941801731">Keresés</translation> <translation id="1398853756734560583">Teljes méret</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 perce}other{# perce}}</translation> <translation id="1450753235335490080">Nem sikerült a(z) <ph name="CONTENT_TYPE" /> megosztása</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 hónapja}other{# hónapja}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 perc és }other{# perc és }}</translation> <translation id="1643823602425662293">Értesítés</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Kép</translation> <translation id="4565377596337484307">Jelszó elrejtése</translation> <translation id="4588090240171750605">Görgetés jobbra</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 éve}other{# éve}}</translation> <translation id="4724120544754982507">Értesítési központ, <ph name="UNREAD_NOTIFICATION_COUNT" /> olvasatlan értesítés</translation> <translation id="4729257764711776855">szám</translation> <translation id="4746179598275229723">Bővítmény kitűzése feloldva</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Küldés...</translation> <translation id="8876215549894133151">Formátum:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 órája}other{# órája}}</translation> <translation id="8996630695507351249">Győződjön meg arról, hogy a(z) <ph name="TARGET_DEVICE_NAME" /> csatlakozik az internethez.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 mp}other{# mp}}</translation> <translation id="9059834730836941392">Értesítés összecsukása</translation> <translation id="9170848237812810038">&Visszavonás</translation> <translation id="932327136139879170">Főoldal</translation> <translation id="944069440740578670">Olvasatlan értesítések</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 másodperce}other{# másodperce}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_hy.xtb b/ui/strings/translations/ui_strings_hy.xtb index 1f2d172..d3167f4 100644 --- a/ui/strings/translations/ui_strings_hy.xtb +++ b/ui/strings/translations/ui_strings_hy.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 օր առաջ}one{# օր առաջ}other{# օր առաջ}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 րոպե առաջ}one{# րոպե առաջ}other{# րոպե առաջ}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 ր}one{# ր}other{# ր}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 օր առաջ}one{# օր առաջ}other{# օր առաջ}}</translation> <translation id="1181037720776840403">Ջնջել</translation> <translation id="1243314992276662751">Վերբեռնել</translation> <translation id="1266864766717917324">Չհաջողվեց ուղարկել բովանդակությունը (<ph name="CONTENT_TYPE" />)</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Ձախից աջ</translation> <translation id="1383876407941801731">Որոնում</translation> <translation id="1398853756734560583">Առավելացնել</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 րոպե առաջ}one{# րոպե առաջ}other{# րոպե առաջ}}</translation> <translation id="1450753235335490080">Չհաջողվեց ուղարկել բովանդակությունը (<ph name="CONTENT_TYPE" />)</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ամիս առաջ}one{# ամիս առաջ}other{# ամիս առաջ}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 րոպե }one{# րոպե }other{# րոպե }}</translation> <translation id="1643823602425662293">Ծանուցում</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Պատկեր</translation> <translation id="4565377596337484307">Թաքցնել գաղտնաբառը</translation> <translation id="4588090240171750605">Ոլորել դեպի աջ</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 տարի առաջ}one{# տարի առաջ}other{# տարի առաջ}}</translation> <translation id="4724120544754982507">Ծանուցումների կենտրոն, <ph name="UNREAD_NOTIFICATION_COUNT" /> չկարդացված ծանուցում</translation> <translation id="4729257764711776855">հեռախոսահամար</translation> <translation id="4746179598275229723">Ընդլայնումն ապամրացվել է</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Ուղարկում...</translation> <translation id="8876215549894133151">Ձևաչափ՝</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> ԿԲ</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 ժամ առաջ}one{# ժամ առաջ}other{# ժամ առաջ}}</translation> <translation id="8996630695507351249">Համոզվեք, որ <ph name="TARGET_DEVICE_NAME" /> սարքը միացված է ինտերնետին։</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 վրկ}one{# վրկ}other{# վրկ}}</translation> <translation id="9059834730836941392">Կոծկել</translation> <translation id="9170848237812810038">&Հետարկել</translation> <translation id="932327136139879170">Գլխավոր էջ</translation> <translation id="944069440740578670">Չկարդացված ծանուցումներ</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 վայրկյան առաջ}one{# վայրկյան առաջ}other{# վայրկյան առաջ}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_id.xtb b/ui/strings/translations/ui_strings_id.xtb index 9851beb..84466c0 100644 --- a/ui/strings/translations/ui_strings_id.xtb +++ b/ui/strings/translations/ui_strings_id.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 hari yang lalu}other{# hari yang lalu}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 menit yang lalu}other{# menit yang lalu}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 Hari Lalu}other{# Hari Lalu}}</translation> <translation id="1181037720776840403">Hapus</translation> <translation id="1243314992276662751">Upload</translation> <translation id="1266864766717917324">Tidak dapat membagikan <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Kiri ke Kanan</translation> <translation id="1383876407941801731">Telusuri</translation> <translation id="1398853756734560583">Perbesar</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 Menit Lalu}other{# Menit Lalu}}</translation> <translation id="1450753235335490080">Tidak dapat membagikan <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 Bulan Lalu}other{# Bulan Lalu}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 menit dan }other{# menit dan }}</translation> <translation id="1643823602425662293">Notifikasi</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Gambar</translation> <translation id="4565377596337484307">Sembunyikan sandi</translation> <translation id="4588090240171750605">Gulir ke Kanan</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 Tahun Lalu}other{# Tahun Lalu}}</translation> <translation id="4724120544754982507">Pusat Notifikasi, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifikasi belum dibaca</translation> <translation id="4729257764711776855">nomor</translation> <translation id="4746179598275229723">Ekstensi dilepaskan</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Mengirim...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 Jam Lalu}other{# Jam Lalu}}</translation> <translation id="8996630695507351249">Pastikan <ph name="TARGET_DEVICE_NAME" /> terhubung ke internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 dtk}other{# dtk}}</translation> <translation id="9059834730836941392">Ciutkan notifikasi</translation> <translation id="9170848237812810038">&Urung</translation> <translation id="932327136139879170">Beranda</translation> <translation id="944069440740578670">Notifikasi yang Belum Dibaca</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 Detik Lalu}other{# Detik Lalu}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_it.xtb b/ui/strings/translations/ui_strings_it.xtb index ad7964f4d..3e328cce 100644 --- a/ui/strings/translations/ui_strings_it.xtb +++ b/ui/strings/translations/ui_strings_it.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 giorno fa}other{# giorni fa}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuto fa}other{# minuti fa}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 giorno fa}other{# giorni fa}}</translation> <translation id="1181037720776840403">Rimuovi</translation> <translation id="1243314992276662751">Carica</translation> <translation id="1266864766717917324">Impossibile condividere <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Da sinistra a destra</translation> <translation id="1383876407941801731">Cerca</translation> <translation id="1398853756734560583">Ingrandisci</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 minuto fa}other{# minuti fa}}</translation> <translation id="1450753235335490080">Impossibile condividere <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 mese fa}other{# mesi fa}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuto e }other{# minuti e }}</translation> <translation id="1643823602425662293">Notifica</translation> <translation id="169515659049020177">Maiusc</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Immagine</translation> <translation id="4565377596337484307">Nascondi password</translation> <translation id="4588090240171750605">Scorri a destra</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 anno fa}other{# anni fa}}</translation> <translation id="4724120544754982507">Centro notifiche, <ph name="UNREAD_NOTIFICATION_COUNT" /> notifiche da leggere</translation> <translation id="4729257764711776855">numero</translation> <translation id="4746179598275229723">Estensione sbloccata</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Invio in corso...</translation> <translation id="8876215549894133151">Formato:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 ora fa}other{# ore fa}}</translation> <translation id="8996630695507351249">Assicurati che il dispositivo <ph name="TARGET_DEVICE_NAME" /> sia connesso a Internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 sec}other{# sec}}</translation> <translation id="9059834730836941392">Comprimi la notifica</translation> <translation id="9170848237812810038">&Annulla</translation> <translation id="932327136139879170">Home page</translation> <translation id="944069440740578670">Notifiche da leggere</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 secondo fa}other{# secondi fa}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_iw.xtb b/ui/strings/translations/ui_strings_iw.xtb index e6547dc..cbf47a47 100644 --- a/ui/strings/translations/ui_strings_iw.xtb +++ b/ui/strings/translations/ui_strings_iw.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{לפני יום אחד}one{לפני # ימים}two{לפני יומיים}other{לפני # ימים}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{לפני דקה אחת}one{לפני # דקות}two{לפני # דקות}other{לפני # דקות}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{דקה}one{# דק}two{# דק}other{# דק}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{לפני יום אחד}one{לפני # ימים}two{לפני יומיים}other{לפני # ימים}}</translation> <translation id="1181037720776840403">הסרה</translation> <translation id="1243314992276662751">העלאה</translation> <translation id="1266864766717917324">לא ניתן היה לשתף את ה<ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">משמאל לימין</translation> <translation id="1383876407941801731">חיפוש</translation> <translation id="1398853756734560583">הגדלת החלון</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{לפני דקה}one{לפני # דקות}two{לפני # דקות}other{לפני # דקות}}</translation> <translation id="1450753235335490080">לא ניתן לשתף את ה<ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{לפני חודש}one{לפני # חודשים}two{לפני חודשיים}other{לפני # חודשים}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{דקה אחת ו }one{# דקות ו }two{# דקות ו }other{# דקות ו }}</translation> <translation id="1643823602425662293">הודעה</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">תמונה</translation> <translation id="4565377596337484307">הסתרת סיסמה</translation> <translation id="4588090240171750605">גלילה ימינה</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{לפני שנה}one{לפני # שנים}two{לפני שנתיים}other{לפני # שנים}}</translation> <translation id="4724120544754982507">מרכז הודעות, <ph name="UNREAD_NOTIFICATION_COUNT" /> הודעות שלא נקראו</translation> <translation id="4729257764711776855">מספר</translation> <translation id="4746179598275229723">בוטלה ההצמדה של התוסף</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">ההודעה נשלחת...</translation> <translation id="8876215549894133151">פורמט:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" />KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{לפני שעה}one{לפני # שעות}two{לפני שעתיים}other{לפני # שעות}}</translation> <translation id="8996630695507351249">יש לוודא ש-<ph name="TARGET_DEVICE_NAME" /> מחובר לאינטרנט.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{שנ‘ אחת}one{# שנ‘}two{# שנ‘}other{# שנ‘}}</translation> <translation id="9059834730836941392">כיווץ ההודעה</translation> <translation id="9170848237812810038">&ביטול</translation> <translation id="932327136139879170">בית</translation> <translation id="944069440740578670">התראות שלא נקראו</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{לפני שנייה אחת}one{לפני # שניות}two{לפני # שניות}other{לפני # שניות}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ja.xtb b/ui/strings/translations/ui_strings_ja.xtb index b90f9bf..f64ad29 100644 --- a/ui/strings/translations/ui_strings_ja.xtb +++ b/ui/strings/translations/ui_strings_ja.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 日前}other{# 日前}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 分前}other{# 分前}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1分}other{#分}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 日前}other{# 日前}}</translation> <translation id="1181037720776840403">削除</translation> <translation id="1243314992276662751">アップロード</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> を共有できませんでした</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">左から右</translation> <translation id="1383876407941801731">検索</translation> <translation id="1398853756734560583">最大化</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 分前}other{# 分前}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> を共有できません</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 か月前}other{# か月前}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 分 }other{# 分 }}</translation> <translation id="1643823602425662293">通知</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">画像</translation> <translation id="4565377596337484307">パスワードを表示しない</translation> <translation id="4588090240171750605">右にスクロール</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 年前}other{# 年前}}</translation> <translation id="4724120544754982507">通知センター: <ph name="UNREAD_NOTIFICATION_COUNT" /> 件の未読通知</translation> <translation id="4729257764711776855">数値</translation> <translation id="4746179598275229723">拡張機能の固定を解除しました</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">送信しています...</translation> <translation id="8876215549894133151">形式:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 時間前}other{# 時間前}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> がインターネットに接続されているかご確認ください。</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 秒}other{# 秒}}</translation> <translation id="9059834730836941392">通知を折りたたむ</translation> <translation id="9170848237812810038">取消(&U)</translation> <translation id="932327136139879170">ホーム</translation> <translation id="944069440740578670">未読のお知らせ</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 秒前}other{# 秒前}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_kn.xtb b/ui/strings/translations/ui_strings_kn.xtb index bfc9e9fc..896637f 100644 --- a/ui/strings/translations/ui_strings_kn.xtb +++ b/ui/strings/translations/ui_strings_kn.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 ದಿನದ ಹಿಂದೆ}one{# ದಿನಗಳ ಹಿಂದೆ}other{# ದಿನಗಳ ಹಿಂದೆ}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 ನಿಮಿಷದ ಹಿಂದೆ}one{# ನಿಮಿಷಗಳ ಹಿಂದೆ}other{# ನಿಮಿಷಗಳ ಹಿಂದೆ}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1ಮೀ}one{#ಮೀ}other{#ಮೀ}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 ದಿನದ ಹಿಂದೆ}one{# ದಿನಗಳ ಹಿಂದೆ}other{# ದಿನಗಳ ಹಿಂದೆ}}</translation> <translation id="1181037720776840403">ತೆಗೆದುಹಾಕು</translation> <translation id="1243314992276662751">ಅಪ್ಲೋಡ್</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">ಎಡದಿಂದ ಬಲಕ್ಕೆ</translation> <translation id="1383876407941801731">ಹುಡುಕಿ</translation> <translation id="1398853756734560583">ಗರಿಷ್ಠಗೊಳಿಸು</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 ನಿಮಿಷದ ಹಿಂದೆ}one{# ನಿಮಿಷಗಳ ಹಿಂದೆ}other{# ನಿಮಿಷಗಳ ಹಿಂದೆ}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />ವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ತಿಂಗಳ ಹಿಂದೆ}one{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}other{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 ನಿಮಿಷ ಮತ್ತು }one{# ನಿಮಿಷಗಳು ಮತ್ತು }other{# ನಿಮಿಷಗಳು ಮತ್ತು }}</translation> <translation id="1643823602425662293">ಅಧಿಸೂಚನೆ</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">ಚಿತ್ರ</translation> <translation id="4565377596337484307">ಪಾಸ್ವರ್ಡ್ ಮರೆಮಾಡಿ</translation> <translation id="4588090240171750605">ಬಲಕ್ಕೆ ಸ್ಕ್ರೋಲ್ ಮಾಡಿ</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 ವರ್ಷದ ಹಿಂದೆ}one{# ವರ್ಷಗಳ ಹಿಂದೆ}other{# ವರ್ಷಗಳ ಹಿಂದೆ}}</translation> <translation id="4724120544754982507">ಅಧಿಸೂಚನೆ ಕೇಂದ್ರ, <ph name="UNREAD_NOTIFICATION_COUNT" /> ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು</translation> <translation id="4729257764711776855">ಸಂಖ್ಯೆ</translation> <translation id="4746179598275229723">ವಿಸ್ತರಣೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">ಕಳುಹಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="8876215549894133151">ಸ್ವರೂಪ:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 ಗಂಟೆಯ ಹಿಂದೆ}one{# ಗಂಟೆಗಳ ಹಿಂದೆ}other{# ಗಂಟೆಗಳ ಹಿಂದೆ}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> ಸಾಧನವು ಇಂಟರ್ನೆಟ್ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್}one{# ಸೆಕೆಂಡುಗಳು}other{# ಸೆಕೆಂಡುಗಳು}}</translation> <translation id="9059834730836941392">ಕುಗ್ಗಿಸುವ ಅಧಿಸೂಚನೆ</translation> <translation id="9170848237812810038">&ರದ್ದುಮಾಡು</translation> <translation id="932327136139879170">ಹೋಮ್</translation> <translation id="944069440740578670">ಓದದಿರುವ ಅಧಿಸೂಚನೆಗಳು</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 ಸೆಕೆಂಡ್ ಹಿಂದೆ}one{# ಸೆಕೆಂಡ್ಗಳ ಹಿಂದೆ}other{# ಸೆಕೆಂಡ್ಗಳ ಹಿಂದೆ}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ko.xtb b/ui/strings/translations/ui_strings_ko.xtb index 87134ae..e3fff4f 100644 --- a/ui/strings/translations/ui_strings_ko.xtb +++ b/ui/strings/translations/ui_strings_ko.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1일 전}other{#일 전}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1분 전}other{#분 전}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1분}other{#분}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1일 전}other{#일 전}}</translation> <translation id="1181037720776840403">삭제</translation> <translation id="1243314992276662751">업로드</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> 공유할 수 없음</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">왼쪽에서 오른쪽으로</translation> <translation id="1383876407941801731">검색</translation> <translation id="1398853756734560583">최대화</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1분 전}other{#분 전}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> 공유할 수 없음</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1개월 전}other{#개월 전}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1분 }other{#분 }}</translation> <translation id="1643823602425662293">알림</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">이미지</translation> <translation id="4565377596337484307">비밀번호 숨김</translation> <translation id="4588090240171750605">오른쪽 스크롤</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1년 전}other{#년 전}}</translation> <translation id="4724120544754982507">알림 센터, 읽지 않은 알림 <ph name="UNREAD_NOTIFICATION_COUNT" />개</translation> <translation id="4729257764711776855">전화번호</translation> <translation id="4746179598275229723">확장 프로그램 고정 해제됨</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">보내는 중...</translation> <translation id="8876215549894133151">형식:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" />KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1시간 전}other{#시간 전}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" />이(가) 인터넷에 연결되어 있는지 확인하세요.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1초}other{#초}}</translation> <translation id="9059834730836941392">알림 접기</translation> <translation id="9170848237812810038">실행 취소(&U)</translation> <translation id="932327136139879170">홈</translation> <translation id="944069440740578670">읽지 않은 알림</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1초 전}other{#초 전}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ky.xtb b/ui/strings/translations/ui_strings_ky.xtb index e8df7123..d418bd9 100644 --- a/ui/strings/translations/ui_strings_ky.xtb +++ b/ui/strings/translations/ui_strings_ky.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 күн мурун}other{# күн мурун}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 мүнөт мурун}other{# мүнөт мурун}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1мүн}other{#мүн}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 күн мурун}other{# күн мурун}}</translation> <translation id="1181037720776840403">Алып салуу</translation> <translation id="1243314992276662751">Жүктөп берүү</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> менен бөлүшүлгөн жок</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Солдон оңго</translation> <translation id="1383876407941801731">Издөө</translation> <translation id="1398853756734560583">Чоңойтуу</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 мүнөт мурун}other{# мүнөт мурун}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> менен бөлүшүү мүмкүн эмес</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ай мурун}other{# ай мурун}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 мүнөт жана }other{# мүнөт жана }}</translation> <translation id="1643823602425662293">Эскертме</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Сүрөт</translation> <translation id="4565377596337484307">Сырсөздү жашыруу</translation> <translation id="4588090240171750605">Оңго сыдырып кароо</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 жыл мурун}other{# жыл мурун}}</translation> <translation id="4724120544754982507">Билдирмелер борбору, <ph name="UNREAD_NOTIFICATION_COUNT" /> окулбаган эскертме бар</translation> <translation id="4729257764711776855">номер</translation> <translation id="4746179598275229723">Кеңейтүү бошотулду</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Жөнөтүлүүдө…</translation> <translation id="8876215549894133151">Формат:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> Кб</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 саат мурун}other{# саат мурун}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> интернетке туташканын текшериңиз.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 сек.}other{# сек.}}</translation> <translation id="9059834730836941392">Эскертмени жыйыштыруу</translation> <translation id="9170848237812810038">&Кайтаруу</translation> <translation id="932327136139879170">Башкы</translation> <translation id="944069440740578670">Окулбаган билдирмелер</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 секунд мурун}other{# секунд мурун}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_lt.xtb b/ui/strings/translations/ui_strings_lt.xtb index 74650d2..ddf0a5e 100644 --- a/ui/strings/translations/ui_strings_lt.xtb +++ b/ui/strings/translations/ui_strings_lt.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{Prieš 1 dieną}one{Prieš # dieną}few{Prieš # dienas}many{Prieš # dienos}other{Prieš # dienų}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Prieš 1 minutę}one{Prieš # minutę}few{Prieš # minutes}many{Prieš # minutės}other{Prieš # minučių}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min.}one{# min.}few{# min.}many{# min.}other{# min.}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{prieš 1 dieną}one{prieš # dieną}few{prieš # dienas}many{prieš # dienos}other{prieš # dienų}}</translation> <translation id="1181037720776840403">Pašalinti</translation> <translation id="1243314992276662751">Įkelti</translation> <translation id="1266864766717917324">Nepavyko bendrinti turinio: <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Iš kairės į dešinę</translation> <translation id="1383876407941801731">Ieškoti</translation> <translation id="1398853756734560583">Išskleisti</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{prieš 1 minutę}one{prieš # minutę}few{prieš # minutes}many{prieš # minutės}other{prieš # minučių}}</translation> <translation id="1450753235335490080">Nepavyko bendrinti turinio: <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{prieš 1 mėnesį}one{prieš # mėnesį}few{prieš # mėnesius}many{prieš # mėnesio}other{prieš # mėnesių}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minutė ir }one{# minutė ir }few{# minutės ir }many{# minutės ir }other{# minučių ir }}</translation> <translation id="1643823602425662293">Pranešimas</translation> <translation id="169515659049020177">Antrojo lygio klavišas</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Vaizdas</translation> <translation id="4565377596337484307">Slėpti slaptažodį</translation> <translation id="4588090240171750605">Slinkti į dešinę</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{prieš 1 metus}one{prieš # metus}few{prieš # metus}many{prieš # metų}other{prieš # metų}}</translation> <translation id="4724120544754982507">Pranešimų centras, neskaitytų pranešimų: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation> <translation id="4729257764711776855">numeris</translation> <translation id="4746179598275229723">Plėtinys atsegtas</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Siunčiama...</translation> <translation id="8876215549894133151">Formatas:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{prieš 1 valandą}one{prieš # valandą}few{prieš # valandas}many{prieš # valandos}other{prieš # valandų}}</translation> <translation id="8996630695507351249">Įsitikinkite, kad „<ph name="TARGET_DEVICE_NAME" />“ prijungtas prie interneto.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 sek.}one{# sek.}few{# sek.}many{# sek.}other{# sek.}}</translation> <translation id="9059834730836941392">Sutraukti pranešimą</translation> <translation id="9170848237812810038">&Atšaukti</translation> <translation id="932327136139879170">Kontaktinė namų informacija</translation> <translation id="944069440740578670">Neskaityti pranešimai</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{prieš 1 sekundę}one{prieš # sekundę}few{prieš # sekundes}many{prieš # sekundės}other{prieš # sekundžių}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ms.xtb b/ui/strings/translations/ui_strings_ms.xtb index a214154..a2586db 100644 --- a/ui/strings/translations/ui_strings_ms.xtb +++ b/ui/strings/translations/ui_strings_ms.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 hari yang lalu}other{# hari yang lalu}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{Seminit yang lalu}other{# minit yang lalu}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1m}other{#m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 Hari yang Lalu}other{# Hari yang Lalu}}</translation> <translation id="1181037720776840403">Alih keluar</translation> <translation id="1243314992276662751">Muat naik</translation> <translation id="1266864766717917324">Tidak dapat berkongsi <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Kiri ke Kanan</translation> <translation id="1383876407941801731">Carian</translation> <translation id="1398853756734560583">Maksimumkan</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 Minit yang Lalu}other{# Minit yang Lalu}}</translation> <translation id="1450753235335490080">Tidak dapat berkongsi <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 Bulan yang Lalu}other{# Bulan yang Lalu}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minit dan }other{# minit dan }}</translation> <translation id="1643823602425662293">Pemberitahuan</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Imej</translation> <translation id="4565377596337484307">Sembunyikan kata laluan</translation> <translation id="4588090240171750605">Tatal ke Kanan</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 Tahun yang Lalu}other{# Tahun yang Lalu}}</translation> <translation id="4724120544754982507">Pusat Pemberitahuan, <ph name="UNREAD_NOTIFICATION_COUNT" /> pemberitahuan belum dibaca</translation> <translation id="4729257764711776855">nombor</translation> <translation id="4746179598275229723">Sambungan dinyahsemat</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Menghantar...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 Jam yang Lalu}other{# Jam yang Lalu}}</translation> <translation id="8996630695507351249">Pastikan <ph name="TARGET_DEVICE_NAME" /> disambungkan ke Internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 saat}other{# saat}}</translation> <translation id="9059834730836941392">Runtuhkan pemberitahuan</translation> <translation id="9170848237812810038">&Buat asal</translation> <translation id="932327136139879170">Laman Utama</translation> <translation id="944069440740578670">Pemberitahuan Belum Dibaca</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 Saat yang Lalu}other{# Saat yang Lalu}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_nl.xtb b/ui/strings/translations/ui_strings_nl.xtb index 1c411b1..b6b1c71c 100644 --- a/ui/strings/translations/ui_strings_nl.xtb +++ b/ui/strings/translations/ui_strings_nl.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 dag geleden}other{# dagen geleden}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 minuut geleden}other{# minuten geleden}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 m}other{# m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 dag geleden}other{# dagen geleden}}</translation> <translation id="1181037720776840403">Verwijderen</translation> <translation id="1243314992276662751">Uploaden</translation> <translation id="1266864766717917324">Kan <ph name="CONTENT_TYPE" /> niet delen</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Links naar rechts</translation> <translation id="1383876407941801731">Zoeken</translation> <translation id="1398853756734560583">Maximaliseren</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 minuut geleden}other{# minuten geleden}}</translation> <translation id="1450753235335490080">Kan <ph name="CONTENT_TYPE" /> niet delen</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 maand geleden}other{# maanden geleden}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuut en }other{# minuten en }}</translation> <translation id="1643823602425662293">Melding</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Afbeelding</translation> <translation id="4565377596337484307">Wachtwoord verbergen</translation> <translation id="4588090240171750605">Naar rechts bladeren</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 jaar geleden}other{# jaar geleden}}</translation> <translation id="4724120544754982507">Meldingscentrum, <ph name="UNREAD_NOTIFICATION_COUNT" /> ongelezen meldingen</translation> <translation id="4729257764711776855">nummer</translation> <translation id="4746179598275229723">Extensie losgemaakt</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Verzenden...</translation> <translation id="8876215549894133151">Indeling:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 uur geleden}other{# uur geleden}}</translation> <translation id="8996630695507351249">Zorg dat <ph name="TARGET_DEVICE_NAME" /> is verbonden met internet.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 sec.}other{# sec.}}</translation> <translation id="9059834730836941392">Melding samenvouwen</translation> <translation id="9170848237812810038">&Ongedaan maken</translation> <translation id="932327136139879170">Homepage</translation> <translation id="944069440740578670">Ongelezen meldingen</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 seconde geleden}other{# seconden geleden}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_pa.xtb b/ui/strings/translations/ui_strings_pa.xtb index e067b51..9e0fa910 100644 --- a/ui/strings/translations/ui_strings_pa.xtb +++ b/ui/strings/translations/ui_strings_pa.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 ਦਿਨ ਪਹਿਲਾਂ}one{# ਦਿਨ ਪਹਿਲਾਂ}other{# ਦਿਨ ਪਹਿਲਾਂ}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 ਮਿੰਟ ਪਹਿਲਾਂ}one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 ਮਿੰਟ}one{# ਮਿੰਟ}other{# ਮਿੰਟ}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 ਦਿਨ ਪਹਿਲਾਂ}one{# ਦਿਨ ਪਹਿਲਾਂ}other{# ਦਿਨ ਪਹਿਲਾਂ}}</translation> <translation id="1181037720776840403">ਹਟਾਓ</translation> <translation id="1243314992276662751">ਅਪਲੋਡ ਕਰੋ</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> ਨਾਲ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">ਖੱਬੇ ਤੋਂ ਸੱਜੇ ਪਾਸੇ</translation> <translation id="1383876407941801731">ਖੋਜੋ</translation> <translation id="1398853756734560583">ਅਧਿਕਤਮ ਬਣਾਓ</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 ਮਿੰਟ ਪਹਿਲਾਂ}one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> ਨੂੰ ਸਾਂਝਾ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ਮਹੀਨਾ ਪਹਿਲਾਂ}one{# ਮਹੀਨਾ ਪਹਿਲਾਂ}other{# ਮਹੀਨੇ ਪਹਿਲਾਂ}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 ਮਿੰਟ ਅਤੇ }one{# ਮਿੰਟ ਅਤੇ }other{# ਮਿੰਟ ਅਤੇ }}</translation> <translation id="1643823602425662293">ਸੂਚਨਾ</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">ਚਿੱਤਰ</translation> <translation id="4565377596337484307">ਪਾਸਵਰਡ ਲੁਕਾਓ</translation> <translation id="4588090240171750605">ਸੱਜੇ ਪਾਸੇ ਸਕ੍ਰੌਲ ਕਰੋ</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 ਸਾਲ ਪਹਿਲਾਂ}one{# ਸਾਲ ਪਹਿਲਾਂ}other{# ਸਾਲ ਪਹਿਲਾਂ}}</translation> <translation id="4724120544754982507">ਸੂਚਨਾ ਕੇਂਦਰ, <ph name="UNREAD_NOTIFICATION_COUNT" /> ਨਾ-ਪੜ੍ਹੀਆਂ ਸੂਚਨਾਵਾਂ</translation> <translation id="4729257764711776855">ਨੰਬਰ</translation> <translation id="4746179598275229723">ਐਕਸਟੈਂਸ਼ਨ ਨੂੰ ਅਣਪਿੰਨ ਕੀਤਾ ਗਿਆ</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">ਭੇਜਿਆ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="8876215549894133151">ਫੌਰਮੈਟ:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 ਘੰਟਾ ਪਹਿਲਾਂ}one{# ਘੰਟਾ ਪਹਿਲਾਂ}other{# ਘੰਟੇ ਪਹਿਲਾਂ}}</translation> <translation id="8996630695507351249">ਪੱਕਾ ਕਰੋ ਕਿ <ph name="TARGET_DEVICE_NAME" /> ਇੰਟਰਨੈੱਟ ਨਾਲ ਕਨੈਕਟ ਹੋਵੇ।</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 ਸਕਿੰਟ}one{# ਸਕਿੰਟ}other{# ਸਕਿੰਟ}}</translation> <translation id="9059834730836941392">ਸੂਚਨਾ ਸਮੇਟੋ</translation> <translation id="9170848237812810038">&ਅਨਡੂ</translation> <translation id="932327136139879170">ਹੋਮ</translation> <translation id="944069440740578670">ਨਾ-ਪੜ੍ਹੀਆਂ ਸੂਚਨਾਵਾਂ</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 ਸਕਿੰਟ ਪਹਿਲਾਂ}one{# ਸਕਿੰਟ ਪਹਿਲਾਂ}other{# ਸਕਿੰਟ ਪਹਿਲਾਂ}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_pl.xtb b/ui/strings/translations/ui_strings_pl.xtb index 5423512..ed21867 100644 --- a/ui/strings/translations/ui_strings_pl.xtb +++ b/ui/strings/translations/ui_strings_pl.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{minutę temu}few{# minuty temu}many{# minut temu}other{# minuty temu}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}few{# min}many{# min}other{# min}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{Dzień temu}few{# dni temu}many{# dni temu}other{# dnia temu}}</translation> <translation id="1181037720776840403">Usuń</translation> <translation id="1243314992276662751">Prześlij</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> – nie udało się udostępnić</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Od lewej do prawej</translation> <translation id="1383876407941801731">Szukaj</translation> <translation id="1398853756734560583">Maksymalizuj</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{Minutę temu}few{# minuty temu}many{# minut temu}other{# minuty temu}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />: nie udało się udostępnić</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{Miesiąc temu}few{# miesiące temu}many{# miesięcy temu}other{# miesiąca temu}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minuta i }few{# minuty i }many{# minut i }other{# minuty i }}</translation> <translation id="1643823602425662293">Powiadomienie</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Obraz</translation> <translation id="4565377596337484307">Ukryj hasło</translation> <translation id="4588090240171750605">Przewiń w prawo</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{Rok temu}few{# lata temu}many{# lat temu}other{# roku temu}}</translation> <translation id="4724120544754982507">Centrum powiadomień, liczba nieprzeczytanych powiadomień: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation> <translation id="4729257764711776855">numer</translation> <translation id="4746179598275229723">Rozszerzenie zostało odpięte</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Wysyłam...</translation> <translation id="8876215549894133151">Format:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{Godzinę temu}few{# godziny temu}many{# godzin temu}other{# godziny temu}}</translation> <translation id="8996630695507351249">Upewnij się, że <ph name="TARGET_DEVICE_NAME" /> jest połączony z internetem.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}few{# s}many{# s}other{# s}}</translation> <translation id="9059834730836941392">Zwiń powiadomienie</translation> <translation id="9170848237812810038">&Cofnij</translation> <translation id="932327136139879170">Strona główna</translation> <translation id="944069440740578670">Nieprzeczytane powiadomienia</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{Sekundę temu}few{# sekundy temu}many{# sekund temu}other{# sekundy temu}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_sk.xtb b/ui/strings/translations/ui_strings_sk.xtb index 72f2f33b..59e7238 100644 --- a/ui/strings/translations/ui_strings_sk.xtb +++ b/ui/strings/translations/ui_strings_sk.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{Včera}few{Pred # dňami}many{Pred # dňom}other{Pred # dňami}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{pred minútou}few{pred # minútami}many{pred # minútami}other{pred # minútami}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 min}few{# min}many{# min}other{# min}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{Pred 1 dňom}few{Pred # dňami}many{Pred # dňa}other{Pred # dňami}}</translation> <translation id="1181037720776840403">Odstrániť</translation> <translation id="1243314992276662751">Nahrať</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> sa nepodarilo zdieľať</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Zľava doprava</translation> <translation id="1383876407941801731">Vyhľadávanie</translation> <translation id="1398853756734560583">Maximalizovať</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{Pred 1 minútou}few{pred # minútami}many{pred # minúty}other{pred # minútami}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> sa nedá zdieľať</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{Pred 1 mesiacom}few{Pred # mesiacmi}many{Pred # mesiaca}other{Pred # mesiacmi}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 minúta a }few{# minúty a }many{# minúty a }other{# minút a }}</translation> <translation id="1643823602425662293">Upozornenie</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Obrázok</translation> <translation id="4565377596337484307">Skryť heslo</translation> <translation id="4588090240171750605">Rolovať doprava</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{Pred 1 rokom}few{Pred # rokmi}many{Pred # roka}other{Pred # rokmi}}</translation> <translation id="4724120544754982507">Centrum upozornení – počet neprečítaných upozornení: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation> <translation id="4729257764711776855">číslo</translation> <translation id="4746179598275229723">Rozšírenie bolo odopnuté</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Odosiela sa...</translation> <translation id="8876215549894133151">Formát:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> kB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{Pred 1 hodinou}few{Pred # hodinami}many{Pred # hodiny}other{Pred # hodinami}}</translation> <translation id="8996630695507351249">Skontrolujte, či je zariadenie <ph name="TARGET_DEVICE_NAME" /> pripojené k internetu.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 s}few{# s}many{# s}other{# s}}</translation> <translation id="9059834730836941392">Zbaliť upozornenie</translation> <translation id="9170848237812810038">&Naspäť</translation> <translation id="932327136139879170">Domov</translation> <translation id="944069440740578670">Neprečítané upozornenia</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{Pred 1 sekundou}few{pred # sekundami}many{pred # sekundy}other{pred # sekundami}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ta.xtb b/ui/strings/translations/ui_strings_ta.xtb index 0f07be6..14870f28 100644 --- a/ui/strings/translations/ui_strings_ta.xtb +++ b/ui/strings/translations/ui_strings_ta.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 நாள் முன்பு}other{# நாட்கள் உள்ளன}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 நிமிடத்திற்கு முன்பு}other{# நிமிடங்களுக்கு முன்பு}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1நி}other{#நி}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 நாளுக்கு முன்பு}other{# நாட்களுக்கு முன்பு}}</translation> <translation id="1181037720776840403">அகற்று</translation> <translation id="1243314992276662751">பதிவேற்று</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" />ஐப் பகிர முடியவில்லை</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">இடமிருந்து வலம்</translation> <translation id="1383876407941801731">Search</translation> <translation id="1398853756734560583">பெரிதாக்கு</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 நிமிடத்திற்கு முன்பு}other{# நிமிடங்களுக்கு முன்பு}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" />ஐப் பகிர முடியவில்லை</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 மாதத்திற்கு முன்பு}other{# மாதங்களுக்கு முன்பு}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 நிமிடம், }other{# நிமிடங்கள், }}</translation> <translation id="1643823602425662293">அறிவிப்பு</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">படம்</translation> <translation id="4565377596337484307">கடவுச்சொல்லை மறைக்கும்</translation> <translation id="4588090240171750605">வலப்புறம் நகர்த்து</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 ஆண்டுக்கு முன்பு}other{# ஆண்டுகளுக்கு முன்பு}}</translation> <translation id="4724120544754982507">அறிவிப்பு மையம், <ph name="UNREAD_NOTIFICATION_COUNT" /> படிக்காத அறிவிப்புகள்</translation> <translation id="4729257764711776855">எண்</translation> <translation id="4746179598275229723">நீட்டிப்பு அகற்றப்பட்டது</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">அனுப்புகிறது...</translation> <translation id="8876215549894133151">வடிவம்:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> கி.பை.</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 மணிநேரத்திற்கு முன்}other{# மணிநேரத்திற்கு முன்}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> சாதனம் இணையத்துடன் இணைக்கப்பட்டுள்ளதை உறுதி செய்யவும்.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 நொடி}other{# நொடிகள்}}</translation> <translation id="9059834730836941392">அறிவிப்பைச் சுருக்கு</translation> <translation id="9170848237812810038">&செயல்தவிர்</translation> <translation id="932327136139879170">முகப்பு</translation> <translation id="944069440740578670">படிக்காத அறிவிப்புகள்</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 வினாடிக்கு முன்பு}other{# வினாடிகளுக்கு முன்பு}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_te.xtb b/ui/strings/translations/ui_strings_te.xtb index a66effbb..5fbefa55 100644 --- a/ui/strings/translations/ui_strings_te.xtb +++ b/ui/strings/translations/ui_strings_te.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 రోజు క్రితం}other{# రోజుల క్రితం}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 నిమిషం క్రితం}other{# నిమిషాల క్రితం}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1ని}other{#ని}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 రోజు క్రితం}other{# రోజుల క్రితం}}</translation> <translation id="1181037720776840403">తీసివేయండి</translation> <translation id="1243314992276662751">అప్లోడ్ చేయి</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" />ను షేర్ చేయడం సాధ్యపడలేదు</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">ఎడమ నుండి కుడికి</translation> <translation id="1383876407941801731">సెర్చ్</translation> <translation id="1398853756734560583">గరిష్ఠీకరించు</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 నిమిషం క్రితం}other{# నిమిషాల క్రితం}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> షేర్ చేయడం సాధ్యపడలేదు</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 నెల క్రితం}other{# నెలల క్రితం}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 నిమిషం మరియు }other{# నిమిషాలు మరియు }}</translation> <translation id="1643823602425662293">నోటిఫికేషన్</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">చిత్రం</translation> <translation id="4565377596337484307">పాస్వర్డ్ను దాచిపెట్టు</translation> <translation id="4588090240171750605">కుడికి స్క్రోల్ చేయి</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 సంవత్సరం క్రితం}other{# సంవత్సరాల క్రితం}}</translation> <translation id="4724120544754982507">నోటిఫికేషన్ కేంద్రం, <ph name="UNREAD_NOTIFICATION_COUNT" /> చదవని నోటిఫికేషన్లు</translation> <translation id="4729257764711776855">నంబర్</translation> <translation id="4746179598275229723">ఎక్స్టెన్షన్ అన్పిన్ చేయబడింది</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">పంపుతోంది...</translation> <translation id="8876215549894133151">ఆకృతి:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 గంట క్రితం}other{# గంటల క్రితం}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> ఇంటర్నెట్కు కనెక్ట్ చేయబడి ఉందని నిర్ధారించుకోండి.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 సెక.}other{# సెక.}}</translation> <translation id="9059834730836941392">నోటిఫికేషన్ను కుదించు</translation> <translation id="9170848237812810038">&అన్డు</translation> <translation id="932327136139879170">హోమ్</translation> <translation id="944069440740578670">చదవని నోటిఫికేషన్లు</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 సెకను క్రితం}other{# సెకన్ల క్రితం}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_tr.xtb b/ui/strings/translations/ui_strings_tr.xtb index 3d63457..4966ce18 100644 --- a/ui/strings/translations/ui_strings_tr.xtb +++ b/ui/strings/translations/ui_strings_tr.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 gün önce}other{# gün önce}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 dakika önce}other{# dakika önce}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 dk.}other{# dk.}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 gün önce}other{# Gün Önce}}</translation> <translation id="1181037720776840403">Kaldır</translation> <translation id="1243314992276662751">Yükle</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> paylaşılamadı</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Soldan Sağa</translation> <translation id="1383876407941801731">Ara</translation> <translation id="1398853756734560583">Büyüt</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 dakika önce}other{# Dakika Önce}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> paylaşılamıyor</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 Ay Önce}other{# Ay Önce}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 dakika ve }other{# dakika ve }}</translation> <translation id="1643823602425662293">Bildirim</translation> <translation id="169515659049020177">ÜstKrktr</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Resim</translation> <translation id="4565377596337484307">Şifreyi gizle</translation> <translation id="4588090240171750605">Sağa Kaydır</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 Yıl Önce}other{# Yıl Önce}}</translation> <translation id="4724120544754982507">Bildirim Merkezi, <ph name="UNREAD_NOTIFICATION_COUNT" /> okunmamış bildirim</translation> <translation id="4729257764711776855">Numara</translation> <translation id="4746179598275229723">Uzantının sabitlemesi kaldırıldı</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Gönderiliyor...</translation> <translation id="8876215549894133151">Biçim:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 Saat Önce}other{# Saat Önce}}</translation> <translation id="8996630695507351249"><ph name="TARGET_DEVICE_NAME" /> cihazının internete bağlı olduğundan emin olun.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 sn.}other{# sn.}}</translation> <translation id="9059834730836941392">Bildirimi daralt</translation> <translation id="9170848237812810038">&Geri al</translation> <translation id="932327136139879170">Ana Sayfa</translation> <translation id="944069440740578670">Okunmamış Bildirimler</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 Saniye Önce}other{# Saniye Önce}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_uk.xtb b/ui/strings/translations/ui_strings_uk.xtb index 77f4334d..c3c110c8 100644 --- a/ui/strings/translations/ui_strings_uk.xtb +++ b/ui/strings/translations/ui_strings_uk.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 хвилину тому}one{# хвилину тому}few{# хвилини тому}many{# хвилин тому}other{# хвилини тому}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1 хв}one{# хв}few{# хв}many{# хв}other{# хв}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 день тому}one{# день тому}few{# дні тому}many{# днів тому}other{# дня тому}}</translation> <translation id="1181037720776840403">Видалити</translation> <translation id="1243314992276662751">Завантажити</translation> <translation id="1266864766717917324">Не вдалося надіслати: <ph name="CONTENT_TYPE" /></translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">Зліва направо</translation> <translation id="1383876407941801731">Пошук</translation> <translation id="1398853756734560583">Збільшити</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 хвилину тому}one{# хвилину тому}few{# хвилини тому}many{# хвилин тому}other{# хвилини тому}}</translation> <translation id="1450753235335490080">Не вдалося надіслати: <ph name="CONTENT_TYPE" /></translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 місяць тому}one{# місяць тому}few{# місяці тому}many{# місяців тому}other{# місяця тому}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 хвилина та }one{# хвилина та }few{# хвилини та }many{# хвилин і }other{# хвилини та }}</translation> <translation id="1643823602425662293">Сповіщення</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">Зображення</translation> <translation id="4565377596337484307">Сховати пароль</translation> <translation id="4588090240171750605">Прокрутка вправо</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 рік тому}one{# рік тому}few{# роки тому}many{# років тому}other{# року тому}}</translation> <translation id="4724120544754982507">Центр сповіщень, непрочитаних сповіщень: <ph name="UNREAD_NOTIFICATION_COUNT" /></translation> <translation id="4729257764711776855">номер</translation> <translation id="4746179598275229723">Розширення відкріплено</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">Надсилання...</translation> <translation id="8876215549894133151">Формат:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> КБ</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 годину тому}one{# годину тому}few{# години тому}many{# годин тому}other{# години тому}}</translation> <translation id="8996630695507351249">Переконайтеся, що пристрій <ph name="TARGET_DEVICE_NAME" /> підключено до Інтернету.</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 с}one{# с}few{# с}many{# с}other{# с}}</translation> <translation id="9059834730836941392">Згорнути сповіщення</translation> <translation id="9170848237812810038">&Скасувати</translation> <translation id="932327136139879170">Домашня сторінка</translation> <translation id="944069440740578670">Непрочитані сповіщення</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 секунду тому}one{# секунду тому}few{# секунди тому}many{# секунд тому}other{# секунди тому}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/strings/translations/ui_strings_ur.xtb b/ui/strings/translations/ui_strings_ur.xtb index 2766fa85..86e7145 100644 --- a/ui/strings/translations/ui_strings_ur.xtb +++ b/ui/strings/translations/ui_strings_ur.xtb
@@ -6,6 +6,7 @@ <translation id="1127811143501539442">{DAYS,plural, =1{1 دن پہلے}other{# دن پہلے}}</translation> <translation id="1156623771253174079">{SECONDS,plural, =1{1 منٹ پہلے}other{# منٹ پہلے}}</translation> <translation id="1169783199079129864">{MINUTES,plural, =1{1m}other{#m}}</translation> +<translation id="1178017578188974117">{DAYS,plural, =1{1 دن پہلے}other{# دن پہلے}}</translation> <translation id="1181037720776840403">ہٹائیں</translation> <translation id="1243314992276662751">اپ لوڈ کریں</translation> <translation id="1266864766717917324"><ph name="CONTENT_TYPE" /> کا اشتراک نہیں کیا جا سکا</translation> @@ -15,7 +16,9 @@ <translation id="1368832886055348810">بائیں سے دائیں</translation> <translation id="1383876407941801731">تلاش کریں</translation> <translation id="1398853756734560583">بڑا کریں</translation> +<translation id="1432724887402139994">{SECONDS,plural, =1{1 منٹ پہلے}other{# منٹ پہلے}}</translation> <translation id="1450753235335490080"><ph name="CONTENT_TYPE" /> کا اشتراک نہیں کیا جا سکتا</translation> +<translation id="1523230076022876491">{MONTHS,plural, =1{1 ماہ پہلے}other{# ماہ پہلے}}</translation> <translation id="1591184457164800433">{MINUTES,plural, =1{1 منٹ اور }other{# منٹ اور }}</translation> <translation id="1643823602425662293">اطلاع</translation> <translation id="169515659049020177">Shift</translation> @@ -106,6 +109,7 @@ <translation id="4491109536499578614">تصویر</translation> <translation id="4565377596337484307">پاس ورڈ چھپائیں</translation> <translation id="4588090240171750605">دائیں سکرول کریں</translation> +<translation id="4689010477870442157">{YEARS,plural, =1{1 سال پہلے}other{# سال پہلے}}</translation> <translation id="4724120544754982507">اطلاعاتی مرکز، <ph name="UNREAD_NOTIFICATION_COUNT" /> نہ پڑھی ہوئی اطلاعات</translation> <translation id="4729257764711776855">نمبر</translation> <translation id="4746179598275229723">ایکسٹینشن کا پن ہٹایا گیا</translation> @@ -212,10 +216,12 @@ <translation id="8867568208303837180">بھیجا جا رہا ہے...</translation> <translation id="8876215549894133151">فارمیٹ:</translation> <translation id="8901569739625249689"><ph name="QUANTITY" /> KB</translation> +<translation id="8927924178504495502">{HOURS,plural, =1{1 گھنٹہ پہلے}other{# گھنٹے پہلے}}</translation> <translation id="8996630695507351249">یہ یقینی بنائیں کہ <ph name="TARGET_DEVICE_NAME" /> انٹرنیٹ سے منسلک ہے۔</translation> <translation id="9044832324875206639">{SECONDS,plural, =1{1 سیکنڈ}other{# سیکنڈ}}</translation> <translation id="9059834730836941392">اطلاع سُکیڑیں</translation> <translation id="9170848237812810038">&کالعدم کریں</translation> <translation id="932327136139879170">ھوم</translation> <translation id="944069440740578670">نہ پڑھی ہوئی اطلاعات</translation> +<translation id="966963601246348639">{SECONDS,plural, =1{1 سیکنڈ پہلے}other{# سیکنڈ پہلے}}</translation> </translationbundle> \ No newline at end of file
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc index 9bd8b4a..726695b 100644 --- a/ui/views/controls/textfield/textfield.cc +++ b/ui/views/controls/textfield/textfield.cc
@@ -54,6 +54,8 @@ #include "ui/gfx/selection_bound.h" #include "ui/strings/grit/ui_strings.h" #include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/animation/ink_drop.h" +#include "ui/views/animation/ink_drop_highlight.h" #include "ui/views/background.h" #include "ui/views/controls/focus_ring.h" #include "ui/views/controls/focusable_border.h" @@ -242,6 +244,17 @@ FocusRing::Install(this); FocusRing::Get(this)->SetOutsetFocusRingDisabled(); + if (::features::IsChromeRefresh2023()) { + InkDrop::Install(this, std::make_unique<views::InkDropHost>(this)); + InkDrop::Get(this)->SetMode(InkDropHost::InkDropMode::ON); + InkDrop::Get(this)->SetBaseColorCallback(base::BindRepeating( + [](Textfield* host) { + return host->GetColorProvider()->GetColor( + ui::kColorTextfieldOutlineHover); + }, + this)); + } + #if !BUILDFLAG(IS_MAC) // Do not map accelerators on Mac. E.g. They might not reflect custom // keybindings that a user has set. But also on Mac, these commands dispatch
diff --git a/ui/views/interaction/interactive_views_test.cc b/ui/views/interaction/interactive_views_test.cc index 0e5f64f5..4786c63 100644 --- a/ui/views/interaction/interactive_views_test.cc +++ b/ui/views/interaction/interactive_views_test.cc
@@ -94,6 +94,13 @@ base::StringPrintf("NameDescendantView( \"%s\" )", name.data()))); } +InteractiveViewsTestApi::StepBuilder InteractiveViewsTestApi::ScrollIntoView( + ElementSpecifier view) { + return std::move(WithView(view, [](View* v) { + v->ScrollViewToVisible(); + }).SetDescription("ScrollIntoView()")); +} + InteractiveViewsTestApi::StepBuilder InteractiveViewsTestApi::MoveMouseTo( ElementSpecifier reference, RelativePositionSpecifier position) {
diff --git a/ui/views/interaction/interactive_views_test.h b/ui/views/interaction/interactive_views_test.h index b573207..2f199a9 100644 --- a/ui/views/interaction/interactive_views_test.h +++ b/ui/views/interaction/interactive_views_test.h
@@ -197,6 +197,11 @@ R (V::*property)() const, M&& matcher); + // Scrolls `view` into the visible viewport if it is currently scrolled + // outside its container. The view must be otherwise present and visible. + // Has no effect if the view is not in a scroll container. + [[nodiscard]] static StepBuilder ScrollIntoView(ElementSpecifier view); + // Indicates that the center point of the target element should be used for a // mouse move. struct CenterPoint {};
diff --git a/ui/views/interaction/interactive_views_test_unittest.cc b/ui/views/interaction/interactive_views_test_unittest.cc index 89b62a9..e22c795 100644 --- a/ui/views/interaction/interactive_views_test_unittest.cc +++ b/ui/views/interaction/interactive_views_test_unittest.cc
@@ -14,6 +14,7 @@ #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/expect_call_in_scope.h" #include "ui/views/controls/button/label_button.h" +#include "ui/views/controls/scroll_view.h" #include "ui/views/controls/tabbed_pane/tabbed_pane.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/layout/flex_layout_view.h" @@ -30,6 +31,8 @@ DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kButtonsId); DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kButton1Id); DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kTabbedPaneId); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kScrollChild1Id); +DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kScrollChild2Id); constexpr char16_t kButton1Caption[] = u"Button 1"; constexpr char16_t kButton2Caption[] = u"Button 2"; constexpr char16_t kTab1Title[] = u"Tab 1"; @@ -76,7 +79,25 @@ Builder<LabelButton>() .CopyAddressTo(&button2_) .SetText(kButton2Caption) - .SetCallback(button2_callback_.Get()))); + .SetCallback(button2_callback_.Get())), + Builder<ScrollView>() + .CopyAddressTo(&scroll_) + .SetPreferredSize(gfx::Size(100, 90)) + .SetVerticalScrollBarMode( + ScrollView::ScrollBarMode::kEnabled) + .SetContents( + Builder<FlexLayoutView>() + .SetOrientation(LayoutOrientation::kVertical) + .SetSize(gfx::Size(100, 200)) + .AddChildren( + Builder<View>() + .SetProperty(kElementIdentifierKey, + kScrollChild1Id) + .SetPreferredSize(gfx::Size(100, 100)), + Builder<View>() + .SetProperty(kElementIdentifierKey, + kScrollChild2Id) + .SetPreferredSize(gfx::Size(100, 100))))); // Create and show the test widget. widget_ = CreateTestWidget(); @@ -98,6 +119,7 @@ buttons_ = nullptr; button1_ = nullptr; button2_ = nullptr; + scroll_ = nullptr; InteractiveViewsTest::TearDown(); } @@ -111,6 +133,7 @@ base::raw_ptr<FlexLayoutView> buttons_; base::raw_ptr<LabelButton> button1_; base::raw_ptr<LabelButton> button2_; + base::raw_ptr<ScrollView> scroll_; ButtonCallbackMock button1_callback_; ButtonCallbackMock button2_callback_; }; @@ -387,4 +410,19 @@ 0U, Do(incorrect.Get()), Do(correct.Get()))); } +TEST_F(InteractiveViewsTestTest, ScrollIntoView) { + const auto visible = [this](View* view) { + const gfx::Rect bounds = view->GetBoundsInScreen(); + const gfx::Rect scroll_bounds = scroll_->GetBoundsInScreen(); + return bounds.Intersects(scroll_bounds); + }; + + RunTestSequence(CheckView(kScrollChild1Id, visible, true), + CheckView(kScrollChild2Id, visible, false), + ScrollIntoView(kScrollChild2Id), + CheckView(kScrollChild2Id, visible, true), + ScrollIntoView(kScrollChild1Id), + CheckView(kScrollChild1Id, visible, true)); +} + } // namespace views::test
diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc index e38fc5ae..402d006 100644 --- a/ui/views/widget/root_view.cc +++ b/ui/views/widget/root_view.cc
@@ -694,6 +694,7 @@ } void RootView::MaybeNotifyGestureHandlerBeforeReplacement() { +#if defined(USE_AURA) ui::GestureRecognizer* gesture_recognizer = (gesture_handler_ && widget_ ? widget_->GetGestureRecognizer() : nullptr); if (!gesture_recognizer) @@ -704,6 +705,7 @@ return; gesture_recognizer->SendSynthesizedEndEvents(gesture_consumer); +#endif } void RootView::SetMouseAndGestureHandler(View* new_handler) {